aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Guillermo Albers Raviola <thomas@thomaslabs.org>2026-01-16 23:02:32 +0100
committerThomas Guillermo Albers Raviola <thomas@thomaslabs.org>2026-01-16 23:02:32 +0100
commit6b8af9cf83851c075c6c9514b1deaa931c2b19a4 (patch)
tree428986b49c32e21d3f7a3c2dfa41858ae0153209
Initial commit
-rw-r--r--07-july/Makefile20
-rw-r--r--07-july/resources/shaders/passShader.frag13
-rw-r--r--07-july/resources/shaders/passShader.vert15
-rw-r--r--07-july/resources/shaders/shader.frag53
-rw-r--r--07-july/resources/shaders/shader.vert38
-rw-r--r--07-july/resources/shaders/terrainShader.frag73
-rw-r--r--07-july/resources/shaders/terrainShader.vert37
-rw-r--r--07-july/resources/stall.obj1696
-rw-r--r--07-july/resources/textures/blendmap.pngbin0 -> 477441 bytes
-rw-r--r--07-july/resources/textures/gato.pngbin0 -> 5393444 bytes
-rw-r--r--07-july/resources/textures/heightmap.pngbin0 -> 26460 bytes
-rw-r--r--07-july/resources/textures/soil1.pngbin0 -> 89463 bytes
-rw-r--r--07-july/resources/textures/soil2.pngbin0 -> 39820 bytes
-rw-r--r--07-july/resources/textures/soil3.pngbin0 -> 75458 bytes
-rw-r--r--07-july/resources/textures/soil4.pngbin0 -> 90142 bytes
-rw-r--r--07-july/resources/textures/spaceship.pngbin0 -> 360 bytes
-rw-r--r--07-july/resources/textures/stall.pngbin0 -> 50242 bytes
-rw-r--r--07-july/src/camera.c85
-rw-r--r--07-july/src/camera.h32
-rw-r--r--07-july/src/game.h42
-rw-r--r--07-july/src/graphics/shaders.c134
-rw-r--r--07-july/src/graphics/shaders.h46
-rw-r--r--07-july/src/graphics/video.c14
-rw-r--r--07-july/src/graphics/video.h7
-rw-r--r--07-july/src/graphics/window.c44
-rw-r--r--07-july/src/graphics/window.h20
-rw-r--r--07-july/src/gui/gui_renderer.c0
-rw-r--r--07-july/src/gui/gui_renderer.h9
-rw-r--r--07-july/src/gui/widget.c17
-rw-r--r--07-july/src/gui/widget.h13
-rw-r--r--07-july/src/input.c21
-rw-r--r--07-july/src/input.h11
-rw-r--r--07-july/src/light.c1
-rw-r--r--07-july/src/light.h13
-rw-r--r--07-july/src/main.c227
-rw-r--r--07-july/src/math/math_util.c10
-rw-r--r--07-july/src/math/math_util.h9
-rw-r--r--07-july/src/math/matrix4x4.c180
-rw-r--r--07-july/src/math/matrix4x4.h35
-rw-r--r--07-july/src/math/vector2f.c60
-rw-r--r--07-july/src/math/vector2f.h20
-rw-r--r--07-july/src/math/vector3f.c65
-rw-r--r--07-july/src/math/vector3f.h20
-rw-r--r--07-july/src/math/vector4f.c70
-rw-r--r--07-july/src/math/vector4f.h20
-rw-r--r--07-july/src/player.c62
-rw-r--r--07-july/src/player.h17
-rw-r--r--07-july/src/renderer/entity.c18
-rw-r--r--07-july/src/renderer/entity.h20
-rw-r--r--07-july/src/renderer/renderer.c98
-rw-r--r--07-july/src/renderer/renderer.h15
-rw-r--r--07-july/src/renderer/shape.c302
-rw-r--r--07-july/src/renderer/shape.h25
-rw-r--r--07-july/src/terrain.c163
-rw-r--r--07-july/src/terrain.h27
-rw-r--r--07-july/src/texture.c47
-rw-r--r--07-july/src/texture.h18
-rw-r--r--07-july/src/util/util.c49
-rw-r--r--07-july/src/util/util.h19
-rw-r--r--07-july/src/util/util_time.c52
-rw-r--r--07-july/src/util/util_time.h13
-rw-r--r--07-july/src/vertex.h21
-rw-r--r--08-august/Makefile20
-rw-r--r--08-august/resources/barrel.obj4970
-rw-r--r--08-august/resources/boulder.obj1166
-rw-r--r--08-august/resources/crate.obj396
-rw-r--r--08-august/resources/plane3.obj55
-rw-r--r--08-august/resources/shaders/passShader.frag13
-rw-r--r--08-august/resources/shaders/passShader.vert15
-rw-r--r--08-august/resources/shaders/shader.frag58
-rw-r--r--08-august/resources/shaders/shader.vert50
-rw-r--r--08-august/resources/shaders/skyboxShader.frag11
-rw-r--r--08-august/resources/shaders/skyboxShader.vert12
-rw-r--r--08-august/resources/shaders/terrainShader.frag72
-rw-r--r--08-august/resources/shaders/terrainShader.vert39
-rw-r--r--08-august/resources/stall.obj1696
-rw-r--r--08-august/resources/textures/back.pngbin0 -> 767145 bytes
-rw-r--r--08-august/resources/textures/barrel.pngbin0 -> 60199 bytes
-rw-r--r--08-august/resources/textures/blendmap.pngbin0 -> 477441 bytes
-rw-r--r--08-august/resources/textures/bottom.pngbin0 -> 5794 bytes
-rw-r--r--08-august/resources/textures/boulder.pngbin0 -> 1719286 bytes
-rw-r--r--08-august/resources/textures/boulderNormal.pngbin0 -> 1652902 bytes
-rw-r--r--08-august/resources/textures/bricks2.pngbin0 -> 495054 bytes
-rw-r--r--08-august/resources/textures/bricks2_normal.pngbin0 -> 110314 bytes
-rw-r--r--08-august/resources/textures/default_normal_map.pngbin0 -> 144 bytes
-rw-r--r--08-august/resources/textures/front.pngbin0 -> 695595 bytes
-rw-r--r--08-august/resources/textures/heightmap.pngbin0 -> 26460 bytes
-rw-r--r--08-august/resources/textures/left.pngbin0 -> 620667 bytes
-rw-r--r--08-august/resources/textures/normal_map.pngbin0 -> 71394 bytes
-rw-r--r--08-august/resources/textures/right.pngbin0 -> 680985 bytes
-rw-r--r--08-august/resources/textures/soil1.pngbin0 -> 89463 bytes
-rw-r--r--08-august/resources/textures/soil2.pngbin0 -> 39820 bytes
-rw-r--r--08-august/resources/textures/soil3.pngbin0 -> 75458 bytes
-rw-r--r--08-august/resources/textures/soil4.pngbin0 -> 90142 bytes
-rw-r--r--08-august/resources/textures/stall.pngbin0 -> 50242 bytes
-rw-r--r--08-august/resources/textures/top.pngbin0 -> 350027 bytes
-rw-r--r--08-august/src/camera.c85
-rw-r--r--08-august/src/camera.h32
-rw-r--r--08-august/src/game.h46
-rw-r--r--08-august/src/graphics/shaders.c135
-rw-r--r--08-august/src/graphics/shaders.h51
-rw-r--r--08-august/src/graphics/window.c44
-rw-r--r--08-august/src/graphics/window.h20
-rw-r--r--08-august/src/gui/gui_renderer.c0
-rw-r--r--08-august/src/gui/gui_renderer.h9
-rw-r--r--08-august/src/gui/widget.c17
-rw-r--r--08-august/src/gui/widget.h13
-rw-r--r--08-august/src/input.c21
-rw-r--r--08-august/src/input.h11
-rw-r--r--08-august/src/light.c1
-rw-r--r--08-august/src/light.h13
-rw-r--r--08-august/src/main.c290
-rw-r--r--08-august/src/math/math_util.c10
-rw-r--r--08-august/src/math/math_util.h9
-rw-r--r--08-august/src/math/matrix4x4.c325
-rw-r--r--08-august/src/math/matrix4x4.h40
-rw-r--r--08-august/src/math/vector2f.c54
-rw-r--r--08-august/src/math/vector2f.h19
-rw-r--r--08-august/src/math/vector3f.c59
-rw-r--r--08-august/src/math/vector3f.h19
-rw-r--r--08-august/src/math/vector4f.c53
-rw-r--r--08-august/src/math/vector4f.h18
-rw-r--r--08-august/src/player.c62
-rw-r--r--08-august/src/player.h17
-rw-r--r--08-august/src/renderer/entity.c18
-rw-r--r--08-august/src/renderer/entity.h20
-rw-r--r--08-august/src/renderer/renderer.c147
-rw-r--r--08-august/src/renderer/renderer.h18
-rw-r--r--08-august/src/renderer/shape.c335
-rw-r--r--08-august/src/renderer/shape.h26
-rw-r--r--08-august/src/renderer/skybox.h16
-rw-r--r--08-august/src/terrain.c163
-rw-r--r--08-august/src/terrain.h27
-rw-r--r--08-august/src/texture.c71
-rw-r--r--08-august/src/texture.h10
-rw-r--r--08-august/src/util/util.c87
-rw-r--r--08-august/src/util/util.h25
-rw-r--r--08-august/src/util/util_time.c52
-rw-r--r--08-august/src/util/util_time.h13
-rw-r--r--08-august/src/vertex.h17
-rw-r--r--09-september/Draw.c77
-rw-r--r--09-september/LoadResources.c136
-rw-r--r--09-september/Makefile45
-rw-r--r--09-september/ProcessInput.c47
-rw-r--r--09-september/game.h54
-rw-r--r--09-september/main.c61
-rw-r--r--09-september/player.c66
-rw-r--r--09-september/player.h17
-rw-r--r--09-september/resources/barrel.obj4970
-rwxr-xr-x09-september/resources/boulder.obj1166
-rw-r--r--09-september/resources/crate.obj396
-rw-r--r--09-september/resources/cube.mtl13
-rw-r--r--09-september/resources/cube.obj50
-rw-r--r--09-september/resources/plane3.obj55
-rw-r--r--09-september/resources/shaders/particlesShader.frag12
-rw-r--r--09-september/resources/shaders/particlesShader.vert18
-rw-r--r--09-september/resources/shaders/passShader.frag11
-rw-r--r--09-september/resources/shaders/passShader.vert12
-rw-r--r--09-september/resources/shaders/shader.frag56
-rw-r--r--09-september/resources/shaders/shader.vert52
-rw-r--r--09-september/resources/shaders/shadow_shader.frag5
-rw-r--r--09-september/resources/shaders/shadow_shader.vert10
-rw-r--r--09-september/resources/shaders/skyboxShader.frag11
-rw-r--r--09-september/resources/shaders/skyboxShader.vert12
-rw-r--r--09-september/resources/shaders/terrainShader.frag72
-rw-r--r--09-september/resources/shaders/terrainShader.vert39
-rw-r--r--09-september/resources/stall.obj1696
-rw-r--r--09-september/resources/textures/back.pngbin0 -> 767145 bytes
-rw-r--r--09-september/resources/textures/barrel.pngbin0 -> 60199 bytes
-rw-r--r--09-september/resources/textures/blendmap.pngbin0 -> 477441 bytes
-rw-r--r--09-september/resources/textures/bottom.pngbin0 -> 5794 bytes
-rwxr-xr-x09-september/resources/textures/boulder.pngbin0 -> 1719286 bytes
-rwxr-xr-x09-september/resources/textures/boulderNormal.pngbin0 -> 1652902 bytes
-rw-r--r--09-september/resources/textures/bricks.pngbin0 -> 553596 bytes
-rw-r--r--09-september/resources/textures/bricks2.pngbin0 -> 495054 bytes
-rw-r--r--09-september/resources/textures/bricks2_normal.pngbin0 -> 110314 bytes
-rw-r--r--09-september/resources/textures/bricks_normal.pngbin0 -> 690725 bytes
-rw-r--r--09-september/resources/textures/default_normal_map.pngbin0 -> 144 bytes
-rwxr-xr-x09-september/resources/textures/fire.pngbin0 -> 67525 bytes
-rw-r--r--09-september/resources/textures/front.pngbin0 -> 695595 bytes
-rw-r--r--09-september/resources/textures/heightmap.pngbin0 -> 26460 bytes
-rw-r--r--09-september/resources/textures/left.pngbin0 -> 620667 bytes
-rw-r--r--09-september/resources/textures/normal_map.pngbin0 -> 71394 bytes
-rwxr-xr-x09-september/resources/textures/particleAtlas.pngbin0 -> 20153 bytes
-rwxr-xr-x09-september/resources/textures/particleStar.pngbin0 -> 4427 bytes
-rw-r--r--09-september/resources/textures/right.pngbin0 -> 680985 bytes
-rwxr-xr-x09-september/resources/textures/smoke.pngbin0 -> 136492 bytes
-rw-r--r--09-september/resources/textures/soil1.pngbin0 -> 89463 bytes
-rw-r--r--09-september/resources/textures/soil2.pngbin0 -> 39820 bytes
-rw-r--r--09-september/resources/textures/soil3.pngbin0 -> 75458 bytes
-rw-r--r--09-september/resources/textures/soil4.pngbin0 -> 90142 bytes
-rw-r--r--09-september/resources/textures/stall.pngbin0 -> 50242 bytes
-rw-r--r--09-september/resources/textures/top.pngbin0 -> 350027 bytes
-rw-r--r--09-september/tomcat/gui/widget.c12
-rw-r--r--09-september/tomcat/gui/widget.h13
-rw-r--r--09-september/tomcat/input.c21
-rw-r--r--09-september/tomcat/input.h11
-rw-r--r--09-september/tomcat/math/math_util.c10
-rw-r--r--09-september/tomcat/math/math_util.h8
-rw-r--r--09-september/tomcat/math/matrix4x4.c326
-rw-r--r--09-september/tomcat/math/matrix4x4.h39
-rw-r--r--09-september/tomcat/math/vector.c177
-rw-r--r--09-september/tomcat/math/vector.h47
-rw-r--r--09-september/tomcat/not_in_use/fbo.c108
-rw-r--r--09-september/tomcat/not_in_use/fbo.h35
-rw-r--r--09-september/tomcat/particles/particles.c153
-rw-r--r--09-september/tomcat/particles/particles.h62
-rw-r--r--09-september/tomcat/renderer/camera.c95
-rw-r--r--09-september/tomcat/renderer/camera.h32
-rw-r--r--09-september/tomcat/renderer/entity.c33
-rw-r--r--09-september/tomcat/renderer/mesh.c146
-rw-r--r--09-september/tomcat/renderer/mesh.h22
-rw-r--r--09-september/tomcat/renderer/model.c314
-rw-r--r--09-september/tomcat/renderer/model.h21
-rw-r--r--09-september/tomcat/renderer/renderer.c430
-rw-r--r--09-september/tomcat/renderer/renderer.h86
-rw-r--r--09-september/tomcat/renderer/renderer_types.h47
-rw-r--r--09-september/tomcat/renderer/shader.c187
-rw-r--r--09-september/tomcat/renderer/shader.h59
-rw-r--r--09-september/tomcat/renderer/texture.c188
-rw-r--r--09-september/tomcat/renderer/texture.h30
-rw-r--r--09-september/tomcat/renderer/vertex.h15
-rw-r--r--09-september/tomcat/renderer/window.c49
-rw-r--r--09-september/tomcat/renderer/window.h20
-rw-r--r--09-september/tomcat/shared.h13
-rw-r--r--09-september/tomcat/terrain.c155
-rw-r--r--09-september/tomcat/terrain.h27
-rw-r--r--09-september/tomcat/util/array.c102
-rw-r--r--09-september/tomcat/util/array.h23
-rw-r--r--09-september/tomcat/util/str.c121
-rw-r--r--09-september/tomcat/util/str.h29
-rw-r--r--09-september/tomcat/util/util.c138
-rw-r--r--09-september/tomcat/util/util.h27
-rw-r--r--09-september/tomcat/util/util_time.c52
-rw-r--r--09-september/tomcat/util/util_time.h13
-rw-r--r--README.md18
-rw-r--r--manifest.scm5
237 files changed, 27905 insertions, 0 deletions
diff --git a/07-july/Makefile b/07-july/Makefile
new file mode 100644
index 0000000..4619f3c
--- /dev/null
+++ b/07-july/Makefile
@@ -0,0 +1,20 @@
+SRC=$(wildcard src/*.c)\
+ $(wildcard src/math/*.c)\
+ $(wildcard src/graphics/*.c)\
+ $(wildcard src/renderer/*.c)\
+ $(wildcard src/util/*.c)
+OBJ=$(SRC:%.c=%.o)
+TARGET=game
+LDFLAGS=-lSDL2 -lGL -lGLEW -lm -lSDL2_image
+
+%.o : %.c
+ $(CC) -c $< -o $@
+
+$(TARGET) : $(OBJ)
+ $(CC) $(OBJ) -o $(TARGET) $(LDFLAGS)
+
+all : $(TARGET)
+
+.PHONY : clean
+clean:
+ rm -rf $(TARGET) $(OBJ)
diff --git a/07-july/resources/shaders/passShader.frag b/07-july/resources/shaders/passShader.frag
new file mode 100644
index 0000000..4c8dec1
--- /dev/null
+++ b/07-july/resources/shaders/passShader.frag
@@ -0,0 +1,13 @@
+#version 420
+
+in vec4 Fragment_Color;
+in vec2 Fragment_Uv;
+
+out vec4 out_color;
+
+uniform sampler2D Texture;
+
+void main()
+{
+ out_color = Fragment_Color * texture(Texture, Fragment_Uv);
+}
diff --git a/07-july/resources/shaders/passShader.vert b/07-july/resources/shaders/passShader.vert
new file mode 100644
index 0000000..964d13e
--- /dev/null
+++ b/07-july/resources/shaders/passShader.vert
@@ -0,0 +1,15 @@
+#version 420
+
+in layout(location=0) vec2 Model_Position;
+
+uniform mat4 Matrix_totalTransform;
+
+out vec4 Fragment_Color;
+out vec2 Fragment_Uv;
+
+void main()
+{
+ Fragment_Color = vec4(1.0, 1.0, 1.0, 1.0);
+ Fragment_Uv = vec2( (Model_Position.x + 1.0)/2.0, 1.0 - (Model_Position.y + 1.0)/2.0 );
+ gl_Position = Matrix_totalTransform * vec4(Model_Position, 0.0, 1.0);
+}
diff --git a/07-july/resources/shaders/shader.frag b/07-july/resources/shaders/shader.frag
new file mode 100644
index 0000000..406d004
--- /dev/null
+++ b/07-july/resources/shaders/shader.frag
@@ -0,0 +1,53 @@
+#version 420
+
+in vec3 World_Normal;
+in vec2 Fragment_UV;
+in vec4 Fragment_Color;
+in vec3 toLightVector[4];
+in vec3 toEyeVector;
+
+out vec4 out_color;
+
+uniform vec4 lightColor[4];
+uniform vec3 attenuation[4];
+uniform sampler2D Texture;
+
+void main()
+{
+ vec4 totalDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
+ vec4 totalSpecular = vec4(0.0, 0.0, 0.0, 1.0);
+
+ for(int i = 0; i < 4; i++)
+ {
+ /*Light Attenuation*/
+ float dist = length(toLightVector[i]);
+ float attFactor = attenuation[i].x + (attenuation[i].y * dist) + (attenuation[i].z * dist * dist);
+ vec3 unitToLightVector = normalize(toLightVector[i]);
+
+ /*Diffuse lighting*/
+
+ /*La intensidad es el cos entre la normal y el vector hacia la luz*/
+ float brightness = dot(unitToLightVector, normalize(World_Normal));
+ /*No queremos luz negativa ni mayor a 1*/
+ brightness = max(brightness, 0.0);
+ totalDiffuse = totalDiffuse + (brightness * lightColor[i]) / attFactor;
+
+ /* Specular lighting */
+
+ /* Reflejamos el vector hacia la luz (su inverso) en la normal */
+ vec3 Vector_ReflectedLight = reflect(-unitToLightVector, World_Normal);
+
+ /* La luz especular es el cos del angulo entre el vector hacia el ojo y la luz reflectada en la normal */
+ float specularity = clamp( dot(Vector_ReflectedLight, toEyeVector), 0, 1 );
+ float reflectivity = 1;
+ /* Que tan grande es el specular highlight */
+ specularity = pow(specularity, 10);
+ totalSpecular = totalSpecular + clamp( reflectivity * specularity * lightColor[i], 0, 1) / attFactor;
+ }
+
+ /* Ambient Light */
+ totalDiffuse = max(totalDiffuse, 0.2);
+
+ /* Juntamos todo para el color final*/
+ out_color = totalDiffuse * texture(Texture, Fragment_UV) + totalSpecular;
+}
diff --git a/07-july/resources/shaders/shader.vert b/07-july/resources/shaders/shader.vert
new file mode 100644
index 0000000..b8f10e6
--- /dev/null
+++ b/07-july/resources/shaders/shader.vert
@@ -0,0 +1,38 @@
+#version 420
+
+in layout(location=0) vec3 Model_Position;
+in layout(location=1) vec4 in_color;
+in layout(location=2) vec2 Texture_UV;
+in layout(location=3) vec3 Model_Normal;
+
+uniform mat4 Matrix_totalTransform;
+uniform mat4 Matrix_modelToWorld;
+
+uniform vec3 lightPosition[4];
+uniform vec3 World_eyePosition;
+
+out vec2 Fragment_UV;
+out vec3 World_Normal;
+out vec4 Fragment_Color;
+out vec3 toLightVector[4];
+out vec3 toEyeVector;
+
+void main()
+{
+ vec3 World_Position = vec3(Matrix_modelToWorld * vec4(Model_Position, 1.0));
+
+ for(int i = 0; i < 4; i++)
+ {
+ /* vector que apunta hacia la luz*/
+ toLightVector[i] = lightPosition[i] - World_Position;
+ }
+ /* Vector hacia el ojo*/
+ toEyeVector = normalize(World_eyePosition - World_Position);
+
+ gl_Position = Matrix_totalTransform * vec4(Model_Position, 1.0);
+ /*We add a 0 on the vec4 so we can remove the translation from the matrix
+ (WE DONT WANT THE NORMAL TO BE TRANSLATED) */
+ World_Normal = vec3(Matrix_modelToWorld * vec4(Model_Normal, 0.0));
+ Fragment_UV = vec2(Texture_UV.x, 1 - Texture_UV.y); /*Invert y axis*/
+ Fragment_Color = in_color;
+}
diff --git a/07-july/resources/shaders/terrainShader.frag b/07-july/resources/shaders/terrainShader.frag
new file mode 100644
index 0000000..be9c773
--- /dev/null
+++ b/07-july/resources/shaders/terrainShader.frag
@@ -0,0 +1,73 @@
+#version 420
+
+in vec2 Fragment_UV;
+in vec3 World_Normal;
+in vec4 Fragment_Color;
+in vec3 toLightVector[4];
+in vec3 toEyeVector;
+
+out vec4 out_color;
+
+uniform vec4 lightColor[4];
+uniform vec3 attenuation[4];
+uniform vec3 World_eyePosition;
+
+uniform sampler2D Texture_Background;
+uniform sampler2D Texture_R;
+uniform sampler2D Texture_G;
+uniform sampler2D Texture_B;
+uniform sampler2D Texture_BlendMap;
+
+void main()
+{
+ vec4 totalDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
+ vec4 totalSpecular = vec4(0.0, 0.0, 0.0, 1.0);
+
+ for(int i = 0; i < 4; i++)
+ {
+ /*Light Attenuation*/
+ float dist = length(toLightVector[i]);
+ float attFactor = attenuation[i].x + (attenuation[i].y * dist) + (attenuation[i].z * dist * dist);
+ vec3 unitToLightVector = normalize(toLightVector[i]);
+ /*Diffuse lighting*/
+
+ /*La intensidad es el cos entre la normal y el vector hacia la luz*/
+ float brightness = dot(unitToLightVector, normalize(World_Normal));
+ /*No queremos luz negativa ni mayor a 1*/
+ brightness = max(brightness, 0.0);
+ totalDiffuse = totalDiffuse + (brightness * lightColor[i]) / attFactor;
+
+ /* Specular lighting */
+
+ /* Reflejamos el vector hacia la luz (su inverso) en la normal */
+ vec3 Vector_ReflectedLight = reflect(-unitToLightVector, World_Normal);
+
+ /* La luz especular es el cos del angulo entre el vector hacia el ojo y la luz reflectada en la normal */
+ float specularity = clamp( dot(Vector_ReflectedLight, toEyeVector), 0, 1 );
+ float reflectivity = 1;
+ /* Que tan grande es el specular highlight */
+ specularity = pow(specularity, 10);
+ totalSpecular = totalSpecular + clamp( reflectivity * specularity * lightColor[i], 0, 1) / attFactor;
+ }
+
+ /* Ambient Light */
+ totalDiffuse = max(totalDiffuse, 0.2);
+
+ /*Terrain color*/
+ /*The color of the current fragment from the blendmap*/
+ vec4 blendMapColor = texture(Texture_BlendMap, Fragment_UV);
+ /*We want the background color when we have black in the blend map*/
+ float backTextureAmount = 1 - (blendMapColor.r + blendMapColor.g + blendMapColor.b);
+ /*So we dont lose image quality from the tiles textures (Fragment_UV make the terrain look less HD)*/
+ vec2 Tiled_UV = Fragment_UV * 50.0f;
+ /*We get the color of each map tile (soil1, soil2, etc)*/
+ vec4 backgroundTextureColor = texture(Texture_Background, Tiled_UV) * backTextureAmount;
+ vec4 rTextureColor = texture(Texture_R, Tiled_UV) * blendMapColor.r;
+ vec4 gTextureColor = texture(Texture_G, Tiled_UV) * blendMapColor.g;
+ vec4 bTextureColor = texture(Texture_B, Tiled_UV) * blendMapColor.b;
+ /*We mix them corresponding with the blendmap*/
+ vec4 totalColor = backgroundTextureColor + rTextureColor + gTextureColor + bTextureColor;
+
+ /*Our final color for the fragment*/
+ out_color = totalDiffuse * totalColor + totalSpecular;
+}
diff --git a/07-july/resources/shaders/terrainShader.vert b/07-july/resources/shaders/terrainShader.vert
new file mode 100644
index 0000000..6abdddb
--- /dev/null
+++ b/07-july/resources/shaders/terrainShader.vert
@@ -0,0 +1,37 @@
+#version 420
+
+in layout(location=0) vec3 Model_Position;
+in layout(location=1) vec4 in_color;
+in layout(location=2) vec2 Texture_UV;
+in layout(location=3) vec3 Model_Normal;
+
+uniform mat4 Matrix_totalTransform;
+uniform mat4 Matrix_modelToWorld;
+
+uniform vec3 lightPosition[4];
+uniform vec3 World_eyePosition;
+
+out vec2 Fragment_UV;
+out vec3 World_Normal;
+out vec4 Fragment_Color;
+out vec3 toLightVector[4];
+out vec3 toEyeVector;
+
+void main()
+{
+ vec3 World_Position = vec3(Matrix_modelToWorld * vec4(Model_Position, 1.0));
+
+ for(int i = 0; i < 4; i++)
+ {
+ /* vector que apunta hacia la luz*/
+ toLightVector[i] = lightPosition[i] - World_Position;
+ }
+ /* Vector hacia el ojo*/
+ toEyeVector = normalize(World_eyePosition - World_Position);
+
+ gl_Position = Matrix_totalTransform * vec4(Model_Position, 1.0);
+ /*We add a 0 on the vec4 so we can remove the translation from the matrix
+ (WE DONT WANT THE NORMAL TO BE TRANSLATED) */
+ World_Normal = vec3(Matrix_modelToWorld * vec4(Model_Normal, 0.0));
+ Fragment_UV = vec2(Texture_UV.x, 1 - Texture_UV.y); /*Invert y axis*/
+}
diff --git a/07-july/resources/stall.obj b/07-july/resources/stall.obj
new file mode 100644
index 0000000..210f90b
--- /dev/null
+++ b/07-july/resources/stall.obj
@@ -0,0 +1,1696 @@
+# Blender v2.67 (sub 0) OBJ File: 'stall.blend'
+# www.blender.org
+o Cube
+v 3.227124 -0.065127 -1.000000
+v 3.227124 -0.065127 1.000000
+v -3.227125 -0.065127 1.000000
+v -3.227123 -0.065127 -1.000000
+v 3.227126 1.934873 -0.999999
+v 3.227122 1.934873 1.000001
+v -3.227126 1.934873 1.000000
+v -3.227124 1.934873 -1.000000
+v 3.558682 1.924610 -1.102740
+v 3.558677 1.924610 1.511141
+v -3.558681 1.924610 1.511140
+v -3.558679 1.924610 -1.102740
+v 3.558682 2.083301 -1.102740
+v 3.558677 2.083301 1.511141
+v -3.558681 2.083301 1.511140
+v -3.558679 2.083301 -1.102740
+v 3.227124 -0.065127 -1.000000
+v 3.227126 1.934873 -0.999999
+v 3.227126 1.934873 -0.999999
+v 3.227126 1.934873 -0.999999
+v 3.227124 -0.065127 1.000000
+v 3.227122 1.934873 1.000001
+v 3.227122 1.934873 1.000001
+v 3.227122 1.934873 1.000001
+v -3.227125 -0.065127 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227123 -0.065127 -1.000000
+v -3.227124 1.934873 -1.000000
+v -3.227124 1.934873 -1.000000
+v -3.227124 1.934873 -1.000000
+v 3.558682 1.924610 -1.102740
+v 3.558677 1.924610 1.511141
+v 3.558677 1.924610 1.511141
+v 3.558677 1.924610 1.511141
+v -3.558681 1.924610 1.511140
+v -3.558681 1.924610 1.511140
+v -3.558681 1.924610 1.511140
+v -3.558679 1.924610 -1.102740
+v -3.558679 1.924610 -1.102740
+v 3.558682 2.083301 -1.102740
+v 3.558677 2.083301 1.511141
+v 3.558677 2.083301 1.511141
+v -3.558679 2.083301 -1.102740
+v -3.558679 2.083301 -1.102740
+v -3.558681 2.083301 1.511140
+v -3.558681 2.083301 1.511140
+v -3.975889 5.109764 -0.703744
+v -3.975889 -0.001038 -0.703744
+v 4.035702 -0.001038 -0.703744
+v 4.035702 5.109764 -0.703744
+v 4.136954 -0.001038 -0.645286
+v 4.136954 5.109764 -0.645286
+v 4.136954 -0.001038 -0.528370
+v 4.136954 5.109764 -0.528370
+v 4.035702 -0.001038 -0.469912
+v 4.035702 5.109764 -0.469912
+v 3.934450 -0.001038 -0.528370
+v 3.934450 5.109764 -0.528370
+v 3.934450 -0.001038 -0.645286
+v 3.934450 5.109764 -0.645286
+v -3.874637 -0.001038 -0.645286
+v -3.874637 5.109764 -0.645286
+v -3.874637 -0.001038 -0.528370
+v -3.874637 5.109764 -0.528370
+v -3.975889 -0.001038 -0.469912
+v -3.975889 5.109764 -0.469912
+v -4.077142 -0.001038 -0.528370
+v -4.077142 5.109764 -0.528370
+v -4.077142 -0.001038 -0.645286
+v -4.077142 5.109764 -0.645286
+v -4.518063 -0.025686 3.868089
+v -4.518063 -0.025686 3.580229
+v 4.401308 -0.025686 3.580229
+v 4.401308 -0.025686 3.868089
+v -4.518063 3.617208 3.868089
+v -4.518063 3.617208 3.580229
+v 4.401308 3.617208 3.580229
+v 4.401308 3.617208 3.868089
+v -4.518063 4.016335 3.710218
+v -4.518063 3.792680 3.528995
+v 4.401308 3.792680 3.528995
+v 4.401308 4.016335 3.710218
+v -4.518063 4.490533 3.232638
+v -4.518063 4.260199 3.059984
+v 4.401308 4.260199 3.059984
+v 4.401308 4.490533 3.232638
+v -4.518063 5.251897 -0.749037
+v -4.518063 5.051156 -0.716959
+v 4.401308 5.051156 -0.716959
+v 4.401308 5.251897 -0.749037
+v -4.518063 4.733114 -1.423512
+v -4.518063 4.593092 -1.289192
+v 4.401308 4.593092 -1.289192
+v 4.401308 4.733114 -1.423512
+v -3.874637 5.109764 -0.528370
+v -3.874637 -0.001038 -0.528370
+v 3.934450 5.109764 -0.528370
+v 3.934450 -0.001038 -0.528370
+v 3.077599 2.080430 -1.292466
+v 3.486084 2.080430 0.000798
+v 1.220706 2.080430 0.716330
+v 0.812221 2.080430 -0.576934
+v 3.077599 2.174018 -1.292466
+v 3.486084 2.174018 0.000798
+v 1.220706 2.174018 0.716330
+v 0.812221 2.174018 -0.576934
+v 0.866186 2.174018 -0.491315
+v 1.241163 2.174018 0.695864
+v 1.353509 2.174018 0.660380
+v 0.978532 2.174018 -0.526800
+v 0.866186 2.080430 -0.491315
+v 1.241163 2.080430 0.695864
+v 1.353509 2.080430 0.660380
+v 0.978532 2.080430 -0.526800
+v 0.866186 2.545954 -0.491315
+v 1.241163 2.545954 0.695864
+v 1.353509 2.545954 0.660380
+v 0.978532 2.545954 -0.526800
+v 0.844122 2.174018 -0.561169
+v 0.956468 2.174018 -0.596654
+v 0.844122 2.080430 -0.561169
+v 0.956468 2.080430 -0.596654
+v 0.844122 2.545954 -0.561169
+v 0.956468 2.545954 -0.596654
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.545954 -1.169330
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.545954 -1.239183
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.545954 -0.043953
+v 3.077599 2.174018 -1.292466
+v 3.077599 2.174018 -1.292466
+v 3.486084 2.174018 0.000798
+v 3.486084 2.174018 0.000798
+v 3.486084 2.080430 0.000798
+v 3.486084 2.080430 0.000798
+v 3.077599 2.080430 -1.292466
+v 3.077599 2.080430 -1.292466
+v 1.220706 2.174018 0.716330
+v 1.220706 2.174018 0.716330
+v 1.220706 2.080430 0.716330
+v 1.220706 2.080430 0.716330
+v 0.812221 2.174018 -0.576934
+v 0.812221 2.174018 -0.576934
+v 0.812221 2.080430 -0.576934
+v 0.812221 2.080430 -0.576934
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.866186 2.080430 -0.491315
+v 0.866186 2.080430 -0.491315
+v 0.866186 2.080430 -0.491315
+v 0.844122 2.080430 -0.561169
+v 0.844122 2.080430 -0.561169
+v 1.241163 2.080430 0.695864
+v 1.241163 2.080430 0.695864
+v 0.866186 2.174018 -0.491315
+v 0.866186 2.174018 -0.491315
+v 0.866186 2.174018 -0.491315
+v 1.241163 2.174018 0.695864
+v 1.241163 2.174018 0.695864
+v 1.241163 2.174018 0.695864
+v 1.353509 2.080430 0.660380
+v 1.353509 2.080430 0.660380
+v 1.353509 2.174018 0.660380
+v 1.353509 2.174018 0.660380
+v 1.353509 2.174018 0.660380
+v 0.978532 2.174018 -0.526800
+v 0.978532 2.174018 -0.526800
+v 0.978532 2.174018 -0.526800
+v 0.866186 2.545954 -0.491315
+v 0.866186 2.545954 -0.491315
+v 0.866186 2.545954 -0.491315
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 1.241163 2.545954 0.695864
+v 1.241163 2.545954 0.695864
+v 1.353509 2.545954 0.660380
+v 1.353509 2.545954 0.660380
+v 0.956468 2.080430 -0.596654
+v 0.956468 2.080430 -0.596654
+v 0.956468 2.080430 -0.596654
+v 0.844122 2.174018 -0.561169
+v 0.844122 2.174018 -0.561169
+v 0.844122 2.174018 -0.561169
+v 0.956468 2.174018 -0.596654
+v 0.956468 2.174018 -0.596654
+v 0.956468 2.174018 -0.596654
+v 0.844122 2.545954 -0.561169
+v 0.844122 2.545954 -0.561169
+v 0.956468 2.545954 -0.596654
+v 0.956468 2.545954 -0.596654
+v 0.956468 2.545954 -0.596654
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.545954 -1.239183
+v 2.990720 2.545954 -1.239183
+v 2.990720 2.545954 -1.239183
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.174018 -1.264470
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.545954 -0.043953
+v 3.456284 2.545954 -0.043953
+v 1.510815 2.137595 0.037730
+v 1.349035 2.290844 -0.140367
+v 1.591464 2.172901 -0.233612
+v 1.784266 2.190338 -0.024086
+v 1.660990 2.319058 0.198652
+v 1.392003 2.381173 0.126783
+v 1.522500 2.438301 -0.312256
+v 1.791486 2.376186 -0.240387
+v 1.834455 2.466515 0.026763
+v 1.592026 2.584458 0.120008
+v 1.399223 2.567021 -0.089519
+v 1.672674 2.619764 -0.151334
+v 2.497889 2.137595 -0.044384
+v 2.336109 2.290844 -0.222481
+v 2.578538 2.172901 -0.315726
+v 2.771340 2.190338 -0.106200
+v 2.648064 2.319058 0.116538
+v 2.379078 2.381173 0.044669
+v 2.509574 2.438301 -0.394370
+v 2.778560 2.376186 -0.322502
+v 2.821529 2.466515 -0.055351
+v 2.579100 2.584458 0.037894
+v 2.386297 2.567021 -0.171633
+v 2.659748 2.619764 -0.233449
+v 2.006507 2.137595 -0.316138
+v 1.844727 2.290844 -0.494235
+v 2.087156 2.172901 -0.587479
+v 2.279958 2.190338 -0.377954
+v 2.156682 2.319058 -0.155216
+v 1.887695 2.381173 -0.227085
+v 2.018192 2.438301 -0.666124
+v 2.287179 2.376186 -0.594255
+v 2.330147 2.466515 -0.327105
+v 2.087718 2.584458 -0.233860
+v 1.894915 2.567021 -0.443387
+v 2.168366 2.619764 -0.505202
+v 2.833736 2.426006 -0.583306
+v 2.684991 2.845636 -1.079525
+v 2.757221 2.366194 -0.574572
+v 2.608476 2.785824 -1.070790
+v 2.749703 2.246832 -0.600498
+v 2.600958 2.666462 -1.096717
+v 2.818701 2.187281 -0.635161
+v 2.669955 2.606911 -1.131379
+v 2.895216 2.247093 -0.643896
+v 2.746471 2.666724 -1.140114
+v 2.902734 2.366456 -0.617969
+v 2.753989 2.786086 -1.114187
+v 3.047219 2.426006 -0.650736
+v 2.898475 2.845636 -1.146955
+v 2.970704 2.366194 -0.642001
+v 2.821959 2.785824 -1.138220
+v 2.963186 2.246832 -0.667928
+v 2.814442 2.666462 -1.164147
+v 3.032184 2.187281 -0.702591
+v 2.883439 2.606911 -1.198809
+v 3.108700 2.247093 -0.711326
+v 2.959954 2.666724 -1.207544
+v 3.116217 2.366456 -0.685399
+v 2.967472 2.786086 -1.181617
+v -1.172064 2.145742 0.102815
+v -1.274777 2.145742 0.043514
+v -1.274777 2.075523 -0.065804
+v -1.274777 2.111542 -0.065804
+v -1.077392 2.075523 0.048156
+v -1.077392 2.111542 0.048156
+v -1.077392 2.075523 0.276076
+v -1.077392 2.111542 0.276076
+v -1.274777 2.075523 0.390036
+v -1.274777 2.111542 0.390036
+v -1.472162 2.075523 0.276076
+v -1.472162 2.111542 0.276076
+v -1.472162 2.075523 0.048156
+v -1.472162 2.111542 0.048156
+v -1.172064 2.145742 0.221418
+v -1.274777 2.145742 0.280719
+v -1.377490 2.145742 0.221418
+v -1.377490 2.145742 0.102815
+v -1.238618 2.209867 0.141240
+v -1.274777 2.209867 0.120363
+v -1.238618 2.209867 0.182993
+v -1.274777 2.209867 0.203870
+v -1.310936 2.209867 0.182993
+v -1.310936 2.209867 0.141240
+v -1.238618 2.579231 0.141240
+v -1.274777 2.579231 0.120363
+v -1.238618 2.579231 0.182993
+v -1.274777 2.579231 0.203870
+v -1.310936 2.579231 0.182993
+v -1.310936 2.579231 0.141240
+v -1.188232 2.648486 0.112150
+v -1.274777 2.648486 0.062183
+v -1.188232 2.648486 0.212083
+v -1.274777 2.648486 0.262050
+v -1.361322 2.648486 0.212083
+v -1.361322 2.648486 0.112150
+v -1.124406 2.740827 0.075299
+v -1.274777 2.740827 -0.011518
+v -1.124406 2.740827 0.248933
+v -1.274777 2.740827 0.335750
+v -1.425149 2.740827 0.248933
+v -1.425149 2.740827 0.075299
+v -1.080861 2.912683 0.050158
+v -1.274777 2.912683 -0.061799
+v -1.080861 2.912683 0.274074
+v -1.274777 2.912683 0.386032
+v -1.468694 2.912683 0.274074
+v -1.468694 2.912683 0.050158
+v -1.080861 3.117886 0.050158
+v -1.274777 3.117886 -0.061799
+v -1.080861 3.117886 0.274074
+v -1.274777 3.117886 0.386032
+v -1.468694 3.117886 0.274074
+v -1.468694 3.117886 0.050158
+v -1.099921 3.127254 0.059737
+v -1.278856 3.127254 -0.043571
+v -1.099921 3.127254 0.266354
+v -1.278856 3.127254 0.369662
+v -1.457792 3.127254 0.266354
+v -1.457792 3.127254 0.059737
+v -1.278856 2.680948 0.163046
+v -1.922013 2.145742 -0.643475
+v -2.024726 2.145742 -0.702776
+v -2.024726 2.075523 -0.812093
+v -2.024726 2.111542 -0.812093
+v -1.827342 2.075523 -0.698134
+v -1.827342 2.111542 -0.698134
+v -1.827342 2.075523 -0.470213
+v -1.827342 2.111542 -0.470213
+v -2.024726 2.075523 -0.356253
+v -2.024726 2.111542 -0.356253
+v -2.222111 2.075523 -0.470213
+v -2.222111 2.111542 -0.470213
+v -2.222111 2.075523 -0.698134
+v -2.222111 2.111542 -0.698134
+v -1.922013 2.145742 -0.524872
+v -2.024726 2.145742 -0.465571
+v -2.127439 2.145742 -0.524872
+v -2.127439 2.145742 -0.643475
+v -1.988567 2.209867 -0.605050
+v -2.024726 2.209867 -0.625927
+v -1.988567 2.209867 -0.563297
+v -2.024726 2.209867 -0.542420
+v -2.060886 2.209867 -0.563297
+v -2.060886 2.209867 -0.605050
+v -1.988567 2.579231 -0.605050
+v -2.024726 2.579231 -0.625927
+v -1.988567 2.579231 -0.563297
+v -2.024726 2.579231 -0.542420
+v -2.060886 2.579231 -0.563297
+v -2.060886 2.579231 -0.605050
+v -1.938182 2.648486 -0.634140
+v -2.024726 2.648486 -0.684107
+v -1.938182 2.648486 -0.534207
+v -2.024726 2.648486 -0.484240
+v -2.111271 2.648486 -0.534207
+v -2.111271 2.648486 -0.634140
+v -1.874355 2.740827 -0.670991
+v -2.024726 2.740827 -0.757808
+v -1.874355 2.740827 -0.497356
+v -2.024726 2.740827 -0.410539
+v -2.175098 2.740827 -0.497356
+v -2.175098 2.740827 -0.670991
+v -1.830810 2.912683 -0.696131
+v -2.024726 2.912683 -0.808089
+v -1.830810 2.912683 -0.472216
+v -2.024726 2.912683 -0.360258
+v -2.218643 2.912683 -0.472216
+v -2.218643 2.912683 -0.696131
+v -1.830810 3.117886 -0.696131
+v -2.024726 3.117886 -0.808089
+v -1.830810 3.117886 -0.472216
+v -2.024726 3.117886 -0.360258
+v -2.218643 3.117886 -0.472216
+v -2.218643 3.117886 -0.696131
+v -1.849871 3.127254 -0.686552
+v -2.028805 3.127254 -0.789860
+v -1.849871 3.127254 -0.479936
+v -2.028805 3.127254 -0.376628
+v -2.207741 3.127254 -0.479936
+v -2.207741 3.127254 -0.686552
+v -2.028805 2.680948 -0.583244
+v -3.080822 2.145742 0.848455
+v -3.183535 2.145742 0.789153
+v -3.183535 2.075523 0.679836
+v -3.183535 2.111542 0.679836
+v -2.986151 2.075523 0.793796
+v -2.986151 2.111542 0.793796
+v -2.986151 2.075523 1.021716
+v -2.986151 2.111542 1.021716
+v -3.183535 2.075523 1.135676
+v -3.183535 2.111542 1.135676
+v -3.380919 2.075523 1.021716
+v -3.380919 2.111542 1.021716
+v -3.380919 2.075523 0.793796
+v -3.380919 2.111542 0.793796
+v -3.080822 2.145742 0.967057
+v -3.183535 2.145742 1.026358
+v -3.286248 2.145742 0.967057
+v -3.286248 2.145742 0.848455
+v -3.147376 2.209867 0.886879
+v -3.183535 2.209867 0.866003
+v -3.147376 2.209867 0.928633
+v -3.183535 2.209867 0.949509
+v -3.219694 2.209867 0.928633
+v -3.219694 2.209867 0.886879
+v -3.147376 2.579231 0.886879
+v -3.183535 2.579231 0.866003
+v -3.147376 2.579231 0.928633
+v -3.183535 2.579231 0.949509
+v -3.219694 2.579231 0.928633
+v -3.219694 2.579231 0.886879
+v -3.096991 2.648486 0.857789
+v -3.183535 2.648486 0.807823
+v -3.096991 2.648486 0.957723
+v -3.183535 2.648486 1.007689
+v -3.270080 2.648486 0.957723
+v -3.270080 2.648486 0.857789
+v -3.033164 2.740827 0.820939
+v -3.183534 2.740827 0.734122
+v -3.033164 2.740827 0.994573
+v -3.183534 2.740827 1.081390
+v -3.333907 2.740827 0.994573
+v -3.333907 2.740827 0.820939
+v -2.989619 2.912683 0.795798
+v -3.183534 2.912683 0.683840
+v -2.989619 2.912683 1.019714
+v -3.183534 2.912683 1.131672
+v -3.377452 2.912683 1.019714
+v -3.377452 2.912683 0.795798
+v -2.989619 3.117886 0.795798
+v -3.183534 3.117886 0.683840
+v -2.989619 3.117886 1.019714
+v -3.183534 3.117886 1.131672
+v -3.377452 3.117886 1.019714
+v -3.377452 3.117886 0.795798
+v -3.008679 3.127254 0.805377
+v -3.187614 3.127254 0.702069
+v -3.008679 3.127254 1.011994
+v -3.187614 3.127254 1.115302
+v -3.366550 3.127254 1.011994
+v -3.366550 3.127254 0.805377
+v -3.187614 2.680948 0.908685
+v 4.401308 3.617208 3.580229
+v 4.401308 -0.025686 3.580229
+v 4.401308 3.792680 3.528995
+v 4.401308 4.260199 3.059984
+v 4.401308 5.051156 -0.716959
+v 4.401308 4.593092 -1.289192
+vt 0.905299 0.942320
+vt 0.533523 0.942320
+vt 0.905299 0.919749
+vt 0.890688 0.972537
+vt 0.606224 0.972537
+vt 0.905301 0.957852
+vt 0.863038 0.512341
+vt 0.863038 0.667779
+vt 0.707599 0.667779
+vt 0.915821 0.578064
+vt 0.915821 0.985620
+vt 0.508265 0.985620
+vt 0.707599 0.979117
+vt 0.707599 0.823679
+vt 0.863038 0.979117
+vt 0.863038 0.668010
+vt 0.863038 0.823448
+vt 0.707599 0.823448
+vt 0.606226 0.942743
+vt 0.890679 0.942743
+vt 0.533523 0.957429
+vt 0.700713 0.854870
+vt 0.985176 0.854869
+vt 0.905300 0.896755
+vt 0.636824 0.703297
+vt 0.921287 0.703296
+vt 0.935900 0.776011
+vt 0.535960 0.512341
+vt 0.707368 0.512341
+vt 0.535960 0.715489
+vt 0.533523 0.896755
+vt 0.905300 0.919326
+vt 0.999789 0.869555
+vt 0.999789 0.892126
+vt 0.599209 0.831876
+vt 0.912899 0.831876
+vt 0.599209 0.854446
+vt 0.710700 0.504901
+vt 0.710700 0.981434
+vt 0.702383 0.504933
+vt 0.699950 0.504898
+vt 0.699800 0.981445
+vt 0.691482 0.981475
+vt 0.691633 0.504928
+vt 0.680581 0.981472
+vt 0.702383 0.981467
+vt 0.691482 0.504933
+vt 0.674847 0.504998
+vt 0.674847 0.981532
+vt 0.663946 0.981532
+vt 0.680731 0.504924
+vt 0.672263 0.981502
+vt 0.691482 0.981467
+vt 0.683164 0.504966
+vt 0.683164 0.981499
+vt 0.672414 0.504954
+vt 0.664096 0.504984
+vt 0.708268 0.504868
+vt 0.708118 0.981416
+vt 0.719169 0.504872
+vt 0.719019 0.981419
+vt 0.719017 0.504868
+vt 0.719018 0.981402
+vt 0.657579 0.583164
+vt 0.894968 0.583164
+vt 0.894968 0.599545
+vt 0.746642 0.950201
+vt 0.875496 0.950201
+vt 0.875496 0.966582
+vt 0.894968 0.624058
+vt 0.657579 0.624058
+vt 0.894968 0.607677
+vt 0.875496 0.983360
+vt 0.746642 0.983360
+vt 0.875496 0.966979
+vt 0.528328 0.755451
+vt 0.765717 0.755451
+vt 0.765717 0.884305
+vt 0.528328 0.755055
+vt 0.528328 0.517666
+vt 0.657182 0.517666
+vt 0.875496 0.755055
+vt 0.657579 0.755055
+vt 0.657579 0.689953
+vt 0.746642 0.983757
+vt 0.964561 0.983757
+vt 0.964561 0.990147
+vt 0.888717 0.600889
+vt 0.888718 0.607280
+vt 0.875895 0.600889
+vt 0.957855 0.949804
+vt 0.739939 0.949804
+vt 0.957855 0.933423
+vt 0.895502 0.534047
+vt 0.889111 0.534047
+vt 0.889111 0.517666
+vt 0.528328 0.950201
+vt 0.746245 0.950201
+vt 0.746245 0.966582
+vt 0.657579 0.600889
+vt 0.875499 0.600890
+vt 0.875499 0.607280
+vt 0.765717 0.884702
+vt 0.765717 0.891093
+vt 0.752895 0.891092
+vt 0.889006 0.755451
+vt 0.895396 0.755451
+vt 0.895396 0.820553
+vt 0.657579 0.517666
+vt 0.875496 0.517666
+vt 0.657579 0.582767
+vt 0.895502 0.582767
+vt 0.889112 0.582767
+vt 0.895502 0.566386
+vt 0.882219 0.755451
+vt 0.888609 0.755451
+vt 0.882219 0.820553
+vt 0.881822 0.886448
+vt 0.881822 0.899271
+vt 0.766114 0.899271
+vt 0.888715 0.517666
+vt 0.888715 0.582767
+vt 0.875892 0.517666
+vt 0.881822 0.820950
+vt 0.881822 0.886052
+vt 0.766114 0.886052
+vt 0.895231 0.641232
+vt 0.895231 0.657614
+vt 0.882409 0.641232
+vt 0.901828 0.891002
+vt 0.889006 0.891002
+vt 0.889006 0.886449
+vt 0.893665 0.738673
+vt 0.893665 0.755055
+vt 0.889112 0.738673
+vt 0.984897 0.624454
+vt 0.984897 0.640836
+vt 0.869190 0.624454
+vt 0.984897 0.673175
+vt 0.984897 0.689556
+vt 0.869190 0.689556
+vt 0.881822 0.755451
+vt 0.881822 0.820553
+vt 0.766114 0.755451
+vt 0.984897 0.659956
+vt 0.984897 0.672778
+vt 0.869190 0.672778
+vt 0.875892 0.755055
+vt 0.875893 0.689953
+vt 0.888715 0.689953
+vt 0.869190 0.657614
+vt 0.869190 0.641232
+vt 0.882012 0.641232
+vt 0.657579 0.689556
+vt 0.657579 0.624454
+vt 0.868793 0.624454
+vt 0.893559 0.820950
+vt 0.893559 0.886052
+vt 0.889006 0.820950
+vt 0.889111 0.544658
+vt 0.901934 0.544658
+vt 0.889111 0.549212
+vt 0.528328 0.949804
+vt 0.528328 0.884702
+vt 0.739542 0.949804
+vt 0.882219 0.886051
+vt 0.882219 0.820950
+vt 0.886772 0.820950
+vt 0.889111 0.565989
+vt 0.889112 0.549608
+vt 0.893665 0.549608
+vt 0.528328 0.976483
+vt 0.528328 0.971929
+vt 0.739540 0.971929
+vt 0.528328 0.971533
+vt 0.528328 0.966979
+vt 0.739540 0.966979
+vt 0.739939 0.916248
+vt 0.739939 0.899867
+vt 0.951152 0.916248
+vt 0.739939 0.933026
+vt 0.739939 0.916645
+vt 0.951152 0.916645
+vt 0.288599 0.586905
+vt 0.263686 0.622200
+vt 0.255994 0.605150
+vt 0.308778 0.621073
+vt 0.416738 0.556495
+vt 0.402006 0.581949
+vt 0.401971 0.548587
+vt 0.410397 0.513377
+vt 0.328955 0.603326
+vt 0.288644 0.660434
+vt 0.256022 0.650593
+vt 0.361632 0.586905
+vt 0.401971 0.598571
+vt 0.381766 0.626266
+vt 0.329010 0.596747
+vt 0.336674 0.625139
+vt 0.328982 0.648769
+vt 0.401943 0.644014
+vt 0.328982 0.642190
+vt 0.423079 0.513377
+vt 0.431506 0.548587
+vt 0.361587 0.660434
+vt 0.431470 0.581949
+vt 0.058872 0.514455
+vt 0.033648 0.579711
+vt 0.060007 0.526490
+vt 0.057959 0.590632
+vt 0.101326 0.507643
+vt 0.098280 0.547934
+vt 0.058446 0.652807
+vt 0.059718 0.615219
+vt 0.102501 0.569863
+vt 0.125087 0.582568
+vt 0.097551 0.631974
+vt 0.100043 0.648601
+vt 0.288599 0.513377
+vt 0.263686 0.548671
+vt 0.255994 0.531621
+vt 0.308778 0.547544
+vt 0.431506 0.630024
+vt 0.416774 0.655477
+vt 0.416738 0.622116
+vt 0.425165 0.586905
+vt 0.328955 0.529797
+vt 0.288644 0.586905
+vt 0.256022 0.577064
+vt 0.361632 0.513377
+vt 0.401971 0.525042
+vt 0.381766 0.552738
+vt 0.329010 0.523218
+vt 0.336674 0.551611
+vt 0.328982 0.575240
+vt 0.401943 0.570485
+vt 0.328982 0.568661
+vt 0.408312 0.586905
+vt 0.416738 0.622115
+vt 0.401971 0.630023
+vt 0.361588 0.586905
+vt 0.416703 0.655477
+vt 0.373139 0.405595
+vt 0.266846 0.405755
+vt 0.372364 0.382592
+vt 0.265891 0.382261
+vt 0.380766 0.365849
+vt 0.274024 0.364779
+vt 0.390004 0.372272
+vt 0.283166 0.370938
+vt 0.390970 0.395797
+vt 0.284319 0.394978
+vt 0.382504 0.412368
+vt 0.276129 0.412304
+vt 0.387980 0.449935
+vt 0.281849 0.450540
+vt 0.387016 0.426417
+vt 0.280686 0.426474
+vt 0.395511 0.409928
+vt 0.288902 0.409221
+vt 0.405043 0.417158
+vt 0.298351 0.416223
+vt 0.406207 0.441227
+vt 0.299725 0.440869
+vt 0.397635 0.457505
+vt 0.291436 0.457923
+vt 0.125099 0.179064
+vt 0.140481 0.179064
+vt 0.135498 0.187381
+vt 0.147570 0.174628
+vt 0.118010 0.174628
+vt 0.162351 0.169957
+vt 0.162351 0.174628
+vt 0.148172 0.179064
+vt 0.138205 0.187381
+vt 0.110516 0.153916
+vt 0.102583 0.168696
+vt 0.102583 0.154518
+vt 0.147570 0.169957
+vt 0.127375 0.187381
+vt 0.130082 0.187381
+vt 0.130082 0.235286
+vt 0.118010 0.169957
+vt 0.103229 0.174628
+vt 0.094650 0.124355
+vt 0.102583 0.109575
+vt 0.098455 0.131444
+vt 0.103229 0.169957
+vt 0.110516 0.124355
+vt 0.106711 0.131444
+vt 0.117408 0.179064
+vt 0.094650 0.153916
+vt 0.098455 0.146827
+vt 0.127375 0.235286
+vt 0.126310 0.244268
+vt 0.138205 0.235286
+vt 0.135498 0.235286
+vt 0.119829 0.244268
+vt 0.110270 0.256245
+vt 0.139270 0.244268
+vt 0.144050 0.256245
+vt 0.121530 0.256245
+vt 0.147311 0.278534
+vt 0.145751 0.244268
+vt 0.155310 0.256245
+vt 0.118269 0.278534
+vt 0.147311 0.305148
+vt 0.101543 0.235066
+vt 0.072502 0.235066
+vt 0.073503 0.236281
+vt 0.103749 0.278534
+vt 0.118269 0.305148
+vt 0.161831 0.278534
+vt 0.161831 0.305148
+vt 0.102583 0.110094
+vt 0.110377 0.124615
+vt 0.109611 0.125616
+vt 0.110377 0.153656
+vt 0.102583 0.168177
+vt 0.109611 0.152414
+vt 0.116063 0.235066
+vt 0.100301 0.236281
+vt 0.057981 0.235066
+vt 0.086902 0.178396
+vt 0.060104 0.236281
+vt 0.113699 0.236281
+vt 0.102583 0.123753
+vt 0.533523 0.919749
+vt 0.533523 0.957852
+vt 0.707599 0.512341
+vt 0.508265 0.578064
+vt 0.863038 0.823679
+vt 0.707599 0.668010
+vt 0.905292 0.957429
+vt 0.622211 0.776012
+vt 0.707368 0.715489
+vt 0.533523 0.919326
+vt 0.912899 0.854447
+vt 0.663946 0.504998
+vt 0.657579 0.599545
+vt 0.746642 0.966582
+vt 0.657579 0.607677
+vt 0.746642 0.966979
+vt 0.528328 0.884305
+vt 0.657182 0.755055
+vt 0.875496 0.689953
+vt 0.746642 0.990146
+vt 0.875896 0.607280
+vt 0.739939 0.933423
+vt 0.895502 0.517666
+vt 0.528328 0.966582
+vt 0.657579 0.607279
+vt 0.752895 0.884702
+vt 0.889006 0.820553
+vt 0.875496 0.582767
+vt 0.889111 0.566386
+vt 0.888609 0.820553
+vt 0.766114 0.886448
+vt 0.875892 0.582767
+vt 0.766114 0.820950
+vt 0.882409 0.657614
+vt 0.901828 0.886449
+vt 0.889112 0.755055
+vt 0.869190 0.640836
+vt 0.869190 0.673175
+vt 0.766114 0.820553
+vt 0.869190 0.659956
+vt 0.888715 0.755055
+vt 0.882012 0.657614
+vt 0.868793 0.689556
+vt 0.889006 0.886052
+vt 0.901934 0.549212
+vt 0.739542 0.884702
+vt 0.886772 0.886051
+vt 0.893665 0.565989
+vt 0.739540 0.976483
+vt 0.739540 0.971533
+vt 0.951152 0.899867
+vt 0.951152 0.933026
+vt 0.106711 0.146827
+vt 0.103749 0.305148
+vt 0.102419 0.112218
+vt 0.102419 0.165813
+vt 0.176655 0.902678
+vt 0.177195 0.893095
+vt 0.017048 0.894869
+vt 0.175049 0.789769
+vt 0.175642 0.911615
+vt 0.019454 0.789409
+vt 0.172299 0.777935
+vt 0.019488 0.777616
+vt 0.194225 0.892858
+vt 0.188367 0.779011
+vt 0.220229 0.892814
+vt 0.185989 0.902579
+vt 0.183371 0.911603
+vt 0.212963 0.780571
+vt 0.379965 0.900404
+vt 0.183492 0.789933
+vt 0.210776 0.911687
+vt 0.218479 0.901319
+vt 0.367145 0.793339
+vt 0.391357 0.794319
+vt 0.213720 0.792797
+vt 0.370492 0.908704
+vt 0.367608 0.800840
+vt 0.406722 0.906137
+vt 0.410730 0.918007
+vt 0.394868 0.799588
+vt 0.378842 0.909853
+vt 0.013364 0.906932
+vt 0.017669 0.909263
+vt 0.396496 0.908115
+vn -1.000000 0.000000 0.000000
+vn 0.030915 -0.999512 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn -0.999969 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.030915 -0.999512 0.000000
+vn 0.000000 -0.995025 0.099399
+vn 0.707327 -0.135258 -0.693808
+vn 0.000000 -0.999786 -0.020051
+vn 0.000000 0.999969 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.707083 0.000000 -0.707083
+vn 0.000000 -0.191351 -0.981506
+vn 0.000000 0.000000 -0.999969
+vn -0.866024 0.000000 0.499985
+vn 0.866024 0.000000 -0.499985
+vn 0.866024 0.000000 0.499985
+vn -0.866024 0.000000 -0.499985
+vn -0.499985 0.000000 0.866024
+vn 0.499985 0.000000 0.866024
+vn 0.953551 0.000000 -0.301187
+vn 0.301187 0.000000 0.953551
+vn -0.953551 0.000000 0.301187
+vn -0.301187 0.000000 -0.953551
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -0.999969 0.000000
+vn 0.301157 0.000000 0.953551
+vn -0.953551 0.000000 0.301157
+vn 0.953551 0.000000 -0.301157
+vn -0.298288 -0.888577 0.348430
+vn -0.894589 -0.323740 -0.307993
+vn -0.001007 -0.758446 -0.651692
+vn -0.736198 0.009186 0.676656
+vn 0.709586 -0.694174 0.120579
+vn 0.255226 -0.219733 0.941557
+vn -0.709586 0.694174 -0.120579
+vn -0.255226 0.219733 -0.941557
+vn 0.736198 -0.009186 -0.676656
+vn 0.894589 0.323740 0.307993
+vn 0.001007 0.758446 0.651692
+vn 0.298288 0.888577 -0.348430
+vn 0.251289 0.471114 0.845485
+vn -0.060549 0.978484 -0.197150
+vn -0.463698 0.077792 0.882565
+vn -0.814905 0.548326 -0.187719
+vn -0.577136 -0.550829 0.602893
+vn -0.871090 -0.080203 -0.484451
+vn 0.060549 -0.978484 0.197150
+vn -0.251289 -0.471114 -0.845485
+vn 0.814905 -0.548326 0.187719
+vn 0.463698 -0.077792 -0.882565
+vn 0.871090 0.080203 0.484451
+vn 0.577136 0.550829 -0.602893
+vn 0.369091 0.904630 0.213080
+vn 0.369091 0.904630 -0.213080
+vn 0.756615 0.486465 -0.436842
+vn -0.741844 0.515915 -0.428297
+vn -0.741844 0.515915 0.428297
+vn -0.369091 0.904630 -0.213080
+vn 0.000000 -0.609973 -0.792383
+vn 0.000000 0.515915 -0.856624
+vn 0.741844 0.515915 -0.428297
+vn 0.000000 0.904630 -0.426191
+vn 0.000000 0.486465 -0.873653
+vn 0.686239 -0.609973 -0.396191
+vn 0.741844 0.515915 0.428297
+vn 0.000000 0.486465 0.873653
+vn 0.756615 0.486465 0.436842
+vn 0.799799 -0.383435 0.461776
+vn 0.686239 -0.609973 0.396191
+vn 0.000000 0.515915 0.856624
+vn -0.369091 0.904630 0.213080
+vn 0.000000 -0.609973 0.792383
+vn -0.686239 -0.609973 0.396191
+vn -0.686239 -0.609973 -0.396191
+vn 0.000000 0.904630 0.426191
+vn -0.756615 0.486465 -0.436842
+vn 0.000000 -0.383435 0.923551
+vn 0.671407 -0.631581 0.387646
+vn 0.000000 -0.383435 -0.923551
+vn -0.756615 0.486465 0.436842
+vn -0.799799 -0.383435 0.461776
+vn 0.799799 -0.383435 -0.461776
+vn -0.799799 -0.383435 -0.461776
+vn 0.000000 -0.631581 0.775292
+vn 0.000000 -0.437361 0.899258
+vn 0.671407 -0.631581 -0.387646
+vn -0.671407 -0.631581 -0.387646
+vn -0.671407 -0.631581 0.387646
+vn -0.778771 -0.437361 -0.449629
+vn -0.778771 -0.437361 0.449629
+vn -0.857967 -0.135868 -0.495346
+vn 0.000000 -0.631581 -0.775292
+vn 0.000000 -0.437361 -0.899258
+vn 0.778771 -0.437361 -0.449629
+vn -0.857967 -0.135868 0.495346
+vn -0.779931 0.421735 -0.462386
+vn 0.778771 -0.437361 0.449629
+vn 0.857967 -0.135868 0.495346
+vn 0.857967 -0.135868 -0.495346
+vn -0.787530 0.409497 0.460494
+vn -0.009552 0.999756 -0.018677
+vn 0.000000 -0.135868 0.990722
+vn 0.765709 0.473769 0.434980
+vn 0.000000 -0.135868 -0.990722
+vn 0.010376 0.459670 -0.887997
+vn 0.761406 0.479019 -0.436720
+vn 0.012177 0.444380 0.895718
+vn -0.108676 0.993500 -0.033326
+vn -0.111728 0.992309 0.052675
+vn -0.008026 0.998871 0.046297
+vn -0.051759 0.997345 -0.051119
+vn -0.043825 0.995819 0.080111
+vn 0.000000 0.486465 -0.873684
+vn 0.671438 -0.631581 0.387646
+vn 0.756615 0.486496 -0.436842
+vn 0.756615 0.486496 0.436842
+vn -0.051790 0.997345 -0.051088
+vn 0.667287 0.139409 0.731620
+vn 0.707083 0.000000 0.707083
+vn -0.740379 -0.095126 -0.665365
+vn 0.000000 -0.141545 -0.989929
+vn -0.707083 0.000000 -0.707083
+vn -0.667287 0.139409 0.731620
+vn -0.707083 0.000000 0.707083
+vn 0.663778 0.411603 0.624439
+vn -0.663778 0.411603 0.624439
+vn 0.646870 0.674490 0.355785
+vn 0.000000 -0.510300 -0.859981
+vn -0.646870 0.674490 0.355785
+vn 0.625416 0.759117 -0.180425
+vn -0.767602 -0.327036 -0.551164
+vn 0.000000 -0.879910 -0.475112
+vn 0.999969 0.000000 0.000000
+vn -0.625416 0.759117 -0.180425
+vn -0.571825 0.061678 -0.818018
+vn -0.777123 -0.553728 -0.298990
+vn 0.000000 -0.972655 0.232154
+vn -0.816797 -0.561113 0.133915
+vn 0.571825 0.061678 -0.818018
+vn 0.726402 -0.475723 -0.495926
+vn -0.582202 -0.811274 -0.053255
+vn 0.000000 -0.780663 0.624897
+s 1
+f 41/1/1 38/2/1 45/3/1
+f 31/4/2 27/5/2 40/6/2
+f 1/7/3 5/8/3 6/9/3
+f 21/10/4 22/11/4 7/12/4
+f 25/13/1 26/14/5 29/15/1
+f 18/16/6 17/17/6 4/18/6
+f 23/19/7 19/20/7 10/21/7
+f 20/22/8 32/23/8 33/24/9
+f 28/25/10 24/26/10 34/27/10
+f 13/28/11 16/29/12 14/30/12
+f 35/31/3 33/24/9 42/32/13
+f 33/24/9 12/33/14 46/34/15
+f 39/35/4 36/36/4 48/37/4
+f 67/38/4 68/39/4 69/40/16
+f 51/41/6 52/42/6 54/43/17
+f 53/44/17 54/43/17 56/45/18
+f 69/40/16 70/46/16 71/47/19
+f 63/48/17 64/49/17 66/50/3
+f 55/51/18 56/45/18 58/52/4
+f 71/47/19 72/53/19 50/54/6
+f 50/54/6 49/55/6 64/49/17
+f 57/56/4 58/52/4 59/57/20
+f 61/58/19 62/59/19 51/41/6
+f 100/60/1 99/61/1 61/58/19
+f 98/62/21 97/63/21 68/39/4
+f 105/64/22 106/65/22 102/66/22
+f 147/67/23 107/68/23 103/69/23
+f 153/70/24 108/71/24 155/72/24
+f 157/73/25 145/74/25 159/75/25
+f 152/76/26 150/77/26 156/78/27
+f 158/79/12 154/80/12 148/81/12
+f 180/82/22 183/83/22 189/84/22
+f 116/85/27 115/86/27 114/87/26
+f 117/88/12 120/89/12 125/90/11
+f 110/91/24 109/92/24 170/93/24
+f 111/94/28 175/95/28 171/96/28
+f 112/97/22 182/98/22 179/99/22
+f 186/100/12 118/101/12 119/102/12
+f 162/103/26 165/104/26 123/105/27
+f 176/106/28 181/107/28 196/108/28
+f 172/109/24 177/110/24 187/111/24
+f 121/112/25 122/113/25 168/114/25
+f 203/115/25 200/116/25 208/117/25
+f 209/118/12 190/119/12 218/120/12
+f 173/121/29 188/122/29 201/123/29
+f 192/124/23 184/125/23 127/126/23
+f 167/127/29 174/128/29 169/129/29
+f 214/130/26 222/131/26 243/132/26
+f 131/133/25 130/134/25 137/135/25
+f 198/136/25 204/137/25 223/138/25
+f 185/139/23 163/140/23 128/141/23
+f 205/142/25 210/143/25 225/144/25
+f 164/145/26 199/146/26 224/147/27
+f 135/148/30 237/149/30 231/150/30
+f 133/151/30 134/152/30 244/153/30
+f 238/154/22 241/155/22 144/156/22
+f 227/157/25 229/158/25 232/159/25
+f 230/160/12 219/161/12 246/162/12
+f 220/163/24 212/164/24 141/165/24
+f 252/166/23 248/167/23 257/168/23
+f 247/169/23 140/170/23 143/171/23
+f 215/172/26 235/173/27 254/174/26
+f 242/175/12 221/176/12 253/177/11
+f 213/178/24 216/179/24 249/180/24
+f 236/181/22 239/182/22 258/183/22
+f 261/184/31 262/185/32 263/186/33
+f 262/185/32 261/184/31 266/187/34
+f 261/188/31 263/189/33 264/190/35
+f 261/188/31 264/190/35 265/191/36
+f 261/184/31 265/192/36 266/187/34
+f 262/185/32 266/187/34 271/193/37
+f 263/186/33 262/185/32 267/194/38
+f 264/195/35 263/196/33 268/197/39
+f 265/198/36 264/195/35 269/199/40
+f 266/187/34 265/192/36 270/200/41
+f 262/185/32 271/193/37 267/194/38
+f 263/196/33 267/201/38 268/197/39
+f 264/195/35 268/197/39 269/199/40
+f 265/198/36 269/199/40 270/202/41
+f 266/187/34 270/200/41 271/193/37
+f 267/203/38 271/204/37 272/188/42
+f 268/197/39 267/201/38 272/205/42
+f 269/199/40 268/197/39 272/205/42
+f 270/202/41 269/199/40 272/205/42
+f 271/204/37 270/206/41 272/188/42
+f 273/207/31 274/208/32 275/209/33
+f 274/208/32 273/207/31 278/210/34
+f 273/207/31 275/209/33 276/211/35
+f 273/207/31 276/211/35 277/212/36
+f 273/207/31 277/212/36 278/210/34
+f 274/208/32 278/210/34 283/213/37
+f 275/209/33 274/208/32 279/214/38
+f 276/211/35 275/209/33 280/215/39
+f 277/212/36 276/211/35 281/216/40
+f 278/210/34 277/212/36 282/217/41
+f 274/208/32 283/213/37 279/214/38
+f 275/209/33 279/214/38 280/215/39
+f 276/211/35 280/215/39 281/216/40
+f 277/212/36 281/216/40 282/217/41
+f 278/210/34 282/217/41 283/213/37
+f 279/214/38 283/213/37 284/218/42
+f 280/215/39 279/214/38 284/218/42
+f 281/216/40 280/215/39 284/218/42
+f 282/217/41 281/216/40 284/218/42
+f 283/213/37 282/217/41 284/218/42
+f 285/219/31 286/220/32 287/221/33
+f 286/220/32 285/219/31 290/222/34
+f 285/223/31 287/224/33 288/225/35
+f 285/223/31 288/225/35 289/226/36
+f 285/219/31 289/227/36 290/222/34
+f 286/220/32 290/222/34 295/228/37
+f 287/221/33 286/220/32 291/229/38
+f 288/230/35 287/231/33 292/232/39
+f 289/233/36 288/230/35 293/234/40
+f 290/222/34 289/227/36 294/235/41
+f 286/220/32 295/228/37 291/229/38
+f 287/231/33 291/236/38 292/232/39
+f 288/230/35 292/232/39 293/234/40
+f 289/233/36 293/234/40 294/237/41
+f 290/222/34 294/235/41 295/228/37
+f 291/238/38 295/239/37 296/240/42
+f 292/232/39 291/236/38 296/241/42
+f 293/234/40 292/232/39 296/241/42
+f 294/237/41 293/234/40 296/241/42
+f 295/239/37 294/242/41 296/240/42
+f 297/243/43 298/244/44 299/245/45
+f 299/245/45 300/246/46 301/247/47
+f 301/247/47 302/248/48 303/249/49
+f 303/249/49 304/250/50 305/251/51
+f 302/248/48 306/252/52 304/250/50
+f 307/253/53 308/254/54 297/243/43
+f 305/251/51 306/252/52 307/253/53
+f 297/243/43 299/245/45 307/253/53
+f 309/255/43 310/256/44 311/257/45
+f 311/257/45 312/258/46 313/259/47
+f 313/259/47 314/260/48 315/261/49
+f 315/261/49 316/262/50 317/263/51
+f 314/260/48 318/264/52 316/262/50
+f 319/265/53 320/266/54 309/255/43
+f 317/263/51 318/264/52 319/265/53
+f 309/255/43 311/257/45 319/265/53
+f 335/267/55 321/268/56 339/269/57
+f 334/270/58 332/271/59 338/268/60
+f 323/272/61 324/273/62 326/270/63
+f 322/274/64 338/268/60 340/275/65
+f 326/276/63 324/277/62 322/278/64
+f 325/279/66 326/270/63 328/271/67
+f 342/280/68 341/281/69 347/282/70
+f 328/271/67 326/270/63 321/268/56
+f 327/283/71 328/271/67 330/284/72
+f 332/285/59 330/286/72 337/287/73
+f 321/268/56 322/274/64 339/269/57
+f 329/288/74 330/284/72 331/283/75
+f 330/286/72 328/289/67 335/290/55
+f 333/279/76 334/270/58 323/272/61
+f 331/283/75 332/271/59 333/279/76
+f 336/291/77 335/267/55 341/281/69
+f 324/277/62 334/292/58 338/293/60
+f 323/277/61 325/276/66 333/292/76
+f 337/267/73 336/291/77 342/280/68
+f 338/268/60 337/267/73 344/269/78
+f 348/294/79 347/282/70 353/295/80
+f 339/269/57 340/275/65 346/296/81
+f 340/275/65 344/269/78 346/296/81
+f 343/281/82 342/280/68 349/282/83
+f 341/281/69 339/269/57 345/297/84
+f 344/269/78 343/281/82 350/297/85
+f 354/298/86 353/295/80 360/299/87
+f 345/297/84 346/296/81 351/300/88
+f 346/296/81 350/297/85 356/300/89
+f 349/282/83 348/294/79 355/295/90
+f 347/282/70 345/297/84 351/300/88
+f 350/297/85 349/282/83 356/300/89
+f 362/301/91 361/302/92 368/303/93
+f 351/300/88 352/304/94 358/305/95
+f 352/304/94 356/300/89 358/305/95
+f 355/295/90 354/298/86 361/302/92
+f 353/295/80 351/300/88 357/301/96
+f 356/300/89 355/295/90 362/301/91
+f 368/303/93 367/306/97 374/307/98
+f 360/299/87 359/302/99 365/306/100
+f 357/301/96 358/305/95 363/303/101
+f 358/305/95 362/301/91 368/303/93
+f 361/302/92 360/299/87 367/306/97
+f 359/302/99 357/301/96 363/303/101
+f 374/308/98 373/309/102 379/310/103
+f 366/311/104 365/306/100 371/312/105
+f 363/303/101 364/313/106 370/314/107
+f 364/313/106 368/303/93 370/314/107
+f 367/306/97 366/311/104 373/312/102
+f 365/306/100 363/303/101 369/307/108
+f 372/315/109 371/316/105 377/317/110
+f 369/318/108 370/319/107 375/320/111
+f 370/321/107 374/308/98 380/322/112
+f 373/309/102 372/323/109 379/310/103
+f 371/309/105 369/308/108 375/322/111
+f 380/322/112 379/310/103 381/324/12
+f 378/325/113 377/310/110 381/324/12
+f 375/322/111 376/326/114 381/324/12
+f 376/326/114 380/322/112 381/324/12
+f 379/310/103 378/325/113 381/324/12
+f 377/310/110 375/322/111 381/324/12
+f 396/267/55 382/268/56 400/269/57
+f 395/270/58 393/271/59 399/268/60
+f 384/272/61 385/273/62 387/270/63
+f 383/274/64 399/268/60 401/275/115
+f 387/276/63 385/277/62 383/278/64
+f 386/279/66 387/270/63 389/271/67
+f 403/280/68 402/281/69 408/282/70
+f 389/271/67 387/270/63 382/268/56
+f 388/283/71 389/271/67 391/284/72
+f 393/285/59 391/286/72 398/287/73
+f 382/268/56 383/274/64 400/269/57
+f 390/288/74 391/284/72 392/283/75
+f 391/286/72 389/289/67 397/327/77
+f 394/279/76 395/270/58 384/272/61
+f 392/283/75 393/271/59 394/279/76
+f 397/291/77 396/267/55 402/281/69
+f 385/277/62 395/292/58 383/278/64
+f 384/277/61 386/276/66 394/292/76
+f 398/267/73 397/291/77 404/281/82
+f 399/268/60 398/267/73 405/269/78
+f 409/294/79 408/282/70 414/295/116
+f 400/269/57 401/275/115 407/296/81
+f 401/275/115 405/269/78 407/296/81
+f 404/281/82 403/280/68 410/282/83
+f 402/281/69 400/269/57 406/297/84
+f 405/269/78 404/281/82 411/297/85
+f 415/298/86 414/295/116 420/302/99
+f 406/297/84 407/296/81 412/300/88
+f 407/296/81 411/297/85 417/300/89
+f 410/282/83 409/294/79 416/295/90
+f 408/282/70 406/297/84 412/300/88
+f 411/297/85 410/282/83 417/300/89
+f 423/301/91 422/302/92 429/303/93
+f 412/300/88 413/304/94 419/305/95
+f 413/304/94 417/300/89 423/301/91
+f 416/295/90 415/298/86 422/302/92
+f 414/295/116 412/300/88 418/301/96
+f 417/300/89 416/295/90 423/301/91
+f 429/303/93 428/306/97 435/307/98
+f 421/299/87 420/302/99 426/306/100
+f 418/301/96 419/305/95 425/313/106
+f 419/305/95 423/301/91 425/313/106
+f 422/302/92 421/299/87 428/306/97
+f 420/302/99 418/301/96 424/303/101
+f 435/308/98 434/309/102 440/310/103
+f 427/311/104 426/306/100 432/312/105
+f 424/303/101 425/313/106 431/314/107
+f 425/313/106 429/303/93 431/314/107
+f 428/306/97 427/311/104 434/312/102
+f 426/306/100 424/303/101 430/307/108
+f 433/315/109 432/316/105 438/317/110
+f 430/318/108 431/319/107 436/320/111
+f 431/321/107 435/308/98 441/322/112
+f 434/309/102 433/323/109 440/310/103
+f 432/309/105 430/308/108 436/322/111
+f 441/322/112 440/310/103 442/324/12
+f 439/325/113 438/310/110 442/324/12
+f 436/322/111 437/326/114 442/324/12
+f 437/326/114 441/322/112 442/324/12
+f 440/310/103 439/325/113 442/324/12
+f 438/310/110 436/322/111 442/324/12
+f 457/267/55 443/268/56 461/269/117
+f 456/270/58 454/271/59 460/268/60
+f 445/272/61 446/273/62 448/270/63
+f 444/274/64 460/268/60 462/275/65
+f 448/276/63 446/277/62 444/278/64
+f 447/279/66 448/270/63 450/271/67
+f 464/280/68 463/281/118 469/282/70
+f 450/271/67 448/270/63 443/268/56
+f 449/283/71 450/271/67 452/284/72
+f 454/285/59 452/286/72 459/287/73
+f 443/268/56 444/274/64 461/269/117
+f 451/288/74 452/284/72 453/283/75
+f 452/286/72 450/289/67 458/327/77
+f 455/279/76 456/270/58 445/272/61
+f 453/283/75 454/271/59 455/279/76
+f 458/291/77 457/267/55 463/281/118
+f 446/277/62 456/292/58 444/278/64
+f 445/277/61 447/276/66 455/292/76
+f 459/267/73 458/291/77 464/280/68
+f 460/268/60 459/267/73 466/269/78
+f 470/294/79 469/282/70 475/295/80
+f 461/269/117 462/275/65 468/296/81
+f 462/275/65 466/269/78 468/296/81
+f 465/281/82 464/280/68 471/282/83
+f 463/281/118 461/269/117 467/297/84
+f 466/269/78 465/281/82 472/297/85
+f 476/298/86 475/295/80 482/299/87
+f 467/297/84 468/296/81 473/300/88
+f 468/296/81 472/297/85 478/300/89
+f 471/282/83 470/294/79 477/295/90
+f 469/282/70 467/297/84 473/300/88
+f 472/297/85 471/282/83 478/300/89
+f 484/301/91 483/302/92 490/303/93
+f 473/300/88 474/304/94 480/305/95
+f 474/304/94 478/300/89 480/305/95
+f 477/295/90 476/298/86 483/302/92
+f 475/295/80 473/300/88 479/301/96
+f 478/300/89 477/295/90 484/301/91
+f 490/303/93 489/306/97 496/307/98
+f 482/299/87 481/302/99 487/306/100
+f 479/301/96 480/305/95 485/303/101
+f 480/305/95 484/301/91 486/313/106
+f 483/302/92 482/299/87 489/306/97
+f 481/302/99 479/301/96 485/303/101
+f 496/308/98 495/309/102 501/310/103
+f 488/311/104 487/306/100 493/312/105
+f 485/303/101 486/313/106 492/314/107
+f 486/313/106 490/303/93 492/314/107
+f 489/306/97 488/311/104 495/312/102
+f 487/306/100 485/303/101 491/307/108
+f 494/315/109 493/316/105 499/317/110
+f 491/318/108 492/319/107 497/320/111
+f 492/321/107 496/308/98 502/322/112
+f 495/309/102 494/323/109 501/310/103
+f 493/309/105 491/308/108 497/322/111
+f 502/322/112 501/310/103 503/324/11
+f 500/325/119 499/310/110 503/324/11
+f 497/322/111 498/326/114 503/324/11
+f 498/326/114 502/322/112 503/324/11
+f 501/310/103 500/325/119 503/324/11
+f 499/310/110 497/322/111 503/324/11
+f 38/2/1 47/328/1 45/3/1
+f 27/5/2 37/329/2 40/6/2
+f 2/330/3 1/7/3 6/9/3
+f 3/331/4 21/10/4 7/12/4
+f 26/14/5 8/332/5 29/15/1
+f 30/333/6 18/16/6 4/18/6
+f 19/20/7 9/334/7 10/21/7
+f 32/23/8 12/33/14 33/24/9
+f 11/335/10 28/25/10 34/27/10
+f 16/29/12 15/336/12 14/30/12
+f 43/337/3 35/31/3 42/32/13
+f 42/32/13 33/24/9 46/34/15
+f 36/36/4 44/338/4 48/37/4
+f 68/39/4 70/46/16 69/40/16
+f 53/44/17 51/41/6 54/43/17
+f 55/51/18 53/44/17 56/45/18
+f 70/46/16 72/53/19 71/47/19
+f 65/339/3 63/48/17 66/50/3
+f 57/56/4 55/51/18 58/52/4
+f 72/53/19 49/55/6 50/54/6
+f 63/48/17 50/54/6 64/49/17
+f 58/52/4 60/50/20 59/57/20
+f 62/59/19 52/42/6 51/41/6
+f 99/61/1 62/59/19 61/58/19
+f 67/38/4 98/62/21 68/39/4
+f 101/340/22 105/64/22 102/66/22
+f 149/341/23 147/67/23 103/69/23
+f 108/71/24 104/342/24 155/72/24
+f 145/74/25 151/343/25 159/75/25
+f 160/344/26 152/76/26 156/78/27
+f 146/345/12 158/79/12 148/81/12
+f 195/346/22 180/82/22 189/84/22
+f 113/347/26 116/85/27 114/87/26
+f 120/89/12 126/348/12 125/90/11
+f 109/92/24 166/349/24 170/93/24
+f 178/350/28 111/94/28 171/96/28
+f 161/351/22 112/97/22 179/99/22
+f 191/352/12 186/100/12 119/102/12
+f 124/353/26 162/103/26 123/105/27
+f 193/354/28 176/106/28 196/108/28
+f 177/110/24 194/355/24 187/111/24
+f 122/113/25 197/356/25 168/114/25
+f 200/116/25 206/357/25 208/117/25
+f 228/358/11 209/118/12 218/120/12
+f 188/122/29 207/359/29 201/123/29
+f 129/360/23 192/124/23 127/126/23
+f 174/128/29 202/361/29 169/129/29
+f 234/362/26 214/130/26 243/132/26
+f 130/134/25 136/363/25 137/135/25
+f 204/137/25 226/364/25 223/138/25
+f 211/365/23 185/139/23 128/141/23
+f 210/143/25 132/366/25 225/144/25
+f 217/367/26 164/145/26 224/147/27
+f 138/368/30 135/148/30 231/150/30
+f 233/369/30 133/151/30 244/153/30
+f 256/370/22 238/154/22 144/156/22
+f 229/158/25 245/371/25 232/159/25
+f 219/161/12 240/372/12 246/162/12
+f 212/164/24 139/373/24 141/165/24
+f 259/374/23 252/166/23 257/168/23
+f 142/375/23 247/169/23 143/171/23
+f 250/376/26 215/172/26 254/174/26
+f 260/377/11 242/175/12 253/177/11
+f 216/179/24 251/378/24 249/180/24
+f 255/379/22 236/181/22 258/183/22
+f 298/244/44 300/246/46 299/245/45
+f 300/246/46 302/248/48 301/247/47
+f 302/248/48 304/250/50 303/249/49
+f 304/250/50 306/252/52 305/251/51
+f 302/248/48 300/246/46 306/252/52
+f 300/246/46 298/244/44 306/252/52
+f 298/244/44 308/254/54 306/252/52
+f 308/254/54 298/244/44 297/243/43
+f 306/252/52 308/254/54 307/253/53
+f 299/245/45 301/247/47 307/253/53
+f 301/247/47 303/249/49 305/251/51
+f 307/253/53 301/247/47 305/251/51
+f 310/256/44 312/258/46 311/257/45
+f 312/258/46 314/260/48 313/259/47
+f 314/260/48 316/262/50 315/261/49
+f 316/262/50 318/264/52 317/263/51
+f 314/260/48 320/266/54 318/264/52
+f 312/258/46 310/256/44 314/260/48
+f 310/256/44 320/266/54 314/260/48
+f 320/266/54 310/256/44 309/255/43
+f 318/264/52 320/266/54 319/265/53
+f 311/257/45 313/259/47 319/265/53
+f 313/259/47 315/261/49 317/263/51
+f 319/265/53 313/259/47 317/263/51
+f 341/281/69 335/267/55 339/269/57
+f 332/271/59 337/267/73 338/268/60
+f 325/279/66 323/272/61 326/270/63
+f 338/268/60 344/269/78 340/275/65
+f 321/380/56 326/276/63 322/278/64
+f 327/283/71 325/279/66 328/271/67
+f 348/294/79 342/280/68 347/282/70
+f 335/267/55 328/271/67 321/268/56
+f 329/288/74 327/283/71 330/284/72
+f 330/286/72 336/327/77 337/287/73
+f 322/274/64 340/275/65 339/269/57
+f 330/284/72 332/271/59 331/283/75
+f 336/327/77 330/286/72 335/290/55
+f 334/270/58 324/273/62 323/272/61
+f 332/271/59 334/270/58 333/279/76
+f 342/280/68 336/291/77 341/281/69
+f 322/278/64 324/277/62 338/293/60
+f 325/276/66 327/289/71 333/292/76
+f 327/289/71 329/286/74 331/285/75
+f 333/292/76 327/289/71 331/285/75
+f 343/281/82 337/267/73 342/280/68
+f 337/267/73 343/281/82 344/269/78
+f 354/298/86 348/294/79 353/295/80
+f 345/297/84 339/269/57 346/296/81
+f 344/269/78 350/297/85 346/296/81
+f 342/280/68 348/294/79 349/282/83
+f 347/282/70 341/281/69 345/297/84
+f 343/281/82 349/282/83 350/297/85
+f 353/295/80 359/302/99 360/299/87
+f 346/296/81 352/304/94 351/300/88
+f 352/304/94 346/296/81 356/300/89
+f 348/294/79 354/298/86 355/295/90
+f 353/295/80 347/282/70 351/300/88
+f 349/282/83 355/295/90 356/300/89
+f 361/302/92 367/306/97 368/303/93
+f 357/301/96 351/300/88 358/305/95
+f 356/300/89 362/301/91 358/305/95
+f 354/298/86 360/299/87 361/302/92
+f 359/302/99 353/295/80 357/301/96
+f 355/295/90 361/302/92 362/301/91
+f 367/306/97 373/312/102 374/307/98
+f 366/311/104 360/299/87 365/306/100
+f 358/305/95 364/313/106 363/303/101
+f 364/313/106 358/305/95 368/303/93
+f 360/299/87 366/311/104 367/306/97
+f 365/306/100 359/302/99 363/303/101
+f 380/322/112 374/308/98 379/310/103
+f 372/381/109 366/311/104 371/312/105
+f 369/307/108 363/303/101 370/314/107
+f 368/303/93 374/307/98 370/314/107
+f 366/311/104 372/381/109 373/312/102
+f 371/312/105 365/306/100 369/307/108
+f 378/382/113 372/315/109 377/317/110
+f 370/319/107 376/383/114 375/320/111
+f 376/326/114 370/321/107 380/322/112
+f 372/323/109 378/325/113 379/310/103
+f 377/310/110 371/309/105 375/322/111
+f 402/281/69 396/267/55 400/269/57
+f 393/271/59 398/267/73 399/268/60
+f 386/279/66 384/272/61 387/270/63
+f 399/268/60 405/269/78 401/275/115
+f 382/380/56 387/276/63 383/278/64
+f 388/283/71 386/279/66 389/271/67
+f 409/294/79 403/280/68 408/282/70
+f 396/267/55 389/271/67 382/268/56
+f 390/288/74 388/283/71 391/284/72
+f 391/286/72 397/327/77 398/287/73
+f 383/274/64 401/275/115 400/269/57
+f 391/284/72 393/271/59 392/283/75
+f 389/289/67 396/290/55 397/327/77
+f 395/270/58 385/273/62 384/272/61
+f 393/271/59 395/270/58 394/279/76
+f 403/280/68 397/291/77 402/281/69
+f 395/292/58 399/293/60 383/278/64
+f 386/276/66 388/289/71 394/292/76
+f 388/289/71 390/286/74 392/285/75
+f 394/292/76 388/289/71 392/285/75
+f 397/291/77 403/280/68 404/281/82
+f 398/267/73 404/281/82 405/269/78
+f 415/298/86 409/294/79 414/295/116
+f 406/297/84 400/269/57 407/296/81
+f 405/269/78 411/297/85 407/296/81
+f 403/280/68 409/294/79 410/282/83
+f 408/282/70 402/281/69 406/297/84
+f 404/281/82 410/282/83 411/297/85
+f 421/299/87 415/298/86 420/302/99
+f 407/296/81 413/304/94 412/300/88
+f 413/304/94 407/296/81 417/300/89
+f 409/294/79 415/298/86 416/295/90
+f 414/295/116 408/282/70 412/300/88
+f 410/282/83 416/295/90 417/300/89
+f 422/302/92 428/306/97 429/303/93
+f 418/301/96 412/300/88 419/305/95
+f 419/305/95 413/304/94 423/301/91
+f 415/298/86 421/299/87 422/302/92
+f 420/302/99 414/295/116 418/301/96
+f 416/295/90 422/302/92 423/301/91
+f 428/306/97 434/312/102 435/307/98
+f 427/311/104 421/299/87 426/306/100
+f 424/303/101 418/301/96 425/313/106
+f 423/301/91 429/303/93 425/313/106
+f 421/299/87 427/311/104 428/306/97
+f 426/306/100 420/302/99 424/303/101
+f 441/322/112 435/308/98 440/310/103
+f 433/381/109 427/311/104 432/312/105
+f 430/307/108 424/303/101 431/314/107
+f 429/303/93 435/307/98 431/314/107
+f 427/311/104 433/381/109 434/312/102
+f 432/312/105 426/306/100 430/307/108
+f 439/382/113 433/315/109 438/317/110
+f 431/319/107 437/383/114 436/320/111
+f 437/326/114 431/321/107 441/322/112
+f 433/323/109 439/325/113 440/310/103
+f 438/310/110 432/309/105 436/322/111
+f 463/281/118 457/267/55 461/269/117
+f 454/271/59 459/267/73 460/268/60
+f 447/279/66 445/272/61 448/270/63
+f 460/268/60 466/269/78 462/275/65
+f 443/380/56 448/276/63 444/278/64
+f 449/283/71 447/279/66 450/271/67
+f 470/294/79 464/280/68 469/282/70
+f 457/267/55 450/271/67 443/268/56
+f 451/288/74 449/283/71 452/284/72
+f 452/286/72 458/327/77 459/287/73
+f 444/274/64 462/275/65 461/269/117
+f 452/284/72 454/271/59 453/283/75
+f 450/289/67 457/290/55 458/327/77
+f 456/270/58 446/273/62 445/272/61
+f 454/271/59 456/270/58 455/279/76
+f 464/280/68 458/291/77 463/281/118
+f 456/292/58 460/293/60 444/278/64
+f 447/276/66 449/289/71 455/292/76
+f 449/289/71 451/286/74 453/285/75
+f 455/292/76 449/289/71 453/285/75
+f 465/281/82 459/267/73 464/280/68
+f 459/267/73 465/281/82 466/269/78
+f 476/298/86 470/294/79 475/295/80
+f 467/297/84 461/269/117 468/296/81
+f 466/269/78 472/297/85 468/296/81
+f 464/280/68 470/294/79 471/282/83
+f 469/282/70 463/281/118 467/297/84
+f 465/281/82 471/282/83 472/297/85
+f 475/295/80 481/302/99 482/299/87
+f 468/296/81 474/304/94 473/300/88
+f 474/304/94 468/296/81 478/300/89
+f 470/294/79 476/298/86 477/295/90
+f 475/295/80 469/282/70 473/300/88
+f 471/282/83 477/295/90 478/300/89
+f 483/302/92 489/306/97 490/303/93
+f 479/301/96 473/300/88 480/305/95
+f 478/300/89 484/301/91 480/305/95
+f 476/298/86 482/299/87 483/302/92
+f 481/302/99 475/295/80 479/301/96
+f 477/295/90 483/302/92 484/301/91
+f 489/306/97 495/312/102 496/307/98
+f 488/311/104 482/299/87 487/306/100
+f 480/305/95 486/313/106 485/303/101
+f 484/301/91 490/303/93 486/313/106
+f 482/299/87 488/311/104 489/306/97
+f 487/306/100 481/302/99 485/303/101
+f 502/322/112 496/308/98 501/310/103
+f 494/381/109 488/311/104 493/312/105
+f 491/307/108 485/303/101 492/314/107
+f 490/303/93 496/307/98 492/314/107
+f 488/311/104 494/381/109 495/312/102
+f 493/312/105 487/306/100 491/307/108
+f 500/382/119 494/315/109 499/317/110
+f 492/319/107 498/383/114 497/320/111
+f 498/326/114 492/321/107 502/322/112
+f 494/323/109 500/325/119 501/310/103
+f 499/310/110 493/309/105 497/322/111
+f 504/384/3 80/385/120 76/386/121
+f 78/387/122 79/388/123 74/389/124
+f 80/385/120 77/390/125 73/391/126
+f 77/390/125 78/387/122 73/391/126
+f 77/390/125 80/385/120 84/392/127
+f 81/393/128 84/392/127 88/394/129
+f 80/385/120 504/384/3 506/395/3
+f 79/388/123 78/387/122 83/396/130
+f 78/387/122 77/390/125 81/393/128
+f 85/397/131 88/394/129 92/398/132
+f 82/399/133 81/393/128 85/397/131
+f 83/396/130 82/399/133 87/400/134
+f 84/392/127 506/395/3 507/401/135
+f 89/402/136 92/398/132 93/403/137
+f 87/400/134 86/404/138 91/405/139
+f 88/394/129 507/401/135 92/398/132
+f 86/404/138 85/397/131 90/406/140
+f 96/407/141 95/408/142 93/403/137
+f 90/406/140 89/402/136 94/409/143
+f 91/405/139 90/406/140 94/409/143
+f 92/398/132 508/410/3 96/407/141
+f 75/411/3 504/384/3 76/386/121
+f 79/388/123 505/412/6 74/389/124
+f 76/386/121 80/385/120 73/391/126
+f 78/387/122 74/389/124 73/391/126
+f 81/393/128 77/390/125 84/392/127
+f 85/397/131 81/393/128 88/394/129
+f 84/392/127 80/385/120 506/395/3
+f 78/387/122 82/399/133 83/396/130
+f 82/399/133 78/387/122 81/393/128
+f 89/402/136 85/397/131 92/398/132
+f 86/404/138 82/399/133 85/397/131
+f 82/399/133 86/404/138 87/400/134
+f 88/394/129 84/392/127 507/401/135
+f 92/398/132 96/407/141 93/403/137
+f 86/404/138 90/406/140 91/405/139
+f 507/401/135 508/410/3 92/398/132
+f 85/397/131 89/402/136 90/406/140
+f 95/408/142 94/409/143 93/403/137
+f 89/402/136 93/403/137 94/409/143
+f 509/413/144 91/405/139 94/409/143
+f 508/410/3 95/408/142 96/407/141
diff --git a/07-july/resources/textures/blendmap.png b/07-july/resources/textures/blendmap.png
new file mode 100644
index 0000000..4789845
--- /dev/null
+++ b/07-july/resources/textures/blendmap.png
Binary files differ
diff --git a/07-july/resources/textures/gato.png b/07-july/resources/textures/gato.png
new file mode 100644
index 0000000..fc5c762
--- /dev/null
+++ b/07-july/resources/textures/gato.png
Binary files differ
diff --git a/07-july/resources/textures/heightmap.png b/07-july/resources/textures/heightmap.png
new file mode 100644
index 0000000..12741e5
--- /dev/null
+++ b/07-july/resources/textures/heightmap.png
Binary files differ
diff --git a/07-july/resources/textures/soil1.png b/07-july/resources/textures/soil1.png
new file mode 100644
index 0000000..227e96c
--- /dev/null
+++ b/07-july/resources/textures/soil1.png
Binary files differ
diff --git a/07-july/resources/textures/soil2.png b/07-july/resources/textures/soil2.png
new file mode 100644
index 0000000..5fc40e2
--- /dev/null
+++ b/07-july/resources/textures/soil2.png
Binary files differ
diff --git a/07-july/resources/textures/soil3.png b/07-july/resources/textures/soil3.png
new file mode 100644
index 0000000..2c1c431
--- /dev/null
+++ b/07-july/resources/textures/soil3.png
Binary files differ
diff --git a/07-july/resources/textures/soil4.png b/07-july/resources/textures/soil4.png
new file mode 100644
index 0000000..8d3a4d3
--- /dev/null
+++ b/07-july/resources/textures/soil4.png
Binary files differ
diff --git a/07-july/resources/textures/spaceship.png b/07-july/resources/textures/spaceship.png
new file mode 100644
index 0000000..2263cdc
--- /dev/null
+++ b/07-july/resources/textures/spaceship.png
Binary files differ
diff --git a/07-july/resources/textures/stall.png b/07-july/resources/textures/stall.png
new file mode 100644
index 0000000..d4d6f6e
--- /dev/null
+++ b/07-july/resources/textures/stall.png
Binary files differ
diff --git a/07-july/src/camera.c b/07-july/src/camera.c
new file mode 100644
index 0000000..9afadf2
--- /dev/null
+++ b/07-july/src/camera.c
@@ -0,0 +1,85 @@
+#include "camera.h"
+
+#include "util/util_time.h"
+
+static const float movementSpeed = 40.0f;
+
+void Camera_Init(camera_t* camera)
+{
+ camera->position = vec3_create(5.0f, 15.0f, 0.0f);
+ camera->viewDirection = vec3_create(-1.0f, 0.0f, 0.0f);
+ camera->needsUpdate = true;
+ camera->up = vec3_create(0.0f, 1.0f, 0.0f);
+}
+
+void Camera_Move_Up(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->up, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_Move_Down(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->up, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_Move_Left(camera_t* camera)
+{
+ vec3_t strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
+ strafeDirection = vec3_scalar_mul(&strafeDirection, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &strafeDirection);
+}
+
+void Camera_Move_Right(camera_t* camera)
+{
+ vec3_t strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
+ strafeDirection = vec3_scalar_mul(&strafeDirection, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &strafeDirection);
+}
+
+void Camera_Move_Foward(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->viewDirection, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_Move_Backward(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->viewDirection, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_MouseUpdate(camera_t* camera, const vec2_t* newMousePosition)
+{
+ vec2_t mouseDelta = vec2_sub(newMousePosition, &camera->mousePosition);
+
+ //El if evita que el mouse se teletrasporte al cambiar de posicion muy rapido
+ if(vec2_length(&mouseDelta) > 50.0f){
+ camera->mousePosition = *newMousePosition;
+ return;
+ }
+
+ vec3_t verticalRotation = vec3_cross_mul(&camera->viewDirection, &camera->up);
+
+ mat4_t temp = mat4_rotate(mouseDelta.x * -0.5f, &camera->up);
+
+ camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);
+
+ temp = mat4_rotate(mouseDelta.y * -0.5f, &verticalRotation);
+ camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);
+
+ camera->mousePosition = *newMousePosition;
+
+ camera->needsUpdate = true;
+}
+
+mat4_t Camera_GetModelToViewMatrix(camera_t* camera)
+{
+ if(camera->needsUpdate)
+ {
+ vec3_t temp = vec3_add(&camera->position, &camera->viewDirection);
+ camera->viewMatrix = mat4_lookAt(&camera->position, &temp, &camera->up);
+ }
+ return camera->viewMatrix;
+}
diff --git a/07-july/src/camera.h b/07-july/src/camera.h
new file mode 100644
index 0000000..4254045
--- /dev/null
+++ b/07-july/src/camera.h
@@ -0,0 +1,32 @@
+#ifndef CAMERA_H
+#define CAMERA_H
+
+#include "math/matrix4x4.h"
+#include "math/vector3f.h"
+#include "math/vector2f.h"
+#include <stdbool.h>
+
+typedef struct
+{
+ vec3_t position;
+ vec3_t viewDirection;
+ vec3_t up;
+ mat4_t projectionMatrix;
+ mat4_t viewMatrix;
+ vec2_t mousePosition;
+ bool needsUpdate;
+} camera_t;
+
+extern void Camera_Init(camera_t* camera);
+extern void Camera_Move_Up(camera_t* camera);
+extern void Camera_Move_Down(camera_t* camera);
+extern void Camera_Move_Left(camera_t* camera);
+extern void Camera_Move_Right(camera_t* camera);
+extern void Camera_Move_Foward(camera_t* camera);
+extern void Camera_Move_Backward(camera_t* camera);
+extern void Camera_MouseUpdate(camera_t* camera, const vec2_t* newMousePosition);
+
+//Consigue la viewMatrix
+extern mat4_t Camera_GetModelToViewMatrix(camera_t* camera);
+
+#endif // CAMERA_H
diff --git a/07-july/src/game.h b/07-july/src/game.h
new file mode 100644
index 0000000..8ba77ed
--- /dev/null
+++ b/07-july/src/game.h
@@ -0,0 +1,42 @@
+#ifndef GAME_H
+#define GAME_H
+
+#include "camera.h"
+#include "graphics/window.h"
+#include "renderer/entity.h"
+#include "player.h"
+#include "terrain.h"
+#include "texture.h"
+#include "renderer/shape.h"
+#include "graphics/shaders.h"
+
+typedef enum
+{
+ MENU,
+ RUNNING,
+ EXIT
+}GameState_t;
+
+#define NUM_ENTITIES 1
+
+#define WINDOW_WIDTH 1024
+#define WINDOW_HEIGHT 768
+#define WINDOW_ASPECT_RATIO ( (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT )
+
+typedef struct
+{
+ GameState_t gameState;
+ Shader_Layout shaderProgram, terrainProgram;
+
+ entity_t ents[NUM_ENTITIES];
+ shape_t *entsShape;
+ texture_t *entsTexture;
+ terrain_t *terrain;
+
+ player_t player;
+
+ camera_t camera;
+ window_t *window;
+} game_t;
+
+#endif // GAME_H
diff --git a/07-july/src/graphics/shaders.c b/07-july/src/graphics/shaders.c
new file mode 100644
index 0000000..ef4ec0a
--- /dev/null
+++ b/07-july/src/graphics/shaders.c
@@ -0,0 +1,134 @@
+#include "shaders.h"
+#include "../util/util.h"
+
+#include <stdlib.h>
+
+static void CompileShader(const char* source, GLuint shaderID)
+{
+ glShaderSource(shaderID, 1, &source, 0);
+ glCompileShader(shaderID);
+ GLint error;
+ glGetShaderiv(shaderID, GL_COMPILE_STATUS, &error);
+ if(error != GL_TRUE)
+ {
+ GLint logLenth;
+ glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLenth);
+ GLchar buffer[logLenth];
+ glGetShaderInfoLog(shaderID, logLenth, &logLenth, buffer);
+ glDeleteShader(shaderID);
+ Util_FatalError(buffer);
+ }
+}
+
+
+GLuint Shader_CompileShaders(const char* vertexShader, const char* fragmentShader)
+{
+ char* vertexShaderSource = Util_LoadFile(vertexShader);
+ char* fragmentShaderSource = Util_LoadFile(fragmentShader);
+
+ GLuint vs = 0, fs = 0, program;
+ vs = glCreateShader(GL_VERTEX_SHADER);
+ fs = glCreateShader(GL_FRAGMENT_SHADER);
+
+ if(vs == 0 || fs == 0)
+ Util_FatalError("Shaders could not be created\n");
+
+ program = glCreateProgram();
+
+ CompileShader(vertexShaderSource, vs);
+ CompileShader(fragmentShaderSource, fs);
+
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+
+ glLinkProgram(program);
+
+ GLint error;
+ glGetProgramiv(program, GL_LINK_STATUS, &error);
+
+ if(error != GL_TRUE)
+ {
+ GLint logLength;
+ glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
+
+ GLchar buffer[logLength];
+ glGetProgramInfoLog(program, logLength, &logLength, buffer);
+
+ glDeleteProgram(program);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ Util_FatalError(buffer);
+ }
+
+ glDetachShader(program, vs);
+ glDetachShader(program, fs);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ free(vertexShaderSource);
+ free(fragmentShaderSource);
+
+ return program;
+}
+
+GLint Shader_GetUniformLocation( GLuint programID, const char* uniformName )
+{
+ GLint u = glGetUniformLocation(programID, uniformName);
+ if(u == GL_INVALID_INDEX)
+ Util_FatalError("Uniform variable could not be found!");
+ else
+ return u;
+
+ return 0;
+}
+
+GLint Shader_GetAttribLocation ( GLuint programID, const char* attributeName )
+{
+ GLint attrLocation = glGetAttribLocation(programID, attributeName);
+ if(attrLocation < 0)
+ Util_FatalError("Attribute could not be found\n");
+ return attrLocation;
+}
+
+void Shader_Destroy(GLuint programID)
+{
+ glUseProgram(0);
+ glDeleteProgram(programID);
+}
+
+void Shader_SetUniformMat4( GLuint programID, const char* name, const float *matrix )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniformMatrix4fv(location, 1, GL_FALSE, matrix);
+}
+
+void Shader_SetUniformFloat( GLuint programID, const char* name, const float val )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform1f(location, val);
+}
+
+void Shader_SetUniformVec2( GLuint programID, const char* name, const float vec[2] )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform2fv(location, 1, vec);
+}
+
+void Shader_SetUniformVec3( GLuint programID, const char* name, const float vec[3] )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform3fv(location, 1, vec);
+}
+
+void Shader_SetUniformVec4( GLuint programID, const char* name, const float vec[4] )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform4fv(location, 1, vec);
+}
+
+void Shader_SetUniformInt( GLuint programID, const char* name, const int val )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform1i(location, val);
+}
diff --git a/07-july/src/graphics/shaders.h b/07-july/src/graphics/shaders.h
new file mode 100644
index 0000000..9e0bbab
--- /dev/null
+++ b/07-july/src/graphics/shaders.h
@@ -0,0 +1,46 @@
+#ifndef SHADERS_H
+#define SHADERS_H
+
+#include <GL/glew.h>
+
+#include "../math/matrix4x4.h"
+
+typedef struct
+{
+ GLuint ID;
+
+ GLint position;
+ GLint color;
+ GLint uv;
+ GLint normal;
+
+ GLint totalTransform;
+ GLint modelToWorld;
+ GLint lightPosition;
+ GLint ambientLight;
+ GLint lightColor;
+ GLint lightAttenuation;
+ GLint World_eyePosition;
+ GLint Texture;
+
+ GLint Texture_Background;
+ GLint Texture_R;
+ GLint Texture_G;
+ GLint Texture_B;
+ GLint Texture_BlendMap;
+
+} Shader_Layout;
+
+extern GLuint Shader_CompileShaders(const char* vertexShader, const char* fragmentShader);
+extern GLint Shader_GetUniformLocation( GLuint programID, const char* uniformName );
+extern GLint Shader_GetAttribLocation ( GLuint programID, const char* attributeName );
+extern void Shader_Destroy(GLuint programID);
+
+extern void Shader_SetUniformMat4( GLuint programID, const char* name, const float *matrix );
+extern void Shader_SetUniformFloat( GLuint programID, const char* name, const float val );
+extern void Shader_SetUniformVec2( GLuint programID, const char* name, const float vec[2] );
+extern void Shader_SetUniformVec3( GLuint programID, const char* name, const float vec[3] );
+extern void Shader_SetUniformVec4( GLuint programID, const char* name, const float vec[4] );
+extern void Shader_SetUniformInt( GLuint programID, const char* name, const int val );
+
+#endif // SHADERS_H
diff --git a/07-july/src/graphics/video.c b/07-july/src/graphics/video.c
new file mode 100644
index 0000000..4b9b084
--- /dev/null
+++ b/07-july/src/graphics/video.c
@@ -0,0 +1,14 @@
+#include "video.h"
+
+#include <SDL2/SDL.h>
+#include <GL/glew.h>
+
+void Video_Init()
+{
+
+}
+
+void Video_Shutdown()
+{
+
+}
diff --git a/07-july/src/graphics/video.h b/07-july/src/graphics/video.h
new file mode 100644
index 0000000..db23a45
--- /dev/null
+++ b/07-july/src/graphics/video.h
@@ -0,0 +1,7 @@
+#ifndef VIDEO_H
+#define VIDEO_H
+
+extern void Video_Init(void);
+extern void Video_Shutdown(void);
+
+#endif // VIDEO_H_INCLUDED
diff --git a/07-july/src/graphics/window.c b/07-july/src/graphics/window.c
new file mode 100644
index 0000000..9afb27a
--- /dev/null
+++ b/07-july/src/graphics/window.c
@@ -0,0 +1,44 @@
+#include "window.h"
+#include "../util/util.h"
+#include <stdlib.h>
+
+window_t* Window_Create(const char* title, Uint32 width, Uint32 height)
+{
+ window_t* window = (window_t*) malloc(sizeof(window_t));
+ window->title = title;
+ window->Width = width;
+ window->Height = height;
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ window->window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
+ width, height, SDL_WINDOW_OPENGL);
+ if(window->window == NULL)
+ Util_FatalError( SDL_GetError() );
+
+ window->context = SDL_GL_CreateContext(window->window);
+
+ if(window->context == NULL)
+ Util_FatalError( SDL_GetError() );
+
+ glViewport(0, 0, width, height);
+ return window;
+}
+
+void Window_Resize(window_t* window, Uint32 width, Uint32 height)
+{
+ window->Width = width;
+ window->Height = height;
+ SDL_SetWindowSize(window->window, width, height);
+ glViewport(0, 0, width, height);
+}
+
+void Window_Update(window_t* window)
+{
+ SDL_GL_SwapWindow(window->window);
+}
+
+void Window_Destroy(window_t* window)
+{
+ SDL_GL_DeleteContext(window->context);
+ SDL_DestroyWindow(window->window);
+ free(window);
+}
diff --git a/07-july/src/graphics/window.h b/07-july/src/graphics/window.h
new file mode 100644
index 0000000..1e71a83
--- /dev/null
+++ b/07-july/src/graphics/window.h
@@ -0,0 +1,20 @@
+#ifndef WINDOW_H
+#define WINDOW_H
+
+#include <SDL2/SDL.h>
+#include <GL/glew.h>
+
+typedef struct
+{
+ SDL_Window* window;
+ SDL_GLContext context;
+ Uint32 Width, Height;
+ const char* title;
+} window_t;
+
+extern window_t* Window_Create(const char* title, Uint32 width, Uint32 height);
+extern void Window_Resize(window_t* window, Uint32 width, Uint32 height);
+extern void Window_Update(window_t* window);
+extern void Window_Destroy(window_t* window);
+
+#endif // WINDOW_H
diff --git a/07-july/src/gui/gui_renderer.c b/07-july/src/gui/gui_renderer.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/07-july/src/gui/gui_renderer.c
diff --git a/07-july/src/gui/gui_renderer.h b/07-july/src/gui/gui_renderer.h
new file mode 100644
index 0000000..2c1b57f
--- /dev/null
+++ b/07-july/src/gui/gui_renderer.h
@@ -0,0 +1,9 @@
+#ifndef GUI_RENDERER_H
+#define GUI_RENDERER_H
+
+extern void gui_renderer_init();
+extern void gui_renderer_submit(widget *widget);
+extern void gui_renderer_quit();
+
+
+#endif // GUI_RENDERER_H
diff --git a/07-july/src/gui/widget.c b/07-july/src/gui/widget.c
new file mode 100644
index 0000000..9ed00f7
--- /dev/null
+++ b/07-july/src/gui/widget.c
@@ -0,0 +1,17 @@
+#include "widget.h"
+#include <stdlib.h>
+
+widget_t *Widget_CreateImage(texture_t *texture, int x, int y, int w, int h)
+{
+ widget_t *widget = (widget_t *) malloc( sizeof(widget_t) );
+ *widget = (widget_t){ x, y, w, h, 0, texture };
+
+ glGenBuffers(1, &widget->vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, widget->vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4, NULL, GL_DYNAMIC_DRAW);
+}
+
+void Widget_Destroy(widget_t *widget)
+{
+ free(widget);
+}
diff --git a/07-july/src/gui/widget.h b/07-july/src/gui/widget.h
new file mode 100644
index 0000000..91fc4c4
--- /dev/null
+++ b/07-july/src/gui/widget.h
@@ -0,0 +1,13 @@
+#ifndef WIDGET_H
+#define WIDGET_H
+
+#include "GL/glew.h"
+#include "../texture.h"
+
+typedef struct
+{
+ int x, y, w, h;
+ texture_t *texture;
+} widget_t;
+
+#endif // WIDGET_H
diff --git a/07-july/src/input.c b/07-july/src/input.c
new file mode 100644
index 0000000..8384ceb
--- /dev/null
+++ b/07-july/src/input.c
@@ -0,0 +1,21 @@
+#include "input.h"
+
+static bool key_buffer[MAX_KEY_BUFFER_SIZE] = { false };
+
+void Input_PressKey(unsigned int key)
+{
+ if(key > 256 || key < 0) return;
+ key_buffer[key] = true;
+}
+
+void Input_ReleaseKey(unsigned int key)
+{
+ if(key > 256 || key < 0) return;
+ key_buffer[key] = false;
+}
+
+bool Input_isKeyPressed(unsigned int key)
+{
+ if(key > 256 || key < 0) return false;
+ return key_buffer[key];
+}
diff --git a/07-july/src/input.h b/07-july/src/input.h
new file mode 100644
index 0000000..92876ca
--- /dev/null
+++ b/07-july/src/input.h
@@ -0,0 +1,11 @@
+#ifndef INPUT_H
+#define INPUT_H
+
+#include <stdbool.h>
+#define MAX_KEY_BUFFER_SIZE 256
+
+void Input_PressKey(unsigned int key);
+void Input_ReleaseKey(unsigned int key);
+bool Input_isKeyPressed(unsigned int key);
+
+#endif // INPUT_H
diff --git a/07-july/src/light.c b/07-july/src/light.c
new file mode 100644
index 0000000..decd182
--- /dev/null
+++ b/07-july/src/light.c
@@ -0,0 +1 @@
+#include "light.h"
diff --git a/07-july/src/light.h b/07-july/src/light.h
new file mode 100644
index 0000000..6b6da0a
--- /dev/null
+++ b/07-july/src/light.h
@@ -0,0 +1,13 @@
+#ifndef LIGHT_H
+#define LIGHT_H
+
+#include "vertex.h"
+
+typedef struct
+{
+ vec3_t position;
+ color_t color;
+ vec3_t attenuation;
+} light_t;
+
+#endif // LIGHT_H
diff --git a/07-july/src/main.c b/07-july/src/main.c
new file mode 100644
index 0000000..d119764
--- /dev/null
+++ b/07-july/src/main.c
@@ -0,0 +1,227 @@
+#include "game.h"
+#include "math/vector3f.h"
+#include "math/vector2f.h"
+#include "math/matrix4x4.h"
+#include "input.h"
+#include "util/util.h"
+#include "util/util_time.h"
+#include "light.h"
+#include "renderer/renderer.h"
+
+/*
+ TODO: Shadows
+ Texture Atlases
+
+ improve math package
+ repair gui on renderer.c
+*/
+
+void LoadResources(game_t* game);
+void Draw(game_t* game);
+void ProcessInput(game_t* game);
+void CleanUp(game_t* game);
+
+int main(int args, char* argv[])
+{
+ SDL_Init(SDL_INIT_EVERYTHING);
+
+ game_t game;
+ game.gameState = RUNNING;
+ game.window = Window_Create("Test", WINDOW_WIDTH, WINDOW_HEIGHT);
+
+ if(glewInit() != GLEW_OK)
+ Util_FatalError("Glew could no be started!");
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ SDL_GL_SetSwapInterval(0);
+ //glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+
+ game.shaderProgram.ID = Shader_CompileShaders("resources/shaders/shader.vert",
+ "resources/shaders/shader.frag");
+
+ game.terrainProgram.ID = Shader_CompileShaders("resources/shaders/terrainShader.vert",
+ "resources/shaders/terrainShader.frag");
+ glUseProgram(game.shaderProgram.ID);
+
+ Camera_Init(&game.camera);
+
+ LoadResources(&game);
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+ Time_Init();
+ Time_SetMaxFramesPerSecond(6000);
+ while(game.gameState != EXIT)
+ {
+ Time_Begin();
+ ProcessInput(&game);
+ Player_Update(&game.player, game.terrain);
+ Draw(&game);
+
+ float FPS = Time_End();
+
+ if( !( Time_GetCountedFrames() % (int)FPS ) ) {
+ fprintf(stderr, "FPS: %.4f\n", FPS);
+ }
+ }
+
+ Window_Destroy(game.window);
+ CleanUp(&game);
+ SDL_Quit();
+ return 0;
+}
+
+void CleanUp(game_t* game)
+{
+ Shape_Free(game->entsShape);
+ Texture_Destroy(game->entsTexture);
+ Terrain_Destroy(game->terrain);
+
+ Shader_Destroy(game->shaderProgram.ID);
+ Shader_Destroy(game->terrainProgram.ID);
+ Render_Quit();
+}
+
+void LoadResources(game_t* game)
+{
+ Render_Init();
+ Uint32 start = SDL_GetTicks();
+
+ game->entsShape = Shape_MakeCube();
+ game->entsTexture = Texture_Create("resources/textures/gato.png");
+
+ Player_Init(&game->player);
+ game->player.entity.texture = game->entsTexture;
+ game->player.entity.shape = game->entsShape;
+
+ {
+ vec3_t position = { 0.0f, 3.0f, 0.0f };
+ float rotation[3] = { 0.0f, 45.0f, 45.0f };
+ game->ents[0].position = position;
+ game->ents[0].rotX = rotation[0];
+ game->ents[0].rotY = rotation[1];
+ game->ents[0].rotZ = rotation[2];
+ game->ents[0].shape = game->entsShape;
+ game->ents[0].texture = game->entsTexture;
+ }
+
+ {
+ vec3_t position = { -400.0f, 0.0f, -400.0f };
+ texture_t *blendmap = Texture_Create("resources/textures/blendmap.png");
+ TerrainTexturePack pack =
+ {
+ {
+ Texture_Create("resources/textures/soil1.png"),
+ Texture_Create("resources/textures/soil2.png"),
+ Texture_Create("resources/textures/soil4.png"),
+ Texture_Create("resources/textures/soil3.png"),
+ }
+ };
+ game->terrain = Terrain_Create(800, 800, "resources/textures/heightmap.png", blendmap, &pack);
+ game->terrain->position = position;
+ }
+
+ /* Shader Layouts */
+
+ game->shaderProgram.Texture = Shader_GetUniformLocation(game->shaderProgram.ID, "Texture");
+ game->shaderProgram.modelToWorld = Shader_GetUniformLocation(game->shaderProgram.ID, "Matrix_modelToWorld");
+ game->shaderProgram.totalTransform = Shader_GetUniformLocation(game->shaderProgram.ID, "Matrix_totalTransform");
+ game->shaderProgram.lightPosition = Shader_GetUniformLocation(game->shaderProgram.ID, "lightPosition");
+ game->shaderProgram.lightColor = Shader_GetUniformLocation(game->shaderProgram.ID, "lightColor");
+ game->shaderProgram.lightAttenuation = Shader_GetUniformLocation(game->shaderProgram.ID, "attenuation");
+
+ game->terrainProgram.modelToWorld = Shader_GetUniformLocation(game->terrainProgram.ID, "Matrix_modelToWorld");
+ game->terrainProgram.totalTransform = Shader_GetUniformLocation(game->terrainProgram.ID, "Matrix_totalTransform");
+ game->terrainProgram.lightPosition = Shader_GetUniformLocation(game->terrainProgram.ID, "lightPosition");
+ game->terrainProgram.lightColor = Shader_GetUniformLocation(game->terrainProgram.ID, "lightColor");
+ game->terrainProgram.lightAttenuation = Shader_GetUniformLocation(game->terrainProgram.ID, "attenuation");
+
+ game->terrainProgram.Texture_Background = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_Background");
+ game->terrainProgram.Texture_BlendMap = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_BlendMap");
+ game->terrainProgram.Texture_R = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_R");
+ game->terrainProgram.Texture_G = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_G");
+ game->terrainProgram.Texture_B = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_B");
+
+ fprintf(stderr, "Loading time: %u (ms)\n", SDL_GetTicks() - start);
+}
+
+void Draw(game_t* game)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /*We upload all the light vectors*/
+ static light_t diffuseLight[4] =
+ {
+ { {0.0f, 20.0f, 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ { {10.0f, 20.0f, 0.0f}, {1.0f, 0.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ { {20.0f, 20.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ { {30.0f, 20.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ };
+
+ Shader_SetUniformVec3(game->shaderProgram.ID, "World_eyePosition", (float*)&game->camera.position);
+ Render_LoadLights(&game->shaderProgram, diffuseLight, 4);
+
+ mat4_t viewMatrix, projectionMatrix, projectedViewMatrix;
+
+ viewMatrix = Camera_GetModelToViewMatrix(&game->camera);
+ projectionMatrix = mat4_perspective(60.0f, WINDOW_ASPECT_RATIO, 0.1f, 300.0f);
+ projectedViewMatrix = mat4_mul(&projectionMatrix, &viewMatrix);
+
+ Render_DrawEntity(&game->shaderProgram, &projectedViewMatrix, &game->player.entity);
+ Render_DrawEntity(&game->shaderProgram, &projectedViewMatrix, &game->ents[0]);
+
+ glUseProgram(game->terrainProgram.ID);
+
+ Shader_SetUniformVec3(game->terrainProgram.ID, "World_eyePosition", (float*)&game->camera.position);
+ Render_LoadLights(&game->terrainProgram, diffuseLight, 4);
+
+ Render_DrawTerrain(&game->terrainProgram, &projectedViewMatrix, game->terrain);
+
+ glUseProgram(game->shaderProgram.ID);
+
+ Window_Update(game->window);
+}
+
+void ProcessInput(game_t* game)
+{
+ vec2_t mousePosition;
+ SDL_Event e;
+ while(SDL_PollEvent(&e))
+ {
+ switch(e.type)
+ {
+ case SDL_QUIT:
+ game->gameState = EXIT;
+ break;
+
+ case SDL_MOUSEMOTION:
+ mousePosition = vec2_create(e.motion.x, e.motion.y);
+ Camera_MouseUpdate(&game->camera, &mousePosition);
+ break;
+
+ case SDL_KEYDOWN:
+ Input_PressKey(e.key.keysym.scancode);
+ break;
+
+ case SDL_KEYUP:
+ Input_ReleaseKey(e.key.keysym.scancode);
+ break;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_UP))
+ Camera_Move_Foward(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_DOWN))
+ Camera_Move_Backward(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_LEFT))
+ Camera_Move_Left(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_RIGHT))
+ Camera_Move_Right(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_ESCAPE))
+ game->gameState = EXIT;
+ }
+}
diff --git a/07-july/src/math/math_util.c b/07-july/src/math/math_util.c
new file mode 100644
index 0000000..f58e447
--- /dev/null
+++ b/07-july/src/math/math_util.c
@@ -0,0 +1,10 @@
+#include "math_util.h"
+
+float baryCentric(vec3_t *p1, vec3_t *p2, vec3_t *p3, vec2_t *pos)
+{
+ float det = (p2->z - p3->z) * (p1->x - p3->x) + (p3->x - p2->x) * (p1->z - p3->z);
+ float l1 = ((p2->z - p3->z) * (pos->x - p3->x) + (p3->x - p2->x) * (pos->y - p3->z)) / det;
+ float l2 = ((p3->z - p1->z) * (pos->x - p3->x) + (p1->x - p3->x) * (pos->y - p3->z)) / det;
+ float l3 = 1.0f - l1 - l2;
+ return l1 * p1->y + l2 * p2->y + l3 * p3->y;
+}
diff --git a/07-july/src/math/math_util.h b/07-july/src/math/math_util.h
new file mode 100644
index 0000000..28a5464
--- /dev/null
+++ b/07-july/src/math/math_util.h
@@ -0,0 +1,9 @@
+#ifndef MATH_UTIL_H
+#define MATH_UTIL_H
+
+#include "vector3f.h"
+#include "vector2f.h"
+
+extern float baryCentric(vec3_t *p1, vec3_t *p2, vec3_t *p3, vec2_t *pos);
+
+#endif // MATH_UTIL_H
diff --git a/07-july/src/math/matrix4x4.c b/07-july/src/math/matrix4x4.c
new file mode 100644
index 0000000..c46895a
--- /dev/null
+++ b/07-july/src/math/matrix4x4.c
@@ -0,0 +1,180 @@
+#include "matrix4x4.h"
+#include "../util/util.h"
+#include <SDL2/SDL.h>
+
+void mat4_identity(mat4_t *a)
+{
+ int i;
+ for(i = 0; i < 4*4; i++)
+ {
+ a->data[i] = 0.0f;
+ }
+ a->data[0 + 0 * 4] = 1.0f;
+ a->data[1 + 1 * 4] = 1.0f;
+ a->data[2 + 2 * 4] = 1.0f;
+ a->data[3 + 3 * 4] = 1.0f;
+}
+
+mat4_t mat4_mul(const mat4_t* a, const mat4_t* b)
+{
+ int i, j, k;
+ GLfloat sum = 0.0f;
+ mat4_t c;
+ mat4_identity(&c);
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 4; j++){
+ for(k = 0; k < 4; k++){
+ sum += a->data[i + k * 4] * b->data[k + j * 4];
+ }
+ c.data[i + j * 4] = sum;
+ sum = 0.0f;
+ }
+
+ return c;
+}
+
+mat4_t mat4_translate(const vec3_t *a)
+{
+ mat4_t b;
+ mat4_identity(&b);
+ b.data[0 + 3 * 4] = a->x;
+ b.data[1 + 3 * 4] = a->y;
+ b.data[2 + 3 * 4] = a->z;
+ return b;
+}
+
+mat4_t mat4_scale(GLfloat x, GLfloat y, GLfloat z)
+{
+ mat4_t b;
+ mat4_identity(&b);
+ b.data[0 + 0 * 4] = x;
+ b.data[1 + 1 * 4] = y;
+ b.data[2 + 2 * 4] = z;
+ return b;
+}
+
+mat4_t mat4_rotate(GLfloat degrees, const vec3_t* a)
+{
+ mat4_t b;
+ mat4_identity(&b);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees)), o = 1-c;
+ b.data[0 + 0 * 4] = a->x * a->x * o + c;
+ b.data[0 + 1 * 4] = a->x * a->y * o - a->z * s;
+ b.data[0 + 2 * 4] = a->x * a->z * o + a->y * s;
+
+ b.data[1 + 0 * 4] = a->x * a->y * o + a->z * s;
+ b.data[1 + 1 * 4] = a->y * a->y * o + c;
+ b.data[1 + 2 * 4] = a->y * a->z * o - a->x * s;
+
+ b.data[2 + 0 * 4] = a->x * a->z * o - a->y * s;
+ b.data[2 + 1 * 4] = a->y * a->z * o + a->x * s;
+ b.data[2 + 2 * 4] = a->z * a->z * o + c;
+ return b;
+}
+
+mat4_t mat4_rotate_x(GLfloat degrees)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[1 + 1 * 4] = c;
+ a.data[2 + 1 * 4] = s;
+ a.data[1 + 2 * 4] = -s;
+ a.data[2 + 2 * 4] = c;
+ return a;
+}
+
+mat4_t mat4_rotate_y(GLfloat degrees)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[0 + 0 * 4] = c;
+ a.data[2 + 0 * 4] = -s;
+ a.data[0 + 2 * 4] = s;
+ a.data[2 + 2 * 4] = c;
+ return a;
+}
+
+mat4_t mat4_rotate_z(GLfloat degrees)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[0 + 0 * 4] = c;
+ a.data[1 + 0 * 4] = s;
+ a.data[0 + 1 * 4] = -s;
+ a.data[1 + 1 * 4] = c;
+ return a;
+}
+
+mat4_t mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar)
+{
+ mat4_t a;
+ GLubyte i, j;
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 4; j++)
+ a.data[i + j * 4] = 0.0f;
+ fov = toRadians(fov); //To radians
+
+ a.data[0 + 0 * 4] = ( (1.0f / SDL_tanf( fov/2.0f )) / aspect);
+ a.data[1 + 1 * 4] = (1.0f / SDL_tanf( fov/2.0f ));
+ a.data[2 + 2 * 4] = -( (zFar + zNear) / (zFar - zNear) );
+ a.data[2 + 3 * 4] = -( ( 2.0f * zFar * zNear) / (zFar - zNear) );
+ a.data[3 + 2 * 4] = -1.0f;
+
+ return a;
+}
+
+mat4_t
+mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ a.data[0 + 0 * 4] = 2.0f / (right - left);
+ a.data[1 + 1 * 4] = 2.0f / (top - bottom);
+ a.data[2 + 2 * 4] = -1.0f;
+
+ a.data[0 + 3 * 4] = (left + right) / (left - right);
+ a.data[1 + 3 * 4] = (bottom + top) / (bottom - top);
+
+ return a;
+}
+
+mat4_t mat4_lookAt(vec3_t* eye, vec3_t* center, vec3_t* up)
+{
+ vec3_t temp = vec3_sub(center, eye);
+
+ vec3_t f = vec3_normalize(&temp);
+ vec3_t u = vec3_normalize(up);
+ temp = vec3_cross_mul(&f, &u);
+ vec3_t s = vec3_normalize(&temp);
+ u = vec3_cross_mul(&s, &f);
+
+ mat4_t a;
+ mat4_identity(&a);
+
+ a.data[0 + 0 * 4] = s.x;
+ a.data[0 + 1 * 4] = s.y;
+ a.data[0 + 2 * 4] = s.z;
+ a.data[1 + 0 * 4] = u.x;
+ a.data[1 + 1 * 4] = u.y;
+ a.data[1 + 2 * 4] = u.z;
+ a.data[2 + 0 * 4] =-f.x;
+ a.data[2 + 1 * 4] =-f.y;
+ a.data[2 + 2 * 4] =-f.z;
+ a.data[0 + 3 * 4] =-vec3_dot_mul(&s, eye);
+ a.data[1 + 3 * 4] =-vec3_dot_mul(&u, eye);
+ a.data[2 + 3 * 4] = vec3_dot_mul(&f, eye);
+
+ return a;
+}
+
+vec3_t mat4_mul_vec3(const mat4_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = a->data[0 + 0 * 4] * b->x + a->data[0 + 1 * 4] * b->y + a->data[0 + 2 * 4] * b->z + a->data[0 + 3 * 4];
+ c.y = a->data[1 + 0 * 4] * b->x + a->data[1 + 1 * 4] * b->y + a->data[1 + 2 * 4] * b->z + a->data[1 + 3 * 4];
+ c.z = a->data[2 + 0 * 4] * b->x + a->data[2 + 1 * 4] * b->y + a->data[2 + 2 * 4] * b->z + a->data[2 + 3 * 4];
+ return c;
+}
diff --git a/07-july/src/math/matrix4x4.h b/07-july/src/math/matrix4x4.h
new file mode 100644
index 0000000..6668fc5
--- /dev/null
+++ b/07-july/src/math/matrix4x4.h
@@ -0,0 +1,35 @@
+#ifndef MATRIX4X4_H
+#define MATRIX4X4_H
+
+#include <GL/glew.h>
+#include "vector3f.h"
+
+/* accesing data: row + column * width */
+typedef struct
+{
+ GLfloat data[16];
+} mat4_t;
+
+extern void mat4_identity(mat4_t* a);
+extern mat4_t mat4_mul(const mat4_t* a, const mat4_t* b);
+
+extern mat4_t mat4_translate(const vec3_t *a);
+extern mat4_t mat4_scale(GLfloat x, GLfloat y, GLfloat z);
+extern mat4_t mat4_rotate_x(GLfloat degrees);
+extern mat4_t mat4_rotate_y(GLfloat degrees);
+extern mat4_t mat4_rotate_z(GLfloat degrees);
+extern mat4_t mat4_rotate(GLfloat degrees, const vec3_t* a);
+
+extern mat4_t
+mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar);
+
+extern mat4_t
+mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top);
+
+extern mat4_t
+mat4_lookAt(vec3_t* eye, vec3_t* center, vec3_t* up);
+
+extern vec3_t
+mat4_mul_vec3(const mat4_t* a, const vec3_t* b);
+
+#endif // MATRIX4X4_H
diff --git a/07-july/src/math/vector2f.c b/07-july/src/math/vector2f.c
new file mode 100644
index 0000000..5a3e29d
--- /dev/null
+++ b/07-july/src/math/vector2f.c
@@ -0,0 +1,60 @@
+#include "vector2f.h"
+#include <SDL2/SDL.h>
+
+vec2_t vec2_create(GLfloat x, GLfloat y)
+{
+ vec2_t a = {x, y};
+ return a;
+}
+
+vec2_t vec2_add(const vec2_t* a, const vec2_t* b)
+{
+ vec2_t c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ return c;
+}
+
+vec2_t vec2_sub(const vec2_t* a, const vec2_t* b)
+{
+ vec2_t c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ return c;
+}
+
+vec2_t vec2_scalar_mul(const vec2_t* a, GLfloat scalar)
+{
+ vec2_t c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ return c;
+}
+
+GLfloat vec2_dot_mul(const vec2_t* a, const vec2_t* b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) );
+}
+
+
+vec2_t vec2_cross_mul(const vec2_t* a, const vec2_t* b)
+{
+ vec2_t c;
+ c.x = (a->x * b->y) - (a->y * b->x);
+ c.y = (a->y * b->x) - (a->x * b->y);
+ return c;
+}
+
+GLfloat vec2_length(vec2_t* a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) );
+}
+
+vec2_t vec2_normalize(vec2_t* a)
+{
+ vec2_t b;
+ GLfloat length = vec2_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ return b;
+}
diff --git a/07-july/src/math/vector2f.h b/07-july/src/math/vector2f.h
new file mode 100644
index 0000000..8c20b9a
--- /dev/null
+++ b/07-july/src/math/vector2f.h
@@ -0,0 +1,20 @@
+#ifndef VECTOR2F_H
+#define VECTOR2F_H
+
+#include <GL/glew.h>
+
+typedef struct
+{
+ GLfloat x, y;
+} vec2_t;
+
+extern vec2_t vec2_create(GLfloat x, GLfloat y);
+extern vec2_t vec2_add(const vec2_t* a, const vec2_t* b);
+extern vec2_t vec2_sub(const vec2_t* a, const vec2_t* b);
+extern vec2_t vec2_scalar_mul(const vec2_t* a, GLfloat scalar);
+extern GLfloat vec2_dot_mul(const vec2_t* a, const vec2_t* b);
+extern vec2_t vec2_cross_mul(const vec2_t* a, const vec2_t* b);
+extern GLfloat vec2_length(vec2_t* a);
+extern vec2_t vec2_normalize(vec2_t* a);
+
+#endif // VECTOR2F_H
diff --git a/07-july/src/math/vector3f.c b/07-july/src/math/vector3f.c
new file mode 100644
index 0000000..d68acf6
--- /dev/null
+++ b/07-july/src/math/vector3f.c
@@ -0,0 +1,65 @@
+#include "vector3f.h"
+#include <SDL2/SDL.h>
+
+vec3_t vec3_create(GLfloat x, GLfloat y, GLfloat z)
+{
+ vec3_t a = {x, y, z};
+ return a;
+}
+
+vec3_t vec3_add(const vec3_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ c.z = a->z + b->z;
+ return c;
+}
+
+vec3_t vec3_sub(const vec3_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ c.z = a->z - b->z;
+ return c;
+}
+
+vec3_t vec3_scalar_mul(const vec3_t* a, GLfloat scalar)
+{
+ vec3_t c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ c.z = a->z * scalar;
+ return c;
+}
+
+GLfloat vec3_dot_mul(const vec3_t* a, const vec3_t* b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) );
+}
+
+
+vec3_t vec3_cross_mul(const vec3_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = (a->y * b->z) - (a->z * b->y);
+ c.y = (a->z * b->x) - (a->x * b->z);
+ c.z = (a->x * b->y) - (a->y * b->x);
+ return c;
+}
+
+GLfloat vec3_length(vec3_t* a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f));
+}
+
+vec3_t vec3_normalize(vec3_t* a)
+{
+ vec3_t b;
+ GLfloat length = vec3_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ b.z = a->z / length;
+ return b;
+}
diff --git a/07-july/src/math/vector3f.h b/07-july/src/math/vector3f.h
new file mode 100644
index 0000000..ab255d1
--- /dev/null
+++ b/07-july/src/math/vector3f.h
@@ -0,0 +1,20 @@
+#ifndef VECTOR3F_H
+#define VECTOR3F_H
+
+#include <GL/glew.h>
+
+typedef struct
+{
+ GLfloat x, y, z;
+} vec3_t;
+
+extern vec3_t vec3_create(GLfloat x, GLfloat y, GLfloat z);
+extern vec3_t vec3_add(const vec3_t* a, const vec3_t* b);
+extern vec3_t vec3_sub(const vec3_t* a, const vec3_t* b);
+extern vec3_t vec3_scalar_mul(const vec3_t* a, GLfloat scalar);
+extern GLfloat vec3_dot_mul(const vec3_t* a, const vec3_t* b);
+extern vec3_t vec3_cross_mul(const vec3_t* a, const vec3_t* b);
+extern GLfloat vec3_length(vec3_t* a);
+extern vec3_t vec3_normalize(vec3_t* a);
+
+#endif // VECTOR3F_H
diff --git a/07-july/src/math/vector4f.c b/07-july/src/math/vector4f.c
new file mode 100644
index 0000000..735e679
--- /dev/null
+++ b/07-july/src/math/vector4f.c
@@ -0,0 +1,70 @@
+#include "vector4f.h"
+#include <SDL2/SDL.h>
+
+vec4_t vec4_create(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+ vec4_t a = {x, y, z, w};
+ return a;
+}
+
+vec4_t vec4_add(const vec4_t* a, const vec4_t* b)
+{
+ vec4_t c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ c.z = a->z + b->z;
+ c.w = a->w + b->w;
+ return c;
+}
+
+vec4_t vec4_sub(const vec4_t* a, const vec4_t* b)
+{
+ vec4_t c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ c.z = a->z - b->z;
+ c.w = a->w - b->w;
+ return c;
+}
+
+vec4_t vec4_scalar_mul(const vec4_t* a, GLfloat scalar)
+{
+ vec4_t c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ c.z = a->z * scalar;
+ c.w = a->w * scalar;
+ return c;
+}
+
+GLfloat vec4_dot_mul(const vec4_t* a, const vec4_t* b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) + (a->w * b->w) );
+}
+
+
+vec4_t vec4_cross_mul(const vec4_t* a, const vec4_t* b)
+{
+ vec4_t c;
+ c.x = (a->y * b->z) - (a->z * b->y);
+ c.y = (a->z * b->x) - (a->x * b->z);
+ c.z = (a->x * b->y) - (a->y * b->x);
+ c.w = 1.0f;
+ return c;
+}
+
+GLfloat vec4_length(vec4_t* a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f) + SDL_pow(a->w, 2.0f) );
+}
+
+vec4_t vec4_normalize(vec4_t* a)
+{
+ vec4_t b;
+ GLfloat length = vec4_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ b.z = a->z / length;
+ b.w = a->w / length;
+ return b;
+}
diff --git a/07-july/src/math/vector4f.h b/07-july/src/math/vector4f.h
new file mode 100644
index 0000000..4f83695
--- /dev/null
+++ b/07-july/src/math/vector4f.h
@@ -0,0 +1,20 @@
+#ifndef VECTOR4F_H
+#define VECTOR4F_H
+
+#include <GL/glew.h>
+
+typedef struct
+{
+ GLfloat x, y, z, w;
+} vec4_t;
+
+extern vec4_t vec4_create(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+extern vec4_t vec4_add(const vec4_t* a, const vec4_t* b);
+extern vec4_t vec4_sub(const vec4_t* a, const vec4_t* b);
+extern vec4_t vec4_scalar_mul(const vec4_t* a, GLfloat scalar);
+extern GLfloat vec4_dot_mul(const vec4_t* a, const vec4_t* b);
+extern vec4_t vec4_cross_mul(const vec4_t* a, const vec4_t* b);
+extern GLfloat vec4_length(vec4_t* a);
+extern vec4_t vec4_normalize(vec4_t* a);
+
+#endif // VECTOR4F_H
diff --git a/07-july/src/player.c b/07-july/src/player.c
new file mode 100644
index 0000000..02a417b
--- /dev/null
+++ b/07-july/src/player.c
@@ -0,0 +1,62 @@
+#include "player.h"
+#include "util/util_time.h"
+#include "input.h"
+#include "util/util.h"
+
+#define MAX_MOVEMENT_SPEED 10
+#define MAX_ROTATION_SPEED 100
+#define GRAVITY -15
+#define JUMP_POWER 7
+
+static void jump(player_t* player)
+{
+ player->verticalSpeed = JUMP_POWER;
+}
+
+static void check_input(player_t* player)
+{
+ if(Input_isKeyPressed(SDL_SCANCODE_W)) {
+ player->speed = MAX_MOVEMENT_SPEED;
+ } else if(Input_isKeyPressed(SDL_SCANCODE_S)) {
+ player->speed = -MAX_MOVEMENT_SPEED;
+ } else {
+ player->speed = 0.0f;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_A)) {
+ player->turnSpeed = MAX_ROTATION_SPEED;
+ } else if(Input_isKeyPressed(SDL_SCANCODE_D)) {
+ player->turnSpeed = -MAX_ROTATION_SPEED;
+ } else {
+ player->turnSpeed = 0.0f;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_SPACE)) {
+ jump(player);
+ }
+}
+
+void Player_Init(player_t* player)
+{
+ player->entity.position = vec3_create(0.0f, 6.0f, 0.0f);
+ player->entity.rotX = player->entity.rotY = player->entity.rotZ = 0;
+ player->speed = player->turnSpeed = player->verticalSpeed = 0;
+}
+
+void Player_Update(player_t *player, terrain_t *terrain)
+{
+ check_input(player);
+ player->entity.rotY += player->turnSpeed * Time_GetFrameTime();
+ player->entity.position.x += SDL_sinf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime();
+ player->entity.position.z += SDL_cosf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime();
+
+ player->verticalSpeed += GRAVITY * Time_GetFrameTime();
+
+ player->entity.position.y += player->verticalSpeed * Time_GetFrameTime();
+
+ GLfloat terrainHeight = Terrain_GetHeightOfTerrain(terrain, player->entity.position.x, player->entity.position.z);
+ if(player->entity.position.y - 1.0f < terrainHeight) {
+ player->entity.position.y = terrainHeight + 1.0f;
+ player->verticalSpeed = 0.0f;
+ }
+}
diff --git a/07-july/src/player.h b/07-july/src/player.h
new file mode 100644
index 0000000..654dc17
--- /dev/null
+++ b/07-july/src/player.h
@@ -0,0 +1,17 @@
+#ifndef PLAYER_H
+#define PLAYER_H
+
+#include "renderer/entity.h"
+#include "math/vector3f.h"
+#include "terrain.h"
+
+typedef struct
+{
+ entity_t entity;
+ float speed, turnSpeed, verticalSpeed;
+} player_t;
+
+extern void Player_Init(player_t* player);
+extern void Player_Update(player_t* player, terrain_t *terrain);
+
+#endif // PLAYER_H
diff --git a/07-july/src/renderer/entity.c b/07-july/src/renderer/entity.c
new file mode 100644
index 0000000..b96491d
--- /dev/null
+++ b/07-july/src/renderer/entity.c
@@ -0,0 +1,18 @@
+#include "entity.h"
+
+mat4_t Entity_GetModelTransform(entity_t* entity)
+{
+ mat4_t temp;
+ mat4_t rotation = mat4_rotate_x(entity->rotX);
+ temp = mat4_rotate_y(entity->rotY);
+ rotation = mat4_mul(&rotation, &temp);
+ temp = mat4_rotate_z(entity->rotZ);
+ rotation = mat4_mul(&rotation, &temp);
+
+ temp = mat4_translate(&entity->position);
+
+ mat4_t modelTransform = mat4_mul(&temp, &rotation);
+
+ return modelTransform;
+}
+
diff --git a/07-july/src/renderer/entity.h b/07-july/src/renderer/entity.h
new file mode 100644
index 0000000..8954c7f
--- /dev/null
+++ b/07-july/src/renderer/entity.h
@@ -0,0 +1,20 @@
+#ifndef ENTITY_H
+#define ENTITY_H
+
+#include "../math/vector3f.h"
+#include "../math/matrix4x4.h"
+
+#include "shape.h"
+#include "../texture.h"
+
+typedef struct
+{
+ shape_t *shape;
+ texture_t *texture;
+ vec3_t position;
+ float rotX, rotY, rotZ;
+} entity_t;
+
+extern mat4_t Entity_GetModelTransform(entity_t* entity);
+
+#endif // ENTITY_H
diff --git a/07-july/src/renderer/renderer.c b/07-july/src/renderer/renderer.c
new file mode 100644
index 0000000..5b8638c
--- /dev/null
+++ b/07-july/src/renderer/renderer.c
@@ -0,0 +1,98 @@
+#include "renderer.h"
+#include <string.h>
+
+static const int MAX_LIGHTS = 4;
+
+void Render_Init()
+{
+
+}
+
+void Render_LoadLights(Shader_Layout *layout, light_t *lights, int n)
+{
+ vec3_t light_positions[MAX_LIGHTS];
+ color_t light_colors[MAX_LIGHTS];
+ vec3_t attenuation[MAX_LIGHTS];
+
+ light_t defaultLight = { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f} };
+
+ int i;
+ for(i = 0; i < MAX_LIGHTS; i++)
+ {
+ if(i < MAX_LIGHTS)
+ {
+ light_positions[i] = lights[i].position;
+ light_colors[i] = lights[i].color;
+ attenuation[i] = lights[i].attenuation;
+ }
+ else
+ {
+ light_positions[i] = defaultLight.position;
+ light_colors[i] = defaultLight.color;
+ attenuation[i] = defaultLight.attenuation;
+ }
+
+ }
+
+ glUniform3fv(layout->lightPosition, MAX_LIGHTS, (float*)light_positions);
+ glUniform4fv(layout->lightColor, MAX_LIGHTS, (float*)light_colors);
+ glUniform3fv(layout->lightAttenuation, MAX_LIGHTS, (float*)attenuation);
+
+}
+
+void Render_DrawEntity(Shader_Layout *layout, mat4_t *projectedViewMatrix, entity_t *entity)
+{
+ glBindVertexArray(entity->shape->vao);
+
+ /*We need the model to world matrix in our shader in order to rotate the normals*/
+ mat4_t modelTransform = Entity_GetModelTransform(entity);
+ glUniformMatrix4fv(layout->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ mat4_t totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(layout->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ glActiveTexture(GL_TEXTURE0);
+ glUniform1i(layout->Texture, 0);
+ Texture_Bind(entity->texture);
+
+ glDrawElements(GL_TRIANGLES, entity->shape->num_indices, GL_UNSIGNED_SHORT, NULL);
+ glBindVertexArray(0);
+}
+
+void Render_DrawTerrain(Shader_Layout *layout, mat4_t *projectedViewMatrix, terrain_t *terrain)
+{
+ glBindVertexArray(terrain->shape->vao);
+
+ /* We need the model to world matrix in our shader in order to rotate the normals */
+ mat4_t modelTransform = mat4_translate(&terrain->position);
+ glUniformMatrix4fv(layout->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ mat4_t totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(layout->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ glUniform1i(layout->Texture_Background, 0);
+ glUniform1i(layout->Texture_R, 1);
+ glUniform1i(layout->Texture_G, 2);
+ glUniform1i(layout->Texture_B, 3);
+ glUniform1i(layout->Texture_BlendMap, 4);
+
+ glActiveTexture(GL_TEXTURE0);
+ Texture_Bind(terrain->textures.texture[0]);
+ glActiveTexture(GL_TEXTURE1);
+ Texture_Bind(terrain->textures.texture[1]);
+ glActiveTexture(GL_TEXTURE2);
+ Texture_Bind(terrain->textures.texture[2]);
+ glActiveTexture(GL_TEXTURE3);
+ Texture_Bind(terrain->textures.texture[3]);
+ glActiveTexture(GL_TEXTURE4);
+ Texture_Bind(terrain->blendmap);
+
+ glDrawElements(GL_TRIANGLES, terrain->shape->num_indices, GL_UNSIGNED_SHORT, NULL);
+
+ glBindVertexArray(0);
+}
+
+void Render_Quit()
+{
+
+}
diff --git a/07-july/src/renderer/renderer.h b/07-july/src/renderer/renderer.h
new file mode 100644
index 0000000..7d06fdc
--- /dev/null
+++ b/07-july/src/renderer/renderer.h
@@ -0,0 +1,15 @@
+#ifndef RENDERER_H
+#define RENDERER_H
+
+#include "../graphics/shaders.h"
+#include "entity.h"
+#include "../terrain.h"
+#include "../light.h"
+
+extern void Render_Init();
+extern void Render_LoadLights(Shader_Layout *layout, light_t *lights, int n);
+extern void Render_DrawEntity(Shader_Layout *layout, mat4_t *projectedViewMatrix, entity_t *entity);
+extern void Render_DrawTerrain(Shader_Layout *layout, mat4_t *projectedViewMatrix, terrain_t *terrain);
+extern void Render_Quit();
+
+#endif // RENDERER_H
diff --git a/07-july/src/renderer/shape.c b/07-july/src/renderer/shape.c
new file mode 100644
index 0000000..d48b847
--- /dev/null
+++ b/07-july/src/renderer/shape.c
@@ -0,0 +1,302 @@
+#include "shape.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "../util/util.h"
+
+#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)
+
+shape_t* Shape_CreateFromRawData(vertex_t* vertices, GLsizeiptr vertexBufferSize,
+ GLushort* indices, GLsizeiptr indexBufferSize)
+{
+ shape_t* shape = (shape_t*) malloc( sizeof(shape_t) );
+
+ shape->num_indices = ( indexBufferSize / sizeof(GLushort) );
+
+ glGenVertexArrays(1, &shape->vao);
+ glGenBuffers(1, &shape->vbo);
+ glGenBuffers(1, &shape->ebo);
+
+ glBindVertexArray(shape->vao);
+
+ glBindBuffer(GL_ARRAY_BUFFER, shape->vbo);
+ glBufferData(GL_ARRAY_BUFFER, vertexBufferSize, vertices, GL_STATIC_DRAW);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, shape->ebo);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBufferSize, indices, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+ glEnableVertexAttribArray(1);
+ glEnableVertexAttribArray(2);
+ glEnableVertexAttribArray(3);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, position) );
+ glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, color) );
+ glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, texCoord) );
+ glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, normal) );
+
+ glBindVertexArray(0);
+
+ return shape;
+}
+
+shape_t* Shape_MakeCube()
+{
+ vertex_t data[] =
+ {
+ { {-1.0f, +1.0f, +1.0f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.0f, +1.0f, +0.0f} },
+ { {+1.0f, +1.0f, +1.0f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 1.0f}, {+0.0f, +1.0f, +0.0f} },
+ { {+1.0f, +1.0f, -1.0f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {1.0f, 1.0f}, {+0.0f, +1.0f, +0.0f} },
+ { {-1.0f, +1.0f, -1.0f}, {+1.0f, +1.0f, +1.0f, +1.0f}, {1.0f, 0.0f}, {+0.0f, +1.0f, +0.0f} },
+
+ { {-1.0f, +1.0f, -1.0f}, {+1.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.0f, +0.0f, -1.0f} },
+ { {+1.0f, +1.0f, -1.0f}, {+0.0f, +0.5f, +0.2f, +1.0f}, {0.0f, 1.0f}, {+0.0f, +0.0f, -1.0f} },
+ { {+1.0f, -1.0f, -1.0f}, {+0.8f, +0.6f, +0.4f, +1.0f}, {1.0f, 1.0f}, {+0.0f, +0.0f, -1.0f} },
+ { {-1.0f, -1.0f, -1.0f}, {+0.3f, +1.0f, +0.5f, +1.0f}, {1.0f, 0.0f}, {+0.0f, +0.0f, -1.0f} },
+
+ { {+1.0f, +1.0f, -1.0f}, {+0.2f, +0.5f, +0.2f, +1.0f}, {0.0f, 0.0f}, {+1.0f, +0.0f, +0.0f} },
+ { {+1.0f, +1.0f, +1.0f}, {+0.9f, +0.3f, +0.7f, +1.0f}, {0.0f, 1.0f}, {+1.0f, +0.0f, +0.0f} },
+ { {+1.0f, -1.0f, +1.0f}, {+0.3f, +0.7f, +0.5f, +1.0f}, {1.0f, 1.0f}, {+1.0f, +0.0f, +0.0f} },
+ { {+1.0f, -1.0f, -1.0f}, {+0.5f, +0.7f, +0.5f, +1.0f}, {1.0f, 0.0f}, {+1.0f, +0.0f, +0.0f} },
+
+ { {-1.0f, +1.0f, +1.0f}, {+0.7f, +0.8f, +0.2f, +1.0f}, {0.0f, 0.0f}, {-1.0f, +0.0f, +0.0f} },
+ { {-1.0f, +1.0f, -1.0f}, {+0.5f, +0.7f, +0.3f, +1.0f}, {0.0f, 1.0f}, {-1.0f, +0.0f, +0.0f} },
+ { {-1.0f, -1.0f, -1.0f}, {+0.4f, +0.7f, +0.7f, +1.0f}, {1.0f, 1.0f}, {-1.0f, +0.0f, +0.0f} },
+ { {-1.0f, -1.0f, +1.0f}, {+0.2f, +0.5f, +1.0f, +1.0f}, {1.0f, 0.0f}, {-1.0f, +0.0f, +0.0f} },
+
+ { {+1.0f, +1.0f, +1.0f}, {+0.6f, +1.0f, +0.7f, +1.0f}, {0.0f, 0.0f}, {+0.0f, +0.0f, +1.0f} },
+ { {-1.0f, +1.0f, +1.0f}, {+0.6f, +0.4f, +0.8f, +1.0f}, {0.0f, 1.0f}, {+0.0f, +0.0f, +1.0f} },
+ { {-1.0f, -1.0f, +1.0f}, {+0.2f, +0.8f, +0.7f, +1.0f}, {1.0f, 1.0f}, {+0.0f, +0.0f, +1.0f} },
+ { {+1.0f, -1.0f, +1.0f}, {+0.2f, +0.7f, +1.0f, +1.0f}, {1.0f, 0.0f}, {+0.0f, +0.0f, +1.0f} },
+
+ { {+1.0f, -1.0f, -1.0f}, {+0.8f, +0.3f, +0.7f, +1.0f}, {0.0f, 0.0f}, {+0.0f, -1.0f, +0.0f} },
+ { {-1.0f, -1.0f, -1.0f}, {+0.8f, +0.9f, +0.5f, +1.0f}, {0.0f, 1.0f}, {+0.0f, -1.0f, +0.0f} },
+ { {-1.0f, -1.0f, +1.0f}, {+0.5f, +0.8f, +0.5f, +1.0f}, {1.0f, 1.0f}, {+0.0f, -1.0f, +0.0f} },
+ { {+1.0f, -1.0f, +1.0f}, {+0.9f, +1.0f, +0.2f, +1.0f}, {1.0f, 0.0f}, {+0.0f, -1.0f, +0.0f} },
+ };
+
+ GLushort indices[] = {
+ 0, 1, 2, 0, 2, 3, // Top
+ 4, 5, 6, 4, 6, 7, // Front
+ 8, 9, 10, 8, 10, 11, // Right
+ 12, 13, 14, 12, 14, 15, // Left
+ 16, 17, 18, 16, 18, 19, // Back
+ 20, 22, 21, 20, 23, 22, // Bottom
+ };
+
+ GLsizeiptr vertexBufferSize = NUM_ARRAY_ELEMENTS(data) * sizeof(vertex_t);
+ GLsizeiptr indexBufferSize = NUM_ARRAY_ELEMENTS(indices) * sizeof(GLushort);
+
+ return Shape_CreateFromRawData(data, vertexBufferSize, indices, indexBufferSize);
+}
+
+shape_t* Shape_MakeArrow()
+{
+ vertex_t data[] =
+ {
+ // Top side of arrow head
+ { {+0.00f, +0.25f, -0.25f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ { {+0.50f, +0.25f, -0.25f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ { {+0.00f, +0.25f, -1.00f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ { {-0.50f, +0.25f, -0.25f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ // Bottom side of arrow head
+ { {+0.00f, -0.25f, -0.25f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ { {+0.50f, -0.25f, -0.25f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ { {+0.00f, -0.25f, -1.00f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ { {-0.50f, -0.25f, -0.25f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ // Right side of arrow tip
+ { {+0.50f, +0.25f, -0.25f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {0.83205032f, 0.00f, -0.55470026f} },
+ { {+0.00f, +0.25f, -1.00f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {0.83205032f, 0.00f, -0.55470026f} },
+ { {+0.00f, -0.25f, -1.00f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {0.83205032f, 0.00f, -0.55470026f} },
+ { {+0.50f, -0.25f, -0.25f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {0.83205032f, 0.00f, -0.55470026f} },
+ // Left side of arrow tip
+ { {+0.00f, +0.25f, -1.00f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-0.55708605f, 0.00f, -0.37139067f} },
+ { {-0.50f, +0.25f, -0.25f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-0.55708605f, 0.00f, -0.37139067f} },
+ { {+0.00f, -0.25f, -1.00f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-0.55708605f, 0.00f, -0.37139067f} },
+ { {-0.50f, -0.25f, -0.25f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-0.55708605f, 0.00f, -0.37139067f} },
+ // Back side of arrow tip
+ { {-0.50f, +0.25f, -0.25f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ { {+0.50f, +0.25f, -0.25f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ { {-0.50f, -0.25f, -0.25f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ { {+0.50f, -0.25f, -0.25f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ // Top side of back of arrow
+ { {+0.25f, +0.25f, -0.25f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ { {+0.25f, +0.25f, +1.00f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ { {-0.25f, +0.25f, +1.00f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ { {-0.25f, +0.25f, -0.25f}, {+1.0f, +0.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +1.00f, +0.00f} },
+ // Bottom side of back of arrow
+ { {+0.25f, -0.25f, -0.25f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ { {+0.25f, -0.25f, +1.00f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ { {-0.25f, -0.25f, +1.00f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ { {-0.25f, -0.25f, -0.25f}, {+0.0f, +0.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.00f, -1.00f, +0.00f} },
+ // Right side of back of arrow
+ { {+0.25f, +0.25f, -0.25f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+1.00f, +0.00f, +0.00f} },
+ { {+0.25f, -0.25f, -0.25f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+1.00f, +0.00f, +0.00f} },
+ { {+0.25f, -0.25f, +1.00f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+1.00f, +0.00f, +0.00f} },
+ { {+0.25f, +0.25f, +1.00f}, {+0.6f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {+1.00f, +0.00f, +0.00f} },
+ // Left side of back of arrow
+ { {-0.25f, +0.25f, -0.25f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-1.00f, +0.00f, +0.00f} },
+ { {-0.25f, -0.25f, -0.25f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-1.00f, +0.00f, +0.00f} },
+ { {-0.25f, -0.25f, +1.00f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-1.00f, +0.00f, +0.00f} },
+ { {-0.25f, +0.25f, +1.00f}, {+0.0f, +1.0f, +0.0f, +1.0f}, {0.0f, 0.0f}, {-1.00f, +0.00f, +0.00f} },
+ // Back side of back of arrow
+ { {-0.25f, +0.25f, +1.00f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ { {+0.25f, +0.25f, +1.00f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ { {-0.25f, -0.25f, +1.00f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ { {+0.25f, -0.25f, +1.00f}, {+0.5f, +0.5f, +0.5f, +1.0f}, {0.0f, 0.0f}, {+0.00f, +0.00f, +1.00f} },
+ };
+
+ GLushort indices[] = {
+ 0, 1, 2, // Top
+ 0, 2, 3,
+ 4, 6, 5, // Bottom
+ 4, 7, 6,
+ 8, 10, 9, // Right side of arrow tip
+ 8, 11, 10,
+ 12, 15, 13, // Left side of arrow tip
+ 12, 14, 15,
+ 16, 19, 17, // Back side of arrow tip
+ 16, 18, 19,
+ 20, 22, 21, // Top side of back of arrow
+ 20, 23, 22,
+ 24, 25, 26, // Bottom side of back of arrow
+ 24, 26, 27,
+ 28, 30, 29, // Right side of back of arrow
+ 28, 31, 30,
+ 32, 33, 34, // Left side of back of arrow
+ 32, 34, 35,
+ 36, 39, 37, // Back side of back of arrow
+ 36, 38, 39,
+ };
+
+ GLsizeiptr vertexBufferSize = NUM_ARRAY_ELEMENTS(data) * sizeof(vertex_t);
+ GLsizeiptr indexBufferSize = NUM_ARRAY_ELEMENTS(indices) * sizeof(GLushort);
+
+ return Shape_CreateFromRawData(data, vertexBufferSize, indices, indexBufferSize);
+}
+
+shape_t* Shape_MakeQuad()
+{
+ vertex_t data[] =
+ {
+ { {+1.0f, +1.0f, +0.0f}, {+1.0f, +1.0f, +1.0f, +1.0f}, {1.0f, 1.0f}, {+0.0f, +0.0f, +1.0f} },
+ { {-1.0f, +1.0f, +0.0f}, {+1.0f, +1.0f, +1.0f, +1.0f}, {0.0f, 1.0f}, {+0.0f, +0.0f, +1.0f} },
+ { {+1.0f, -1.0f, +0.0f}, {+1.0f, +1.0f, +1.0f, +1.0f}, {1.0f, 0.0f}, {+0.0f, +0.0f, +1.0f} },
+ { {-1.0f, -1.0f, +0.0f}, {+1.0f, +1.0f, +1.0f, +1.0f}, {0.0f, 0.0f}, {+0.0f, +0.0f, +1.0f} },
+ };
+
+ GLushort indices[] =
+ {
+ 0, 1, 2, 1, 3, 2
+ };
+
+ GLsizeiptr vertexBufferSize = NUM_ARRAY_ELEMENTS(data) * sizeof(vertex_t);
+ GLsizeiptr indexBufferSize = NUM_ARRAY_ELEMENTS(indices) * sizeof(GLushort);
+
+ return Shape_CreateFromRawData(data, vertexBufferSize, indices, indexBufferSize);
+}
+
+#define BUFFER_SIZE 128
+
+shape_t* Shape_LoadOBJ(const char* path)
+{
+ vec3_t* vertices = NULL;
+ vec2_t* textures = NULL;
+ vec3_t* normals = NULL;
+
+ vertex_t* data = NULL;
+ GLushort* indices = NULL;
+
+ unsigned int vertices_count = 0, textures_count = 0, normals_count = 0, index_pointer = 0, faces_count = 0;
+ int count = 0;
+ int texture[3], normal[3], verts[3];
+
+ FILE* file = fopen(path, "r");
+ if(file == NULL)
+ Util_FatalError(".obj file could not be loaded!");
+
+ char buffer[BUFFER_SIZE];
+ while(!feof(file))
+ {
+ fgets(buffer, BUFFER_SIZE, file);
+ switch(buffer[0])
+ {
+ case 'v':
+ if(buffer[1] == 't') {
+ textures = (vec2_t*) realloc(textures, sizeof(vec2_t) * (++textures_count) );
+ count = sscanf(buffer, "vt %f %f\n", &textures[textures_count-1].x, &textures[textures_count-1].y);
+ if(count != 2)
+ Util_FatalError("Bad texture coordinates on .obj file");
+ } else if(buffer[1] == 'n') {
+ normals = (vec3_t*) realloc(normals, sizeof(vec3_t) * (++normals_count) );
+ count = sscanf(buffer, "vn %f %f %f\n", &normals[normals_count-1].x,
+ &normals[normals_count-1].y, &normals[normals_count-1].z);
+ if(count != 3)
+ Util_FatalError("Bad normals data on .obj file");
+ } else {
+ vertices = (vec3_t*) realloc(vertices, sizeof(vec3_t) * (++vertices_count) );
+ count = sscanf(buffer, "v %f %f %f\n", &vertices[vertices_count-1].x,
+ &vertices[vertices_count-1].y, &vertices[vertices_count-1].z);
+ if(count != 3)
+ Util_FatalError("Bad vertices data on .obj file");
+ }
+ break;
+ case 'f':
+ data = (vertex_t*) realloc( data, sizeof(vertex_t) * (++faces_count * 3) );
+ indices = (GLushort*) realloc( indices, sizeof(GLushort) * (++faces_count * 3) );
+
+ count = sscanf(buffer, "f %d/%d/%d %d/%d/%d %d/%d/%d\n",
+ &verts[0], &texture[0], &normal[0], &verts[1], &texture[1], &normal[1],
+ &verts[2], &texture[2], &normal[2]);
+ if(count != 9)
+ Util_FatalError("Bad face data on .obj file");
+
+ indices[index_pointer] = index_pointer;
+ data[index_pointer].position = vertices[verts[0]-1];
+ data[index_pointer].texCoord = textures[texture[0]-1];
+ data[index_pointer++].normal = normals[normal[0]-1];
+
+ indices[index_pointer] = index_pointer;
+ data[index_pointer].position = vertices[verts[1]-1];
+ data[index_pointer].texCoord = textures[texture[1]-1];
+ data[index_pointer++].normal = normals[normal[1]-1];
+
+ indices[index_pointer] = index_pointer;
+ data[index_pointer].position = vertices[verts[2]-1];
+ data[index_pointer].texCoord = textures[texture[2]-1];
+ data[index_pointer++].normal = normals[normal[2]-1];
+
+ break;
+ default:
+ break;
+ }
+ }
+
+ free(vertices);
+ free(normals);
+ free(textures);
+ fclose(file);
+
+ /*Remember, each face contains 3 vertex -> (faces_count * 3)*/
+
+ GLsizeiptr vertexBufferSize = faces_count * sizeof(vertex_t) * 3;
+ GLsizeiptr indexBufferSize = faces_count * sizeof(GLushort) * 3;
+
+ shape_t* shape = Shape_CreateFromRawData(data, vertexBufferSize, indices, indexBufferSize);
+
+ free(data);
+ free(indices);
+
+ return shape;
+}
+
+void Shape_Free(shape_t* shape)
+{
+ if(shape)
+ {
+ glDeleteBuffers(1, &shape->vbo);
+ glDeleteBuffers(1, &shape->ebo);
+ glDeleteVertexArrays(1, &shape->vao);
+ free(shape);
+ }
+}
diff --git a/07-july/src/renderer/shape.h b/07-july/src/renderer/shape.h
new file mode 100644
index 0000000..b019333
--- /dev/null
+++ b/07-july/src/renderer/shape.h
@@ -0,0 +1,25 @@
+#ifndef SHAPE_H
+#define SHAPE_H
+
+#include "../vertex.h"
+
+typedef struct
+{
+ GLuint num_indices;
+ GLuint vbo, ebo, vao;
+} shape_t;
+
+extern shape_t* Shape_MakeCube();
+extern shape_t* Shape_MakeArrow();
+extern shape_t* Shape_MakeQuad();
+
+extern shape_t* Shape_LoadOBJ(const char* path);
+
+extern shape_t* Shape_CreateFromRawData(vertex_t* vertices, GLsizeiptr vertexBufferSize,
+ GLushort* indices, GLsizeiptr indexBufferSize);
+
+extern void Shape_Free(shape_t* shape);
+
+
+
+#endif // SHAPE_H
diff --git a/07-july/src/terrain.c b/07-july/src/terrain.c
new file mode 100644
index 0000000..3bc66d2
--- /dev/null
+++ b/07-july/src/terrain.c
@@ -0,0 +1,163 @@
+#include "terrain.h"
+#include "math/math_util.h"
+#include "math/vector3f.h"
+#include "util/util.h"
+
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+#include <math.h>
+
+#define PLANE_SIZE 128
+#define PLANE_MAX_HEIGHT 10
+
+#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)
+
+static float GetHeight(int x, int y, SDL_Surface* surface)
+{
+ if(x < 0 || x >= surface->w || y < 0 || y >= surface->h)
+ return 0.0f;
+
+ Uint32 pixel = ( (Uint32*)surface->pixels )[y * surface->w + x];
+ Uint8 r, g, b;
+ SDL_GetRGB(pixel, surface->format, &r, &g, &b);
+
+ float height = (float)r / 255.0f;
+
+ return height * 40.0f;
+}
+
+static vec3_t GenerateNomal(int x, int y, SDL_Surface* surface)
+{
+ float hLeft = GetHeight(x-1, y, surface);
+ float hRight = GetHeight(x+1, y, surface);
+ float hUp = GetHeight(x, y+1, surface);
+ float hDown = GetHeight(x, y-1, surface);
+
+ vec3_t normal = { hLeft - hRight, 2.0f, hDown - hUp};
+ return vec3_normalize(&normal);
+}
+
+GLfloat Terrain_GetHeightOfTerrain(terrain_t* terrain, GLfloat x, GLfloat z)
+{
+ GLfloat terrainX = x - terrain->position.x;
+ GLfloat terrainZ = z - terrain->position.z;
+
+ GLfloat gridSquareSize = (float)terrain->l / ( (float)PLANE_SIZE - 1 );
+
+ GLint gridX = (GLint) floor(terrainX / gridSquareSize);
+ GLint gridZ = (GLint) floor(terrainZ / gridSquareSize);
+
+ if(gridX >= PLANE_SIZE - 1 || gridX < 0 || gridZ >= PLANE_SIZE - 1 || gridZ < 0)
+ {
+ printf("called\n");
+ return 0;
+ }
+
+ GLfloat xCoord = fmod(terrainX, gridSquareSize) / gridSquareSize;
+ GLfloat zCoord = fmod(terrainZ, gridSquareSize) / gridSquareSize;
+ GLfloat answer;
+
+ /* Determine in which triangle of the square are we. "Bary Centric Interpolation"*/
+ if(xCoord <= (1 - zCoord)){
+ /* 0, heights[gridX][gridZ], 0) */
+ vec3_t p1 = { 0, terrain->height[ gridX * PLANE_SIZE + gridZ ], 0 };
+ /* 1, heights[gridX + 1][gridZ], 0) */
+ vec3_t p2 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + gridZ ], 0};
+ /* 0, heights[gridX][gridZ + 1], 1) */
+ vec3_t p3 = { 0, terrain->height[ gridX * PLANE_SIZE + (gridZ + 1) ], 1};
+
+ vec2_t pos = {xCoord, zCoord};
+
+ answer = baryCentric(&p1, &p2, &p3, &pos);
+ } else {
+ /* (1, heights[gridX + 1][gridZ], 0) */
+ vec3_t p1 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + gridZ ], 0 };
+ /* (1, heights[gridX + 1][gridZ + 1], 1) */
+ vec3_t p2 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + (gridZ + 1) ], 1};
+ /* (0, heights[gridX][gridZ + 1], 1) */
+ vec3_t p3 = { 0, terrain->height[ gridX * PLANE_SIZE + (gridZ + 1) ], 1};
+ vec2_t pos = {xCoord, zCoord};
+
+ answer = baryCentric(&p1, &p2, &p3, &pos);
+ }
+
+ return answer;
+}
+
+terrain_t *Terrain_Create( int w, int l, const char* heightmap_path, texture_t *blendmap, TerrainTexturePack *textures )
+{
+ terrain_t *terrain = (terrain_t*) malloc( sizeof(terrain_t) );
+ terrain->height = (GLfloat*) malloc( sizeof(GLfloat) * PLANE_SIZE * PLANE_SIZE);
+
+ terrain->blendmap = blendmap;
+ terrain->w = w; terrain->l = l;
+ terrain->textures = *textures;
+
+ SDL_Surface* surface = IMG_Load(heightmap_path);
+ if(surface == NULL)
+ Util_FatalError("Heightmap file could not be loaded\n");
+
+ vertex_t data[PLANE_SIZE * PLANE_SIZE];
+ int x, y;
+ for(x = 0; x < PLANE_SIZE; x++)
+ {
+ for(y = 0; y < PLANE_SIZE; y++)
+ {
+ vertex_t* v = &data[y + x * PLANE_SIZE];
+ v->position = vec3_create( (float)x / (float)PLANE_SIZE, 0.0f, (float)y / (float)PLANE_SIZE);
+ /* Heightmap cordinates */
+ int image_x = v->position.x * surface->w, image_y = v->position.z * surface->h;
+
+ v->texCoord = vec2_create( v->position.x, v->position.z);
+ GLfloat height = GetHeight(image_x, image_y, surface);
+ terrain->height[y + x * PLANE_SIZE] = height;
+ v->position.y = height;
+ v->position.x *= w;
+ v->position.z *= l;
+
+ v->normal = GenerateNomal(image_x, image_y, surface);
+ color_t temp = {+1.0f, +0.0f, +0.0f, +1.0f};
+ v->color = temp;
+ }
+ }
+
+ int runner = 0;
+ GLushort indices[ (PLANE_SIZE-1) * (PLANE_SIZE-1) * 6 ];
+ for(x = 0; x < PLANE_SIZE-1; x++)
+ {
+ for(y = 0; y < PLANE_SIZE-1; y++)
+ {
+ indices[runner++] = PLANE_SIZE * x + y;
+ indices[runner++] = PLANE_SIZE * x + y + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE;
+
+ indices[runner++] = PLANE_SIZE * x + y + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE;
+ }
+ }
+
+ GLsizeiptr vertexBufferSize = NUM_ARRAY_ELEMENTS(data) * sizeof(vertex_t);
+ GLsizeiptr indexBufferSize = NUM_ARRAY_ELEMENTS(indices) * sizeof(GLushort);
+
+ SDL_FreeSurface(surface);
+
+ terrain->shape = Shape_CreateFromRawData(data, vertexBufferSize, indices, indexBufferSize);
+ return terrain;
+}
+
+void Terrain_Destroy( terrain_t* terrain )
+{
+ if(terrain->height)
+ free(terrain->height);
+
+ Shape_Free(terrain->shape);
+
+ int i;
+ for(i = 0; i < 4; i++)
+ Texture_Destroy(terrain->textures.texture[i]);
+
+ Texture_Destroy(terrain->blendmap);
+ free(terrain);
+}
+
diff --git a/07-july/src/terrain.h b/07-july/src/terrain.h
new file mode 100644
index 0000000..74e9f33
--- /dev/null
+++ b/07-july/src/terrain.h
@@ -0,0 +1,27 @@
+#ifndef TERRAIN_H
+#define TERRAIN_H
+
+#include "renderer/shape.h"
+#include "texture.h"
+
+typedef struct
+{
+ texture_t *texture[4];
+} TerrainTexturePack;
+
+typedef struct
+{
+ shape_t *shape;
+ texture_t *blendmap;
+ TerrainTexturePack textures;
+
+ GLfloat *height;
+ int w, l;
+ vec3_t position;
+} terrain_t;
+
+extern terrain_t *Terrain_Create( int w, int l, const char* heightmap_path, texture_t *blendmap, TerrainTexturePack *textures);
+extern GLfloat Terrain_GetHeightOfTerrain(terrain_t* terrain, GLfloat x, GLfloat z);
+extern void Terrain_Destroy( terrain_t *terrain );
+
+#endif // TERRAIN_H
diff --git a/07-july/src/texture.c b/07-july/src/texture.c
new file mode 100644
index 0000000..26fddde
--- /dev/null
+++ b/07-july/src/texture.c
@@ -0,0 +1,47 @@
+#include "texture.h"
+#include "util/util.h"
+
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+
+texture_t* Texture_Create( const char* path )
+{
+ texture_t* texture = (texture_t*) malloc( sizeof(texture_t) );
+ SDL_Surface* data = IMG_Load(path);
+ if(data == NULL)
+ Util_FatalError("Texture could not be found!\n");
+
+ glGenTextures(1, &texture->ID);
+ glBindTexture(GL_TEXTURE_2D, texture->ID);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
+ glGenerateMipmap(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+
+ SDL_FreeSurface(data);
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ texture->width = data->w;
+ texture->height = data->h;
+
+ return texture;
+}
+
+void Texture_Bind(texture_t* texture)
+{
+ glBindTexture(GL_TEXTURE_2D, texture->ID);
+}
+
+void Texture_Unbind()
+{
+ glBindTexture(GL_TEXTURE_2D, 0);
+}
+
+void Texture_Destroy(texture_t* texture)
+{
+ glDeleteTextures(1, &texture->ID);
+ free(texture);
+}
diff --git a/07-july/src/texture.h b/07-july/src/texture.h
new file mode 100644
index 0000000..98048b5
--- /dev/null
+++ b/07-july/src/texture.h
@@ -0,0 +1,18 @@
+#ifndef TEXTURE_H
+#define TEXTURE_H
+
+#include <GL/glew.h>
+
+typedef struct
+{
+ GLuint ID;
+ GLuint width, height;
+} texture_t;
+
+extern texture_t* Texture_Create( const char* path );
+extern void Texture_Destroy( texture_t* texture );
+
+extern void Texture_Bind(texture_t* texture);
+extern void Texture_Unbind();
+
+#endif // TEXTURE_H
diff --git a/07-july/src/util/util.c b/07-july/src/util/util.c
new file mode 100644
index 0000000..fcdd665
--- /dev/null
+++ b/07-july/src/util/util.c
@@ -0,0 +1,49 @@
+#include "util.h"
+
+#include <SDL2/SDL.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+void Util_FatalError( const char* error )
+{
+ fprintf(stderr, "Fatal Error:\n%s", error);
+ SDL_Quit();
+ exit(1);
+}
+
+char* Util_LoadFile( const char* path )
+{
+ FILE* file = fopen( path, "r" );
+
+ if(file == NULL)
+ {
+ const char* temp = " could not be found\n";
+ size_t length = strlen(temp);
+ length += strlen(path);
+ char buffer[length];
+ strcpy(buffer, path);
+ strcat(buffer, temp);
+ Util_FatalError(buffer);
+ }
+
+ fseek( file, 0, SEEK_END );
+ size_t sizeOfFile = ftell( file );
+ fseek( file, 0, SEEK_SET );
+ char* file_data = (char*) malloc( sizeof(char)*sizeOfFile + 1 );
+ fread( file_data, sizeof(char), sizeOfFile, file );
+ file_data[sizeOfFile] = '\0';
+ fclose(file);
+ return file_data;
+}
+
+float Util_RandomF(float min, float max)
+{
+ return ( min + (float)rand() ) / ( (float)RAND_MAX / (max-min) );
+}
+
+int Util_RandomI(int min, int max)
+{
+ return ( rand()%(max-min) ) + min;
+}
diff --git a/07-july/src/util/util.h b/07-july/src/util/util.h
new file mode 100644
index 0000000..5f82f30
--- /dev/null
+++ b/07-july/src/util/util.h
@@ -0,0 +1,19 @@
+#ifndef UTIL_H
+#define UTIL_H
+
+#define toRadians(degrees) (degrees * 3.1415926 / 180.0f)
+#define toDegrees(radians) (radians * 180.0f / 3.1415926)
+
+#ifdef DEBUG
+#include <stdio.h>
+#define myAssert(expr) expr ? 1==1 : fprintf(stderr, "The expresion was not true\n")
+#else
+#define myAssert(expr)
+#endif // DEBUG
+
+extern void Util_FatalError( const char* error );
+extern char* Util_LoadFile( const char* path );
+extern float Util_RandomF(float min, float max);
+extern int Util_RandomI(int min, int max);
+
+#endif // UTIL_H
diff --git a/07-july/src/util/util_time.c b/07-july/src/util/util_time.c
new file mode 100644
index 0000000..b601379
--- /dev/null
+++ b/07-july/src/util/util_time.c
@@ -0,0 +1,52 @@
+#include "util_time.h"
+
+static struct
+{
+ float max_ticks_per_frame; //< cuantos ticks (tiempo demora) un frame
+ Uint32 counted_frames; //< cuantos frames han pasado
+ Uint32 start_ticks; //< ticks al iniciar la iteracion del loop
+ Uint32 beg_ticks; //< ticks desde el inicio del juego
+ Uint32 time_per_frame;
+} TIME = {
+ 1000.0f / 60.0f,
+ 0, 0, 0, 0
+};
+
+void Time_Init()
+{
+ TIME.beg_ticks = SDL_GetTicks();
+}
+
+void Time_Begin()
+{
+ TIME.start_ticks = SDL_GetTicks();
+}
+
+float Time_End()
+{
+ TIME.counted_frames += 1;
+ float FPS = TIME.counted_frames / ( (float)(SDL_GetTicks() - TIME.beg_ticks) / 1000.f );
+
+ float frameTicks = (float)(SDL_GetTicks() - TIME.start_ticks);
+ TIME.time_per_frame = frameTicks;
+ if(frameTicks < TIME.max_ticks_per_frame){
+ SDL_Delay( (Uint32)(TIME.max_ticks_per_frame - frameTicks) );
+ }
+
+ return FPS;
+}
+
+float Time_GetFrameTime()
+{
+ return (float)TIME.time_per_frame / 1000.0f;
+}
+
+void Time_SetMaxFramesPerSecond(Uint32 frames)
+{
+ TIME.max_ticks_per_frame = 1000.0f / (float)frames;
+}
+
+Uint32 Time_GetCountedFrames()
+{
+ return TIME.counted_frames;
+}
diff --git a/07-july/src/util/util_time.h b/07-july/src/util/util_time.h
new file mode 100644
index 0000000..3c3e470
--- /dev/null
+++ b/07-july/src/util/util_time.h
@@ -0,0 +1,13 @@
+#ifndef UTIL_TIME_H
+#define UTIL_TIME_H
+
+#include <SDL2/SDL.h>
+
+extern void Time_Init( void );
+extern void Time_Begin( void );
+extern float Time_End( void );
+extern void Time_SetMaxFramesPerSecond(Uint32 frames);
+extern float Time_GetFrameTime( void );
+extern Uint32 Time_GetCountedFrames( void );
+
+#endif // UTIL_TIME_H
diff --git a/07-july/src/vertex.h b/07-july/src/vertex.h
new file mode 100644
index 0000000..90152c8
--- /dev/null
+++ b/07-july/src/vertex.h
@@ -0,0 +1,21 @@
+#ifndef VERTEX_H
+#define VERTEX_H
+
+#include <GL/glew.h>
+#include "math/vector2f.h"
+#include "math/vector3f.h"
+
+typedef struct
+{
+ GLfloat r, g, b, a;
+} color_t;
+
+typedef struct
+{
+ vec3_t position;
+ color_t color;
+ vec2_t texCoord;
+ vec3_t normal;
+} vertex_t;
+
+#endif // VERTEX_H
diff --git a/08-august/Makefile b/08-august/Makefile
new file mode 100644
index 0000000..4619f3c
--- /dev/null
+++ b/08-august/Makefile
@@ -0,0 +1,20 @@
+SRC=$(wildcard src/*.c)\
+ $(wildcard src/math/*.c)\
+ $(wildcard src/graphics/*.c)\
+ $(wildcard src/renderer/*.c)\
+ $(wildcard src/util/*.c)
+OBJ=$(SRC:%.c=%.o)
+TARGET=game
+LDFLAGS=-lSDL2 -lGL -lGLEW -lm -lSDL2_image
+
+%.o : %.c
+ $(CC) -c $< -o $@
+
+$(TARGET) : $(OBJ)
+ $(CC) $(OBJ) -o $(TARGET) $(LDFLAGS)
+
+all : $(TARGET)
+
+.PHONY : clean
+clean:
+ rm -rf $(TARGET) $(OBJ)
diff --git a/08-august/resources/barrel.obj b/08-august/resources/barrel.obj
new file mode 100644
index 0000000..70b1ccc
--- /dev/null
+++ b/08-august/resources/barrel.obj
@@ -0,0 +1,4970 @@
+# Blender v2.67 (sub 0) OBJ File: 'Wooden Barrel.blend'
+# www.blender.org
+o Mesh_Mesh_Cylinder.001
+v -0.787850 -6.030530 -3.960651
+v -1.545395 -6.030530 -3.730846
+v -2.243551 -6.030530 -3.357669
+v -2.855488 -6.030530 -2.855458
+v -3.357692 -6.030530 -2.243515
+v -3.730861 -6.030530 -1.545355
+v -3.960657 -6.030532 -0.787808
+v -4.038247 -6.030532 0.000014
+v -3.960650 -6.030532 0.787834
+v -3.730849 -6.030532 1.545380
+v -3.357673 -6.030532 2.243535
+v -2.855464 -6.030532 2.855475
+v -2.243523 -6.030532 3.357681
+v -1.545364 -6.030532 3.730853
+v -0.787818 -6.030532 3.960649
+v 0.000003 -6.030532 4.038245
+v 0.787825 -6.030532 3.960649
+v 1.545370 -6.030532 3.730852
+v 2.243529 -6.030532 3.357675
+v 2.855470 -6.030532 2.855470
+v 3.357677 -6.030532 2.243530
+v 3.730851 -6.030532 1.545371
+v 3.960651 -6.030532 0.787827
+v 4.038246 -6.030532 0.000006
+v 3.960654 -6.030532 -0.787817
+v 3.730856 -6.030530 -1.545366
+v 3.357683 -6.030530 -2.243527
+v 2.855477 -6.030530 -2.855469
+v 2.243536 -6.030530 -3.357678
+v 1.545376 -6.030530 -3.730854
+v 0.787829 -6.030530 -3.960654
+v 0.000006 -6.030530 -4.038250
+v 0.000000 -6.026094 -0.000003
+v 0.814696 5.429936 -4.095735
+v 0.000003 5.429936 -4.175975
+v 0.000003 -5.429935 -4.175979
+v 0.814696 -5.429935 -4.095738
+v 1.598080 5.429936 -3.858098
+v 1.598080 -5.429935 -3.858101
+v 2.320051 5.429936 -3.472194
+v 2.320051 -5.429935 -3.472198
+v 2.952864 5.429936 -2.952858
+v 2.952864 -5.429935 -2.952862
+v 3.472199 5.429936 -2.320044
+v 3.472199 -5.429935 -2.320048
+v 3.858100 5.429936 -1.598074
+v 3.858100 -5.429935 -1.598077
+v 4.095736 5.429935 -0.814688
+v 4.095736 -5.429937 -0.814691
+v 4.175976 5.429935 0.000005
+v 4.175976 -5.429937 0.000001
+v 4.095734 5.429935 0.814698
+v 4.095734 -5.429937 0.814694
+v 3.858097 5.429935 1.598080
+v 3.858097 -5.429937 1.598076
+v 3.472195 5.429935 2.320050
+v 3.472195 -5.429937 2.320046
+v 2.952859 5.429935 2.952863
+v 2.952859 -5.429937 2.952859
+v 2.320047 5.429935 3.472198
+v 2.320047 -5.429937 3.472194
+v 1.598076 5.429935 3.858100
+v 1.598076 -5.429937 3.858097
+v 0.814693 5.429935 4.095737
+v 0.814693 -5.429937 4.095733
+v 0.000001 5.429935 4.175976
+v 0.000001 -5.429937 4.175972
+v -0.814691 5.429935 4.095737
+v -0.814691 -5.429937 4.095733
+v -1.598075 5.429935 3.858100
+v -1.598075 -5.429937 3.858096
+v -2.320046 5.429935 3.472199
+v -2.320046 -5.429937 3.472196
+v -2.952858 5.429935 2.952866
+v -2.952858 -5.429937 2.952862
+v -3.472195 5.429935 2.320053
+v -3.472195 -5.429937 2.320049
+v -3.858098 5.429935 1.598082
+v -3.858098 -5.429937 1.598079
+v -4.095735 5.429935 0.814700
+v -4.095735 -5.429937 0.814696
+v -4.175976 5.429935 0.000006
+v -4.175976 -5.429937 0.000003
+v -4.095737 5.429935 -0.814686
+v -4.095737 -5.429937 -0.814689
+v -3.858102 5.429936 -1.598070
+v -3.858102 -5.429935 -1.598073
+v -3.472203 5.429936 -2.320040
+v -3.472203 -5.429935 -2.320044
+v -2.952868 5.429936 -2.952853
+v -2.952868 -5.429935 -2.952857
+v -2.320056 5.429936 -3.472191
+v -2.320056 -5.429935 -3.472195
+v -1.598087 5.429936 -3.858094
+v -1.598087 -5.429935 -3.858098
+v -0.814704 5.429936 -4.095734
+v -0.814704 -5.429935 -4.095738
+v 0.000001 5.314117 -4.114266
+v 0.802655 5.314117 -4.035212
+v 0.000001 -5.314116 -4.114270
+v 0.802655 -5.314116 -4.035216
+v 1.574463 5.314117 -3.801086
+v 1.574463 -5.314116 -3.801090
+v 2.285766 5.314117 -3.420886
+v 2.285766 -5.314116 -3.420890
+v 2.909227 5.314117 -2.909224
+v 2.909227 -5.314116 -2.909228
+v 3.420889 5.314117 -2.285762
+v 3.420889 -5.314116 -2.285766
+v 3.801088 5.314117 -1.574460
+v 3.801088 -5.314116 -1.574463
+v 4.035212 5.314116 -0.802650
+v 4.035212 -5.314117 -0.802654
+v 4.114267 5.314116 0.000003
+v 4.114267 -5.314117 -0.000001
+v 4.035211 5.314116 0.802658
+v 4.035211 -5.314117 0.802654
+v 3.801086 5.314116 1.574463
+v 3.801086 -5.314118 1.574460
+v 3.420887 5.314116 2.285766
+v 3.420887 -5.314118 2.285762
+v 2.909225 5.314116 2.909226
+v 2.909225 -5.314118 2.909223
+v 2.285764 5.314116 3.420888
+v 2.285764 -5.314118 3.420884
+v 1.574461 5.314116 3.801088
+v 1.574461 -5.314118 3.801084
+v 0.802653 5.314116 4.035214
+v 0.802653 -5.314118 4.035210
+v 0.000000 5.314116 4.114268
+v 0.000000 -5.314118 4.114264
+v -0.802654 5.314116 4.035214
+v -0.802654 -5.314118 4.035210
+v -1.574462 5.314116 3.801086
+v -1.574462 -5.314118 3.801083
+v -2.285764 5.314116 3.420889
+v -2.285764 -5.314118 3.420886
+v -2.909226 5.314116 2.909227
+v -2.909226 -5.314118 2.909224
+v -3.420888 5.314116 2.285766
+v -3.420888 -5.314118 2.285762
+v -3.801088 5.314116 1.574463
+v -3.801088 -5.314118 1.574460
+v -4.035212 5.314116 0.802656
+v -4.035212 -5.314117 0.802652
+v -4.114268 5.314116 0.000001
+v -4.114268 -5.314117 -0.000002
+v -4.035213 5.314116 -0.802651
+v -4.035213 -5.314117 -0.802655
+v -3.801088 5.314117 -1.574461
+v -3.801088 -5.314116 -1.574464
+v -3.420890 5.314117 -2.285762
+v -3.420890 -5.314116 -2.285766
+v -2.909228 5.314117 -2.909224
+v -2.909228 -5.314116 -2.909228
+v -2.285767 5.314117 -3.420887
+v -2.285767 -5.314116 -3.420891
+v -1.574464 5.314117 -3.801085
+v -1.574464 -5.314116 -3.801089
+v -0.802656 5.314117 -4.035212
+v -0.802656 -5.314116 -4.035216
+v 0.000000 4.895285 -4.204680
+v 0.820293 4.895285 -4.123888
+v 0.000000 -4.895283 -4.204684
+v 0.820293 -4.895283 -4.123892
+v 1.609062 4.895285 -3.884618
+v 1.609062 -4.895283 -3.884621
+v 2.335995 4.895285 -3.496063
+v 2.335995 -4.895283 -3.496066
+v 2.973158 4.895285 -2.973157
+v 2.973158 -4.895283 -2.973160
+v 3.496064 4.895285 -2.335993
+v 3.496064 -4.895283 -2.335997
+v 3.884618 4.895285 -1.609061
+v 3.884618 -4.895283 -1.609064
+v 4.123888 4.895283 -0.820292
+v 4.123888 -4.895284 -0.820295
+v 4.204680 4.895283 0.000001
+v 4.204680 -4.895284 -0.000002
+v 4.123887 4.895283 0.820293
+v 4.123887 -4.895284 0.820290
+v 3.884618 4.895283 1.609062
+v 3.884618 -4.895285 1.609058
+v 3.496063 4.895283 2.335996
+v 3.496063 -4.895285 2.335993
+v 2.973157 4.895283 2.973158
+v 2.973157 -4.895285 2.973155
+v 2.335994 4.895283 3.496064
+v 2.335994 -4.895285 3.496060
+v 1.609061 4.895283 3.884620
+v 1.609061 -4.895285 3.884616
+v 0.820291 4.895283 4.123889
+v 0.820291 -4.895285 4.123885
+v -0.000001 4.895283 4.204682
+v -0.000001 -4.895285 4.204678
+v -0.820294 4.895283 4.123889
+v -0.820294 -4.895285 4.123885
+v -1.609063 4.895283 3.884617
+v -1.609063 -4.895285 3.884614
+v -2.335996 4.895283 3.496064
+v -2.335996 -4.895285 3.496060
+v -2.973159 4.895283 2.973158
+v -2.973159 -4.895285 2.973155
+v -3.496065 4.895283 2.335995
+v -3.496065 -4.895285 2.335992
+v -3.884619 4.895283 1.609061
+v -3.884619 -4.895285 1.609057
+v -4.123888 4.895283 0.820291
+v -4.123888 -4.895284 0.820288
+v -4.204681 4.895283 -0.000001
+v -4.204681 -4.895284 -0.000004
+v -4.123888 4.895283 -0.820294
+v -4.123888 -4.895284 -0.820297
+v -3.884618 4.895285 -1.609063
+v -3.884618 -4.895283 -1.609066
+v -3.496063 4.895285 -2.335997
+v -3.496063 -4.895283 -2.336000
+v -2.973157 4.895285 -2.973158
+v -2.973157 -4.895283 -2.973161
+v -2.335994 4.895285 -3.496065
+v -2.335994 -4.895283 -3.496068
+v -1.609060 4.895285 -3.884619
+v -1.609060 -4.895283 -3.884622
+v -0.820291 4.895285 -4.123888
+v -0.820291 -4.895283 -4.123892
+v 0.000000 3.563111 -4.433841
+v 0.000000 4.053377 -4.338616
+v 0.846422 4.053378 -4.255250
+v 0.864999 3.563111 -4.348646
+v 0.846422 -4.053376 -4.255252
+v 0.000000 -4.053376 -4.338618
+v 0.000000 -3.563108 -4.433843
+v 0.864999 -3.563108 -4.348648
+v 1.660317 4.053378 -4.008359
+v 1.696757 3.563111 -4.096335
+v 1.660317 -4.053376 -4.008361
+v 1.696757 -3.563108 -4.096337
+v 2.410405 4.053378 -3.607427
+v 2.463310 3.563111 -3.686604
+v 2.410405 -4.053376 -3.607430
+v 2.463310 -3.563108 -3.686605
+v 3.067865 4.053377 -3.067864
+v 3.135198 3.563111 -3.135199
+v 3.067865 -4.053376 -3.067867
+v 3.135198 -3.563108 -3.135201
+v 3.607427 4.053378 -2.410405
+v 3.686603 3.563111 -2.463310
+v 3.607427 -4.053376 -2.410408
+v 3.686603 -3.563108 -2.463311
+v 4.008358 4.053378 -1.660317
+v 4.096334 3.563110 -1.696757
+v 4.008358 -4.053376 -1.660320
+v 4.096334 -3.563109 -1.696760
+v 4.255250 4.053377 -0.846422
+v 4.348645 3.563110 -0.864999
+v 4.255250 -4.053377 -0.846425
+v 4.348645 -3.563109 -0.865002
+v 4.338616 4.053377 0.000001
+v 4.433840 3.563109 -0.000000
+v 4.338616 -4.053377 -0.000002
+v 4.433840 -3.563110 -0.000003
+v 4.255250 4.053375 0.846423
+v 4.348645 3.563109 0.864999
+v 4.255250 -4.053377 0.846420
+v 4.348645 -3.563110 0.864996
+v 4.008358 4.053376 1.660316
+v 4.096334 3.563109 1.696756
+v 4.008358 -4.053378 1.660313
+v 4.096334 -3.563110 1.696753
+v 3.607427 4.053376 2.410406
+v 3.686603 3.563108 2.463310
+v 3.607427 -4.053378 2.410403
+v 3.686603 -3.563111 2.463309
+v 3.067864 4.053376 3.067865
+v 3.135198 3.563108 3.135199
+v 3.067864 -4.053378 3.067862
+v 3.135198 -3.563111 3.135196
+v 2.410405 4.053374 3.607427
+v 2.463309 3.563108 3.686603
+v 2.410405 -4.053378 3.607424
+v 2.463309 -3.563111 3.686600
+v 1.660315 4.053376 4.008358
+v 1.696756 3.563108 4.096334
+v 1.660315 -4.053378 4.008357
+v 1.696756 -3.563111 4.096333
+v 0.846421 4.053376 4.255250
+v 0.864998 3.563108 4.348646
+v 0.846421 -4.053378 4.255249
+v 0.864998 -3.563111 4.348643
+v -0.000001 4.053374 4.338614
+v -0.000002 3.563108 4.433842
+v -0.000001 -4.053378 4.338614
+v -0.000002 -3.563111 4.433839
+v -0.846424 4.053376 4.255250
+v -0.865001 3.563108 4.348646
+v -0.846424 -4.053378 4.255249
+v -0.865001 -3.563111 4.348643
+v -1.660318 4.053374 4.008358
+v -1.696760 3.563108 4.096334
+v -1.660318 -4.053378 4.008356
+v -1.696760 -3.563111 4.096332
+v -2.410408 4.053376 3.607428
+v -2.463312 3.563108 3.686603
+v -2.410408 -4.053378 3.607425
+v -2.463312 -3.563111 3.686600
+v -3.067867 4.053376 3.067865
+v -3.135201 3.563108 3.135199
+v -3.067867 -4.053378 3.067862
+v -3.135201 -3.563111 3.135196
+v -3.607429 4.053374 2.410404
+v -3.686605 3.563108 2.463307
+v -3.607429 -4.053378 2.410401
+v -3.686605 -3.563111 2.463305
+v -4.008361 4.053376 1.660315
+v -4.096337 3.563109 1.696754
+v -4.008361 -4.053378 1.660312
+v -4.096337 -3.563110 1.696751
+v -4.255252 4.053375 0.846421
+v -4.348647 3.563109 0.864996
+v -4.255252 -4.053377 0.846417
+v -4.348647 -3.563110 0.864993
+v -4.338617 4.053377 -0.000003
+v -4.433841 3.563109 -0.000003
+v -4.338617 -4.053377 -0.000006
+v -4.433841 -3.563110 -0.000006
+v -4.255250 4.053375 -0.846425
+v -4.348644 3.563110 -0.865003
+v -4.255250 -4.053377 -0.846428
+v -4.348644 -3.563109 -0.865006
+v -4.008358 4.053377 -1.660319
+v -4.096333 3.563110 -1.696761
+v -4.008358 -4.053376 -1.660322
+v -4.096333 -3.563109 -1.696764
+v -3.607426 4.053378 -2.410409
+v -3.686602 3.563111 -2.463314
+v -3.607426 -4.053376 -2.410412
+v -3.686602 -3.563108 -2.463315
+v -3.067863 4.053378 -3.067867
+v -3.135195 3.563111 -3.135201
+v -3.067863 -4.053376 -3.067870
+v -3.135195 -3.563108 -3.135203
+v -2.410403 4.053378 -3.607430
+v -2.463306 3.563111 -3.686606
+v -2.410403 -4.053376 -3.607433
+v -2.463306 -3.563108 -3.686609
+v -1.660313 4.053378 -4.008360
+v -1.696753 3.563111 -4.096336
+v -1.660313 -4.053376 -4.008362
+v -1.696753 -3.563108 -4.096338
+v -0.846418 4.053378 -4.255251
+v -0.864994 3.563111 -4.348647
+v -0.846418 -4.053376 -4.255253
+v -0.864994 -3.563108 -4.348649
+v 0.814693 -5.429937 4.095733
+v 0.000000 2.681008 -4.510056
+v 0.879868 2.681008 -4.423396
+v 0.814693 5.429935 4.095737
+v 0.879868 -2.681005 -4.423398
+v 0.000000 -2.681005 -4.510057
+v 1.598076 -5.429937 3.858097
+v 1.598076 5.429935 3.858100
+v 1.725923 2.681008 -4.166749
+v 2.320047 -5.429937 3.472194
+v 1.725923 -2.681005 -4.166750
+v 2.320047 5.429935 3.472198
+v 2.505652 2.681008 -3.749974
+v 2.952859 -5.429937 2.952859
+v 2.505652 -2.681005 -3.749975
+v 2.952859 5.429935 2.952863
+v 3.189090 2.681007 -3.189090
+v 3.472195 -5.429937 2.320046
+v 3.189090 -2.681005 -3.189092
+v 3.472195 5.429935 2.320050
+v 3.749973 2.681007 -2.505652
+v 3.858097 -5.429937 1.598076
+v 3.749973 -2.681005 -2.505655
+v 3.858097 5.429935 1.598080
+v 4.166746 2.681007 -1.725924
+v 4.095734 -5.429937 0.814694
+v 4.166746 -2.681006 -1.725925
+v 4.095734 5.429935 0.814698
+v 4.423394 2.681007 -0.879869
+v 4.175976 -5.429937 0.000001
+v 4.423394 -2.681006 -0.879870
+v 4.175976 5.429935 0.000005
+v 4.510054 2.681006 -0.000001
+v 4.095736 -5.429937 -0.814691
+v 4.510054 -2.681007 -0.000002
+v 4.095736 5.429935 -0.814688
+v 4.423394 2.681006 0.879867
+v 3.858100 -5.429935 -1.598077
+v 4.423394 -2.681007 0.879866
+v 3.858100 5.429936 -1.598074
+v 4.166746 2.681006 1.725922
+v 3.472199 -5.429935 -2.320048
+v 4.166746 -2.681007 1.725921
+v 3.472199 5.429936 -2.320044
+v 3.749973 2.681005 2.505651
+v 2.952864 -5.429935 -2.952862
+v 3.749973 -2.681007 2.505650
+v 2.952864 5.429936 -2.952858
+v 3.189090 2.681005 3.189090
+v 2.320051 -5.429935 -3.472198
+v 3.189090 -2.681007 3.189088
+v 2.320051 5.429936 -3.472194
+v 2.505651 2.681005 3.749973
+v 1.598080 -5.429935 -3.858101
+v 2.505651 -2.681008 3.749970
+v 1.598080 5.429936 -3.858098
+v 1.725922 2.681005 4.166748
+v 0.814696 -5.429935 -4.095738
+v 1.725922 -2.681008 4.166746
+v 0.000003 -5.429935 -4.175979
+v 0.879867 2.681005 4.423395
+v 0.000003 5.429936 -4.175975
+v 0.879867 -2.681008 4.423392
+v 0.814696 5.429936 -4.095735
+v -0.000002 2.681005 4.510055
+v -0.787850 -6.030530 -3.960651
+v -0.000002 -2.681008 4.510053
+v -0.787850 6.030532 -3.960648
+v -0.879870 2.681005 4.423395
+v -1.545395 -6.030530 -3.730846
+v -0.879870 -2.681008 4.423392
+v -1.545395 6.030532 -3.730842
+v -1.725926 2.681005 4.166748
+v -2.243551 -6.030530 -3.357669
+v -1.725926 -2.681008 4.166746
+v -2.243551 6.030532 -3.357665
+v -2.505655 2.681005 3.749974
+v -2.855488 -6.030530 -2.855458
+v -2.505655 -2.681008 3.749972
+v -2.855488 6.030532 -2.855454
+v -3.189093 2.681005 3.189090
+v -3.357692 -6.030530 -2.243515
+v -3.189093 -2.681007 3.189088
+v -3.357692 6.030532 -2.243511
+v -3.749976 2.681005 2.505650
+v -3.730861 -6.030530 -1.545355
+v -3.749976 -2.681007 2.505647
+v -3.730861 6.030532 -1.545351
+v -4.166750 2.681006 1.725919
+v -3.960657 -6.030532 -0.787808
+v -4.166750 -2.681007 1.725918
+v -3.960657 6.030531 -0.787804
+v -4.423396 2.681006 0.879864
+v -4.038247 -6.030532 0.000014
+v -4.423396 -2.681007 0.879863
+v -4.038247 6.030531 0.000018
+v -4.510055 2.681006 -0.000005
+v -3.960650 -6.030532 0.787834
+v -4.510055 -2.681007 -0.000006
+v -3.960650 6.030531 0.787838
+v -4.423394 2.681007 -0.879873
+v -3.730849 -6.030532 1.545380
+v -4.423394 -2.681006 -0.879874
+v -3.730849 6.030530 1.545383
+v -4.166745 2.681007 -1.725927
+v -3.357673 -6.030532 2.243535
+v -4.166745 -2.681006 -1.725929
+v -3.357673 6.030530 2.243539
+v -3.749971 2.681007 -2.505656
+v -2.855464 -6.030532 2.855475
+v -3.749971 -2.681005 -2.505658
+v -2.855464 6.030530 2.855479
+v -3.189087 2.681007 -3.189094
+v -2.243523 -6.030532 3.357681
+v -3.189087 -2.681005 -3.189095
+v -2.243523 6.030530 3.357685
+v -2.505648 2.681008 -3.749978
+v -1.545364 -6.030532 3.730853
+v -2.505648 -2.681005 -3.749979
+v -1.545364 6.030530 3.730856
+v -1.725918 2.681008 -4.166750
+v -0.787818 -6.030532 3.960649
+v -1.725918 -2.681005 -4.166752
+v -0.787818 6.030530 3.960653
+v -0.879862 2.681008 -4.423398
+v 0.000003 -6.030532 4.038245
+v -0.879862 -2.681005 -4.423399
+v 0.000003 6.030530 4.038249
+v 0.787825 -6.030532 3.960649
+v 0.787825 6.030530 3.960653
+v 1.545370 -6.030532 3.730852
+v 1.545370 6.030530 3.730856
+v 2.243529 -6.030532 3.357675
+v 2.243529 6.030530 3.357678
+v 2.855470 -6.030532 2.855470
+v 2.855470 6.030530 2.855474
+v 3.357677 -6.030532 2.243530
+v 3.357677 6.030530 2.243534
+v 3.730851 -6.030532 1.545371
+v 3.730851 6.030530 1.545375
+v 3.960651 -6.030532 0.787827
+v 3.960651 6.030531 0.787831
+v 4.038246 -6.030532 0.000006
+v 4.038246 6.030531 0.000010
+v 3.960654 -6.030532 -0.787817
+v 3.960654 6.030531 -0.787813
+v 3.730856 -6.030530 -1.545366
+v 3.730856 6.030532 -1.545362
+v 3.357683 -6.030530 -2.243527
+v 3.357683 6.030532 -2.243524
+v 2.855477 -6.030530 -2.855469
+v 2.855477 6.030532 -2.855465
+v 2.243536 -6.030530 -3.357678
+v 2.243536 6.030532 -3.357675
+v 1.545376 -6.030530 -3.730854
+v 1.545376 6.030532 -3.730850
+v 0.787829 -6.030530 -3.960654
+v 0.000006 -6.030530 -4.038250
+v 0.000006 6.030532 -4.038247
+v 0.787829 6.030532 -3.960650
+v 0.000000 4.798631 -4.281936
+v 0.835364 4.798632 -4.199658
+v 0.000000 -4.798628 -4.281940
+v 0.835364 -4.798630 -4.199662
+v 1.638626 4.798632 -3.955993
+v 1.638626 -4.798630 -3.955996
+v 2.378916 4.798632 -3.560299
+v 2.378916 -4.798630 -3.560302
+v 3.027786 4.798631 -3.027785
+v 3.027786 -4.798628 -3.027788
+v 3.560299 4.798632 -2.378915
+v 3.560299 -4.798630 -2.378918
+v 3.955992 4.798632 -1.638625
+v 3.955992 -4.798630 -1.638628
+v 4.199659 4.798630 -0.835364
+v 4.199659 -4.798631 -0.835367
+v 4.281935 4.798630 0.000001
+v 4.281935 -4.798631 -0.000002
+v 4.199659 4.798629 0.835366
+v 4.199659 -4.798630 0.835362
+v 3.955992 4.798630 1.638626
+v 3.955992 -4.798632 1.638622
+v 3.560298 4.798630 2.378917
+v 3.560298 -4.798632 2.378913
+v 3.027785 4.798630 3.027787
+v 3.027785 -4.798632 3.027783
+v 2.378915 4.798628 3.560299
+v 2.378915 -4.798631 3.560296
+v 1.638625 4.798630 3.955994
+v 1.638625 -4.798632 3.955991
+v 0.835363 4.798630 4.199660
+v 0.835363 -4.798632 4.199656
+v -0.000001 4.798628 4.281937
+v -0.000001 -4.798631 4.281933
+v -0.835366 4.798630 4.199660
+v -0.835366 -4.798632 4.199656
+v -1.638627 4.798628 3.955993
+v -1.638627 -4.798631 3.955990
+v -2.378917 4.798630 3.560299
+v -2.378917 -4.798632 3.560296
+v -3.027787 4.798630 3.027787
+v -3.027787 -4.798632 3.027783
+v -3.560301 4.798628 2.378915
+v -3.560301 -4.798631 2.378912
+v -3.955994 4.798630 1.638625
+v -3.955994 -4.798632 1.638621
+v -4.199660 4.798629 0.835363
+v -4.199660 -4.798630 0.835360
+v -4.281936 4.798630 -0.000002
+v -4.281936 -4.798631 -0.000005
+v -4.199659 4.798629 -0.835367
+v -4.199659 -4.798630 -0.835370
+v -3.955992 4.798631 -1.638628
+v -3.955992 -4.798628 -1.638631
+v -3.560298 4.798632 -2.378918
+v -3.560298 -4.798630 -2.378921
+v -3.027784 4.798632 -3.027787
+v -3.027784 -4.798630 -3.027790
+v -2.378914 4.798632 -3.560301
+v -2.378914 -4.798630 -3.560304
+v -1.638623 4.798632 -3.955994
+v -1.638623 -4.798630 -3.955997
+v -0.835361 4.798632 -4.199659
+v -0.835361 -4.798630 -4.199663
+v 0.000000 4.156910 -4.371553
+v 0.852848 4.156911 -4.287555
+v 0.852848 -4.156909 -4.287557
+v 0.000000 -4.156909 -4.371555
+v 1.672921 4.156911 -4.038788
+v 1.672921 -4.156909 -4.038791
+v 2.428705 4.156911 -3.634813
+v 2.428705 -4.156909 -3.634816
+v 3.091155 4.156910 -3.091154
+v 3.091155 -4.156909 -3.091157
+v 3.634813 4.156911 -2.428704
+v 3.634813 -4.156909 -2.428707
+v 4.038788 4.156911 -1.672921
+v 4.038788 -4.156909 -1.672924
+v 4.287554 4.156910 -0.852847
+v 4.287554 -4.156910 -0.852850
+v 4.371552 4.156910 0.000001
+v 4.371552 -4.156910 -0.000002
+v 4.287554 4.156909 0.852849
+v 4.287554 -4.156909 0.852846
+v 4.038788 4.156909 1.672921
+v 4.038788 -4.156911 1.672917
+v 3.634813 4.156909 2.428705
+v 3.634813 -4.156911 2.428701
+v 3.091154 4.156909 3.091155
+v 3.091154 -4.156911 3.091152
+v 2.428704 4.156909 3.634813
+v 2.428704 -4.156910 3.634810
+v 1.672920 4.156909 4.038789
+v 1.672920 -4.156911 4.038787
+v 0.852846 4.156909 4.287556
+v 0.852846 -4.156911 4.287553
+v -0.000001 4.156909 4.371552
+v -0.000001 -4.156910 4.371552
+v -0.852849 4.156909 4.287556
+v -0.852849 -4.156911 4.287553
+v -1.672923 4.156909 4.038788
+v -1.672923 -4.156910 4.038786
+v -2.428706 4.156909 3.634813
+v -2.428706 -4.156911 3.634810
+v -3.091157 4.156909 3.091155
+v -3.091157 -4.156911 3.091152
+v -3.634815 4.156909 2.428703
+v -3.634815 -4.156910 2.428700
+v -4.038790 4.156909 1.672920
+v -4.038790 -4.156911 1.672916
+v -4.287555 4.156909 0.852847
+v -4.287555 -4.156909 0.852844
+v -4.371554 4.156910 -0.000003
+v -4.371554 -4.156910 -0.000006
+v -4.287554 4.156909 -0.852850
+v -4.287554 -4.156909 -0.852853
+v -4.038787 4.156910 -1.672924
+v -4.038787 -4.156909 -1.672927
+v -3.634812 4.156911 -2.428707
+v -3.634812 -4.156909 -2.428710
+v -3.091153 4.156911 -3.091157
+v -3.091153 -4.156909 -3.091160
+v -2.428702 4.156911 -3.634816
+v -2.428702 -4.156909 -3.634819
+v -1.672918 4.156911 -4.038791
+v -1.672918 -4.156909 -4.038793
+v -0.852844 4.156911 -4.287556
+v -0.852844 -4.156909 -4.287558
+v 0.000000 3.446066 -4.498246
+v 0.877564 3.446066 -4.411812
+v 0.000000 -3.446063 -4.498248
+v 0.877564 -3.446063 -4.411815
+v 1.721404 3.446066 -4.155838
+v 1.721404 -3.446063 -4.155839
+v 2.499091 3.446066 -3.740155
+v 2.499091 -3.446063 -3.740156
+v 3.180739 3.446065 -3.180740
+v 3.180739 -3.446064 -3.180742
+v 3.740153 3.446065 -2.499090
+v 3.740153 -3.446064 -2.499093
+v 4.155836 3.446064 -1.721404
+v 4.155836 -3.446064 -1.721407
+v 4.411812 3.446064 -0.877564
+v 4.411812 -3.446064 -0.877567
+v 4.498245 3.446064 -0.000000
+v 4.498245 -3.446065 -0.000003
+v 4.411812 3.446064 0.877564
+v 4.411812 -3.446065 0.877561
+v 4.155836 3.446064 1.721403
+v 4.155836 -3.446065 1.721400
+v 3.740153 3.446064 2.499091
+v 3.740153 -3.446065 2.499089
+v 3.180739 3.446064 3.180738
+v 3.180739 -3.446065 3.180737
+v 2.499090 3.446063 3.740152
+v 2.499090 -3.446066 3.740150
+v 1.721403 3.446063 4.155837
+v 1.721403 -3.446066 4.155835
+v 0.877563 3.446063 4.411811
+v 0.877563 -3.446066 4.411809
+v -0.000002 3.446063 4.498244
+v -0.000002 -3.446066 4.498242
+v -0.877566 3.446063 4.411811
+v -0.877566 -3.446066 4.411809
+v -1.721406 3.446063 4.155837
+v -1.721406 -3.446066 4.155835
+v -2.499093 3.446063 3.740154
+v -2.499093 -3.446066 3.740151
+v -3.180742 3.446064 3.180738
+v -3.180742 -3.446065 3.180737
+v -3.740156 3.446064 2.499089
+v -3.740156 -3.446065 2.499088
+v -4.155839 3.446064 1.721401
+v -4.155839 -3.446065 1.721398
+v -4.411813 3.446064 0.877561
+v -4.411813 -3.446065 0.877558
+v -4.498246 3.446064 -0.000004
+v -4.498246 -3.446065 -0.000007
+v -4.411812 3.446064 -0.877568
+v -4.411812 -3.446064 -0.877571
+v -4.155835 3.446064 -1.721408
+v -4.155835 -3.446064 -1.721411
+v -3.740152 3.446065 -2.499095
+v -3.740152 -3.446064 -2.499098
+v -3.180736 3.446065 -3.180743
+v -3.180736 -3.446064 -3.180744
+v -2.499087 3.446066 -3.740158
+v -2.499087 -3.446063 -3.740160
+v -1.721399 3.446066 -4.155839
+v -1.721399 -3.446063 -4.155841
+v -0.877558 3.446066 -4.411815
+v -0.877558 -3.446063 -4.411817
+v 0.000000 2.775532 -4.530448
+v 0.883846 2.775532 -4.443397
+v 0.883846 -2.775529 -4.443398
+v 0.000000 -2.775529 -4.530450
+v 1.733727 2.775532 -4.185588
+v 1.733727 -2.775529 -4.185590
+v 2.516982 2.775532 -3.766930
+v 2.516982 -2.775529 -3.766932
+v 3.203510 2.775532 -3.203511
+v 3.203510 -2.775530 -3.203512
+v 3.766928 2.775532 -2.516982
+v 3.766928 -2.775530 -2.516984
+v 4.185587 2.775531 -1.733728
+v 4.185587 -2.775530 -1.733729
+v 4.443395 2.775531 -0.883847
+v 4.443395 -2.775530 -0.883848
+v 4.530447 2.775530 -0.000001
+v 4.530447 -2.775531 -0.000002
+v 4.443395 2.775530 0.883846
+v 4.443395 -2.775531 0.883844
+v 4.185587 2.775530 1.733725
+v 4.185587 -2.775531 1.733724
+v 3.766928 2.775530 2.516983
+v 3.766928 -2.775532 2.516980
+v 3.203510 2.775530 3.203510
+v 3.203510 -2.775532 3.203507
+v 2.516981 2.775529 3.766928
+v 2.516981 -2.775532 3.766927
+v 1.733726 2.775529 4.185588
+v 1.733726 -2.775532 4.185586
+v 0.883845 2.775529 4.443396
+v 0.883845 -2.775532 4.443394
+v -0.000002 2.775529 4.530447
+v -0.000002 -2.775532 4.530445
+v -0.883848 2.775529 4.443396
+v -0.883848 -2.775532 4.443394
+v -1.733730 2.775529 4.185586
+v -1.733730 -2.775532 4.185585
+v -2.516984 2.775529 3.766929
+v -2.516984 -2.775532 3.766927
+v -3.203512 2.775530 3.203510
+v -3.203512 -2.775532 3.203507
+v -3.766931 2.775530 2.516979
+v -3.766931 -2.775532 2.516978
+v -4.185590 2.775530 1.733724
+v -4.185590 -2.775531 1.733721
+v -4.443397 2.775530 0.883842
+v -4.443397 -2.775531 0.883841
+v -4.530448 2.775530 -0.000005
+v -4.530448 -2.775531 -0.000006
+v -4.443395 2.775531 -0.883851
+v -4.443395 -2.775530 -0.883852
+v -4.185586 2.775531 -1.733732
+v -4.185586 -2.775530 -1.733734
+v -3.766927 2.775532 -2.516987
+v -3.766927 -2.775530 -2.516989
+v -3.203506 2.775532 -3.203514
+v -3.203506 -2.775530 -3.203516
+v -2.516978 2.775532 -3.766933
+v -2.516978 -2.775529 -3.766936
+v -1.733722 2.775532 -4.185591
+v -1.733722 -2.775529 -4.185593
+v -0.883841 2.775532 -4.443398
+v -0.883841 -2.775529 -4.443400
+v -0.787850 6.030532 -3.960648
+v -1.545395 6.030532 -3.730842
+v -2.243551 6.030532 -3.357665
+v -2.855488 6.030532 -2.855454
+v -3.357692 6.030532 -2.243511
+v -3.730861 6.030532 -1.545351
+v -3.960657 6.030531 -0.787804
+v -4.038247 6.030531 0.000018
+v -3.960650 6.030531 0.787838
+v -3.730849 6.030530 1.545383
+v -3.357673 6.030530 2.243539
+v -2.855464 6.030530 2.855479
+v -2.243523 6.030530 3.357685
+v -1.545364 6.030530 3.730856
+v -0.787818 6.030530 3.960653
+v 0.000003 6.030530 4.038249
+v 0.787825 6.030530 3.960653
+v 1.545370 6.030530 3.730856
+v 2.243529 6.030530 3.357678
+v 2.855470 6.030530 2.855474
+v 3.357677 6.030530 2.243534
+v 3.730851 6.030530 1.545375
+v 3.960651 6.030531 0.787831
+v 4.038246 6.030531 0.000010
+v 3.960654 6.030531 -0.787813
+v 3.730856 6.030532 -1.545362
+v 3.357683 6.030532 -2.243524
+v 2.855477 6.030532 -2.855465
+v 2.243536 6.030532 -3.357675
+v 1.545376 6.030532 -3.730850
+v 0.000000 6.026093 0.000001
+v 0.000006 6.030532 -4.038247
+v 0.787829 6.030532 -3.960650
+v 0.000001 5.429935 4.175976
+v 0.000001 -5.429937 4.175972
+v -0.814691 5.429935 4.095737
+v -0.814691 -5.429937 4.095733
+v -1.598075 5.429935 3.858100
+v -1.598075 -5.429937 3.858096
+v -2.320046 5.429935 3.472199
+v -2.320046 -5.429937 3.472196
+v -2.952858 5.429935 2.952866
+v -2.952858 -5.429937 2.952862
+v -3.472195 5.429935 2.320053
+v -3.472195 -5.429937 2.320049
+v -3.858098 5.429935 1.598082
+v -3.858098 -5.429937 1.598079
+v -4.095735 5.429935 0.814700
+v -4.095735 -5.429937 0.814696
+v -4.175976 5.429935 0.000006
+v -4.175976 -5.429937 0.000003
+v -4.095737 5.429935 -0.814686
+v -4.095737 -5.429937 -0.814689
+v -3.858102 5.429936 -1.598070
+v -3.858102 -5.429935 -1.598073
+v -3.472203 5.429936 -2.320040
+v -3.472203 -5.429935 -2.320044
+v -2.952868 5.429936 -2.952853
+v -2.952868 -5.429935 -2.952857
+v -2.320056 5.429936 -3.472191
+v -2.320056 -5.429935 -3.472195
+v -1.598087 5.429936 -3.858094
+v -1.598087 -5.429935 -3.858098
+v -0.814704 5.429936 -4.095734
+v -0.814704 -5.429935 -4.095738
+v 0.000001 5.314117 -4.114266
+v 0.802655 5.314117 -4.035212
+v 0.000001 -5.314116 -4.114270
+v 0.802655 -5.314116 -4.035216
+v 1.574463 5.314117 -3.801086
+v 1.574463 -5.314116 -3.801090
+v 2.285766 5.314117 -3.420886
+v 2.285766 -5.314116 -3.420890
+v 2.909227 5.314117 -2.909224
+v 2.909227 -5.314116 -2.909228
+v 3.420889 5.314117 -2.285762
+v 3.420889 -5.314116 -2.285766
+v 3.801088 5.314117 -1.574460
+v 3.801088 -5.314116 -1.574463
+v 4.035212 5.314116 -0.802650
+v 4.035212 -5.314117 -0.802654
+v 4.114267 5.314116 0.000003
+v 4.114267 -5.314117 -0.000001
+v 4.035211 5.314116 0.802658
+v 4.035211 -5.314117 0.802654
+v 3.801086 5.314116 1.574463
+v 3.801086 -5.314118 1.574460
+v 3.420887 5.314116 2.285766
+v 3.420887 -5.314118 2.285762
+v 2.909225 5.314116 2.909226
+v 2.909225 -5.314118 2.909223
+v 2.285764 5.314116 3.420888
+v 2.285764 -5.314118 3.420884
+v 1.574461 5.314116 3.801088
+v 1.574461 -5.314118 3.801084
+v 0.802653 5.314116 4.035214
+v 0.802653 -5.314118 4.035210
+v 0.000000 5.314116 4.114268
+v 0.000000 -5.314118 4.114264
+v -0.802654 5.314116 4.035214
+v -0.802654 -5.314118 4.035210
+v -1.574462 5.314116 3.801086
+v -1.574462 -5.314118 3.801083
+v -2.285764 5.314116 3.420889
+v -2.285764 -5.314118 3.420886
+v -2.909226 5.314116 2.909227
+v -2.909226 -5.314118 2.909224
+v -3.420888 5.314116 2.285766
+v -3.420888 -5.314118 2.285762
+v -3.801088 5.314116 1.574463
+v -3.801088 -5.314118 1.574460
+v -4.035212 5.314116 0.802656
+v -4.035212 -5.314117 0.802652
+v -4.114268 5.314116 0.000001
+v -4.114268 -5.314117 -0.000002
+v -4.035213 5.314116 -0.802651
+v -4.035213 -5.314117 -0.802655
+v -3.801088 5.314117 -1.574461
+v -3.801088 -5.314116 -1.574464
+v -3.420890 5.314117 -2.285762
+v -3.420890 -5.314116 -2.285766
+v -2.909228 5.314117 -2.909224
+v -2.909228 -5.314116 -2.909228
+v -2.285767 5.314117 -3.420887
+v -2.285767 -5.314116 -3.420891
+v -1.574464 5.314117 -3.801085
+v -1.574464 -5.314116 -3.801089
+v -0.802656 5.314117 -4.035212
+v -0.802656 -5.314116 -4.035216
+v 0.000000 4.895285 -4.204680
+v 0.820293 4.895285 -4.123888
+v 0.000000 -4.895283 -4.204684
+v 0.820293 -4.895283 -4.123892
+v 1.609062 4.895285 -3.884618
+v 1.609062 -4.895283 -3.884621
+v 2.335995 4.895285 -3.496063
+v 2.335995 -4.895283 -3.496066
+v 2.973158 4.895285 -2.973157
+v 2.973158 -4.895283 -2.973160
+v 3.496064 4.895285 -2.335993
+v 3.496064 -4.895283 -2.335997
+v 3.884618 4.895285 -1.609061
+v 3.884618 -4.895283 -1.609064
+v 4.123888 4.895283 -0.820292
+v 4.123888 -4.895284 -0.820295
+v 4.204680 4.895283 0.000001
+v 4.204680 -4.895284 -0.000002
+v 4.123887 4.895283 0.820293
+v 4.123887 -4.895284 0.820290
+v 3.884618 4.895283 1.609062
+v 3.884618 -4.895285 1.609058
+v 3.496063 4.895283 2.335996
+v 3.496063 -4.895285 2.335993
+v 2.973157 4.895283 2.973158
+v 2.973157 -4.895285 2.973155
+v 2.335994 4.895283 3.496064
+v 2.335994 -4.895285 3.496060
+v 1.609061 4.895283 3.884620
+v 1.609061 -4.895285 3.884616
+v 0.820291 4.895283 4.123889
+v 0.820291 -4.895285 4.123885
+v -0.000001 4.895283 4.204682
+v -0.000001 -4.895285 4.204678
+v -0.820294 4.895283 4.123889
+v -0.820294 -4.895285 4.123885
+v -1.609063 4.895283 3.884617
+v -1.609063 -4.895285 3.884614
+v -2.335996 4.895283 3.496064
+v -2.335996 -4.895285 3.496060
+v -2.973159 4.895283 2.973158
+v -2.973159 -4.895285 2.973155
+v -3.496065 4.895283 2.335995
+v -3.496065 -4.895285 2.335992
+v -3.884619 4.895283 1.609061
+v -3.884619 -4.895285 1.609057
+v -4.123888 4.895283 0.820291
+v -4.123888 -4.895284 0.820288
+v -4.204681 4.895283 -0.000001
+v -4.204681 -4.895284 -0.000004
+v -4.123888 4.895283 -0.820294
+v -4.123888 -4.895284 -0.820297
+v -3.884618 4.895285 -1.609063
+v -3.884618 -4.895283 -1.609066
+v -3.496063 4.895285 -2.335997
+v -3.496063 -4.895283 -2.336000
+v -2.973157 4.895285 -2.973158
+v -2.973157 -4.895283 -2.973161
+v -2.335994 4.895285 -3.496065
+v -2.335994 -4.895283 -3.496068
+v -1.609060 4.895285 -3.884619
+v -1.609060 -4.895283 -3.884622
+v -0.820291 4.895285 -4.123888
+v -0.820291 -4.895283 -4.123892
+v 0.000000 3.563111 -4.433841
+v 0.000000 4.053377 -4.338616
+v 0.846422 4.053378 -4.255250
+v 0.864999 3.563111 -4.348646
+v 0.846422 -4.053376 -4.255252
+v 0.000000 -4.053376 -4.338618
+v 0.000000 -3.563108 -4.433843
+v 0.864999 -3.563108 -4.348648
+v 1.660317 4.053378 -4.008359
+v 1.696757 3.563111 -4.096335
+v 1.660317 -4.053376 -4.008361
+v 1.696757 -3.563108 -4.096337
+v 2.410405 4.053378 -3.607427
+v 2.463310 3.563111 -3.686604
+v 2.410405 -4.053376 -3.607430
+v 2.463310 -3.563108 -3.686605
+v 3.067865 4.053377 -3.067864
+v 3.135198 3.563111 -3.135199
+v 3.067865 -4.053376 -3.067867
+v 3.135198 -3.563108 -3.135201
+v 3.607427 4.053378 -2.410405
+v 3.686603 3.563111 -2.463310
+v 3.607427 -4.053376 -2.410408
+v 3.686603 -3.563108 -2.463311
+v 4.008358 4.053378 -1.660317
+v 4.096334 3.563110 -1.696757
+v 4.008358 -4.053376 -1.660320
+v 4.096334 -3.563109 -1.696760
+v 4.255250 4.053377 -0.846422
+v 4.348645 3.563110 -0.864999
+v 4.255250 -4.053377 -0.846425
+v 4.348645 -3.563109 -0.865002
+v 4.338616 4.053377 0.000001
+v 4.433840 3.563109 -0.000000
+v 4.338616 -4.053377 -0.000002
+v 4.433840 -3.563110 -0.000003
+v 4.255250 4.053375 0.846423
+v 4.348645 3.563109 0.864999
+v 4.255250 -4.053377 0.846420
+v 4.348645 -3.563110 0.864996
+v 4.008358 4.053376 1.660316
+v 4.096334 3.563109 1.696756
+v 4.008358 -4.053378 1.660313
+v 4.096334 -3.563110 1.696753
+v 3.607427 4.053376 2.410406
+v 3.686603 3.563108 2.463310
+v 3.607427 -4.053378 2.410403
+v 3.686603 -3.563111 2.463309
+v 3.067864 4.053376 3.067865
+v 3.135198 3.563108 3.135199
+v 3.067864 -4.053378 3.067862
+v 3.135198 -3.563111 3.135196
+v 2.410405 4.053374 3.607427
+v 2.463309 3.563108 3.686603
+v 2.410405 -4.053378 3.607424
+v 2.463309 -3.563111 3.686600
+v 1.660315 4.053376 4.008358
+v 1.696756 3.563108 4.096334
+v 1.660315 -4.053378 4.008357
+v 1.696756 -3.563111 4.096333
+v 0.846421 4.053376 4.255250
+v 0.864998 3.563108 4.348646
+v 0.846421 -4.053378 4.255249
+v 0.864998 -3.563111 4.348643
+v -0.000001 4.053374 4.338614
+v -0.000002 3.563108 4.433842
+v -0.000001 -4.053378 4.338614
+v -0.000002 -3.563111 4.433839
+v -0.846424 4.053376 4.255250
+v -0.865001 3.563108 4.348646
+v -0.846424 -4.053378 4.255249
+v -0.865001 -3.563111 4.348643
+v -1.660318 4.053374 4.008358
+v -1.696760 3.563108 4.096334
+v -1.660318 -4.053378 4.008356
+v -1.696760 -3.563111 4.096332
+v -2.410408 4.053376 3.607428
+v -2.463312 3.563108 3.686603
+v -2.410408 -4.053378 3.607425
+v -2.463312 -3.563111 3.686600
+v -3.067867 4.053376 3.067865
+v -3.135201 3.563108 3.135199
+v -3.067867 -4.053378 3.067862
+v -3.135201 -3.563111 3.135196
+v -3.607429 4.053374 2.410404
+v -3.686605 3.563108 2.463307
+v -3.607429 -4.053378 2.410401
+v -3.686605 -3.563111 2.463305
+v -4.008361 4.053376 1.660315
+v -4.096337 3.563109 1.696754
+v -4.008361 -4.053378 1.660312
+v -4.096337 -3.563110 1.696751
+v -4.255252 4.053375 0.846421
+v -4.348647 3.563109 0.864996
+v -4.255252 -4.053377 0.846417
+v -4.348647 -3.563110 0.864993
+v -4.338617 4.053377 -0.000003
+v -4.433841 3.563109 -0.000003
+v -4.338617 -4.053377 -0.000006
+v -4.433841 -3.563110 -0.000006
+v -4.255250 4.053375 -0.846425
+v -4.348644 3.563110 -0.865003
+v -4.255250 -4.053377 -0.846428
+v -4.348644 -3.563109 -0.865006
+v -4.008358 4.053377 -1.660319
+v -4.096333 3.563110 -1.696761
+v -4.008358 -4.053376 -1.660322
+v -4.096333 -3.563109 -1.696764
+v -3.607426 4.053378 -2.410409
+v -3.686602 3.563111 -2.463314
+v -3.607426 -4.053376 -2.410412
+v -3.686602 -3.563108 -2.463315
+v -3.067863 4.053378 -3.067867
+v -3.135195 3.563111 -3.135201
+v -3.067863 -4.053376 -3.067870
+v -3.135195 -3.563108 -3.135203
+v -2.410403 4.053378 -3.607430
+v -2.463306 3.563111 -3.686606
+v -2.410403 -4.053376 -3.607433
+v -2.463306 -3.563108 -3.686609
+v -1.660313 4.053378 -4.008360
+v -1.696753 3.563111 -4.096336
+v -1.660313 -4.053376 -4.008362
+v -1.696753 -3.563108 -4.096338
+v -0.846418 4.053378 -4.255251
+v -0.864994 3.563111 -4.348647
+v -0.846418 -4.053376 -4.255253
+v -0.864994 -3.563108 -4.348649
+v 0.000000 2.106952 -4.622553
+v 0.000000 2.681008 -4.510056
+v 0.879868 2.681008 -4.423396
+v 0.901815 2.106952 -4.533732
+v 0.879868 -2.681005 -4.423398
+v 0.000000 -2.681005 -4.510057
+v 0.000000 -2.106949 -4.622555
+v 0.901815 -2.106949 -4.533734
+v 1.725923 2.681008 -4.166749
+v 1.768974 2.106952 -4.270683
+v 1.725923 -2.681005 -4.166750
+v 1.768974 -2.106949 -4.270686
+v 2.505652 2.681008 -3.749974
+v 2.568153 2.106952 -3.843513
+v 2.505652 -2.681005 -3.749975
+v 2.568153 -2.106949 -3.843514
+v 3.189090 2.681007 -3.189090
+v 3.268639 2.106951 -3.268640
+v 3.189090 -2.681005 -3.189092
+v 3.268639 -2.106950 -3.268641
+v 3.749973 2.681007 -2.505652
+v 3.843512 2.106951 -2.568154
+v 3.749973 -2.681005 -2.505655
+v 3.843512 -2.106950 -2.568155
+v 4.166746 2.681007 -1.725924
+v 4.270682 2.106951 -1.768976
+v 4.166746 -2.681006 -1.725925
+v 4.270682 -2.106951 -1.768977
+v 4.423394 2.681007 -0.879869
+v 4.533732 2.106951 -0.901816
+v 4.423394 -2.681006 -0.879870
+v 4.533732 -2.106951 -0.901817
+v 4.510054 2.681006 -0.000001
+v 4.622553 2.106951 -0.000001
+v 4.510054 -2.681007 -0.000002
+v 4.622553 -2.106951 -0.000002
+v 4.423394 2.681006 0.879867
+v 4.533732 2.106950 0.901815
+v 4.423394 -2.681007 0.879866
+v 4.533732 -2.106951 0.901814
+v 4.166746 2.681006 1.725922
+v 4.270682 2.106950 1.768973
+v 4.166746 -2.681007 1.725921
+v 4.270682 -2.106951 1.768972
+v 3.749973 2.681005 2.505651
+v 3.843512 2.106950 2.568153
+v 3.749973 -2.681007 2.505650
+v 3.843512 -2.106951 2.568152
+v 3.189090 2.681005 3.189090
+v 3.268639 2.106950 3.268638
+v 3.189090 -2.681007 3.189088
+v 3.268639 -2.106951 3.268637
+v 2.505651 2.681005 3.749973
+v 2.568152 2.106949 3.843511
+v 2.505651 -2.681008 3.749970
+v 2.568152 -2.106952 3.843510
+v 1.725922 2.681005 4.166748
+v 1.768974 2.106949 4.270682
+v 1.725922 -2.681008 4.166746
+v 1.768974 -2.106952 4.270680
+v 0.879867 2.681005 4.423395
+v 0.901814 2.106949 4.533732
+v 0.879867 -2.681008 4.423392
+v 0.901814 -2.106952 4.533731
+v -0.000002 2.681005 4.510055
+v -0.000002 2.106949 4.622554
+v -0.000002 -2.681008 4.510053
+v -0.000002 -2.106952 4.622552
+v -0.879870 2.681005 4.423395
+v -0.901818 2.106949 4.533732
+v -0.879870 -2.681008 4.423392
+v -0.901818 -2.106952 4.533731
+v -1.725926 2.681005 4.166748
+v -1.768977 2.106949 4.270682
+v -1.725926 -2.681008 4.166746
+v -1.768977 -2.106952 4.270680
+v -2.505655 2.681005 3.749974
+v -2.568156 2.106949 3.843512
+v -2.505655 -2.681008 3.749972
+v -2.568156 -2.106952 3.843511
+v -3.189093 2.681005 3.189090
+v -3.268641 2.106950 3.268638
+v -3.189093 -2.681007 3.189088
+v -3.268641 -2.106951 3.268637
+v -3.749976 2.681005 2.505650
+v -3.843515 2.106950 2.568151
+v -3.749976 -2.681007 2.505647
+v -3.843515 -2.106951 2.568150
+v -4.166750 2.681006 1.725919
+v -4.270685 2.106950 1.768971
+v -4.166750 -2.681007 1.725918
+v -4.270685 -2.106951 1.768970
+v -4.423396 2.681006 0.879864
+v -4.533734 2.106950 0.901811
+v -4.423396 -2.681007 0.879863
+v -4.533734 -2.106951 0.901810
+v -4.510055 2.681006 -0.000005
+v -4.622554 2.106951 -0.000005
+v -4.510055 -2.681007 -0.000006
+v -4.622554 -2.106951 -0.000006
+v -4.423394 2.681007 -0.879873
+v -4.533732 2.106951 -0.901820
+v -4.423394 -2.681006 -0.879874
+v -4.533732 -2.106951 -0.901821
+v -4.166745 2.681007 -1.725927
+v -4.270681 2.106951 -1.768980
+v -4.166745 -2.681006 -1.725929
+v -4.270681 -2.106951 -1.768981
+v -3.749971 2.681007 -2.505656
+v -3.843510 2.106951 -2.568159
+v -3.749971 -2.681005 -2.505658
+v -3.843510 -2.106950 -2.568160
+v -3.189087 2.681007 -3.189094
+v -3.268635 2.106951 -3.268643
+v -3.189087 -2.681005 -3.189095
+v -3.268635 -2.106950 -3.268644
+v -2.505648 2.681008 -3.749978
+v -2.568149 2.106952 -3.843518
+v -2.505648 -2.681005 -3.749979
+v -2.568149 -2.106949 -3.843518
+v -1.725918 2.681008 -4.166750
+v -1.768969 2.106952 -4.270686
+v -1.725918 -2.681005 -4.166752
+v -1.768969 -2.106949 -4.270688
+v -0.879862 2.681008 -4.423398
+v -0.901809 2.106952 -4.533733
+v -0.879862 -2.681005 -4.423399
+v -0.901809 -2.106949 -4.533735
+v 0.000000 0.000001 -4.719423
+v 0.920713 0.000001 -4.628741
+v 1.806044 0.000001 -4.360179
+v 2.621970 0.000001 -3.924056
+v 3.337135 0.000001 -3.337136
+v 3.924055 0.000000 -2.621970
+v 4.360176 0.000000 -1.806046
+v 4.628739 0.000000 -0.920714
+v 4.719421 -0.000001 -0.000001
+v 4.628739 -0.000001 0.920712
+v 4.360176 -0.000001 1.806043
+v 3.924055 -0.000001 2.621971
+v 3.337135 -0.000002 3.337132
+v 2.621969 -0.000002 3.924054
+v 1.806043 -0.000002 4.360177
+v 0.920712 -0.000002 4.628739
+v -0.000002 -0.000002 4.719422
+v -0.920716 -0.000002 4.628739
+v -1.806047 -0.000002 4.360175
+v -2.621973 -0.000002 3.924055
+v -3.337137 -0.000002 3.337132
+v -3.924058 -0.000001 2.621968
+v -4.360179 -0.000001 1.806041
+v -4.628739 -0.000001 0.920708
+v -4.719422 -0.000001 -0.000005
+v -4.628738 0.000000 -0.920718
+v -4.360175 0.000000 -1.806050
+v -3.924053 0.000000 -2.621976
+v -3.337131 0.000001 -3.337139
+v -2.621966 0.000001 -3.924060
+v -1.806039 0.000001 -4.360180
+v -0.920707 0.000001 -4.628741
+v 0.000000 4.798631 -4.281936
+v 0.835364 4.798632 -4.199658
+v 0.000000 -4.798628 -4.281940
+v 0.835364 -4.798630 -4.199662
+v 1.638626 4.798632 -3.955993
+v 1.638626 -4.798630 -3.955996
+v 2.378916 4.798632 -3.560299
+v 2.378916 -4.798630 -3.560302
+v 3.027786 4.798631 -3.027785
+v 3.027786 -4.798628 -3.027788
+v 3.560299 4.798632 -2.378915
+v 3.560299 -4.798630 -2.378918
+v 3.955992 4.798632 -1.638625
+v 3.955992 -4.798630 -1.638628
+v 4.199659 4.798630 -0.835364
+v 4.199659 -4.798631 -0.835367
+v 4.281935 4.798630 0.000001
+v 4.281935 -4.798631 -0.000002
+v 4.199659 4.798629 0.835366
+v 4.199659 -4.798630 0.835362
+v 3.955992 4.798630 1.638626
+v 3.955992 -4.798632 1.638622
+v 3.560298 4.798630 2.378917
+v 3.560298 -4.798632 2.378913
+v 3.027785 4.798630 3.027787
+v 3.027785 -4.798632 3.027783
+v 2.378915 4.798628 3.560299
+v 2.378915 -4.798631 3.560296
+v 1.638625 4.798630 3.955994
+v 1.638625 -4.798632 3.955991
+v 0.835363 4.798630 4.199660
+v 0.835363 -4.798632 4.199656
+v -0.000001 4.798628 4.281937
+v -0.000001 -4.798631 4.281933
+v -0.835366 4.798630 4.199660
+v -0.835366 -4.798632 4.199656
+v -1.638627 4.798628 3.955993
+v -1.638627 -4.798631 3.955990
+v -2.378917 4.798630 3.560299
+v -2.378917 -4.798632 3.560296
+v -3.027787 4.798630 3.027787
+v -3.027787 -4.798632 3.027783
+v -3.560301 4.798628 2.378915
+v -3.560301 -4.798631 2.378912
+v -3.955994 4.798630 1.638625
+v -3.955994 -4.798632 1.638621
+v -4.199660 4.798629 0.835363
+v -4.199660 -4.798630 0.835360
+v -4.281936 4.798630 -0.000002
+v -4.281936 -4.798631 -0.000005
+v -4.199659 4.798629 -0.835367
+v -4.199659 -4.798630 -0.835370
+v -3.955992 4.798631 -1.638628
+v -3.955992 -4.798628 -1.638631
+v -3.560298 4.798632 -2.378918
+v -3.560298 -4.798630 -2.378921
+v -3.027784 4.798632 -3.027787
+v -3.027784 -4.798630 -3.027790
+v -2.378914 4.798632 -3.560301
+v -2.378914 -4.798630 -3.560304
+v -1.638623 4.798632 -3.955994
+v -1.638623 -4.798630 -3.955997
+v -0.835361 4.798632 -4.199659
+v -0.835361 -4.798630 -4.199663
+v 0.000000 4.156910 -4.371553
+v 0.852848 4.156911 -4.287555
+v 0.852848 -4.156909 -4.287557
+v 0.000000 -4.156909 -4.371555
+v 1.672921 4.156911 -4.038788
+v 1.672921 -4.156909 -4.038791
+v 2.428705 4.156911 -3.634813
+v 2.428705 -4.156909 -3.634816
+v 3.091155 4.156910 -3.091154
+v 3.091155 -4.156909 -3.091157
+v 3.634813 4.156911 -2.428704
+v 3.634813 -4.156909 -2.428707
+v 4.038788 4.156911 -1.672921
+v 4.038788 -4.156909 -1.672924
+v 4.287554 4.156910 -0.852847
+v 4.287554 -4.156910 -0.852850
+v 4.371552 4.156910 0.000001
+v 4.371552 -4.156910 -0.000002
+v 4.287554 4.156909 0.852849
+v 4.287554 -4.156909 0.852846
+v 4.038788 4.156909 1.672921
+v 4.038788 -4.156911 1.672917
+v 3.634813 4.156909 2.428705
+v 3.634813 -4.156911 2.428701
+v 3.091154 4.156909 3.091155
+v 3.091154 -4.156911 3.091152
+v 2.428704 4.156909 3.634813
+v 2.428704 -4.156910 3.634810
+v 1.672920 4.156909 4.038789
+v 1.672920 -4.156911 4.038787
+v 0.852846 4.156909 4.287556
+v 0.852846 -4.156911 4.287553
+v -0.000001 4.156909 4.371552
+v -0.000001 -4.156910 4.371552
+v -0.852849 4.156909 4.287556
+v -0.852849 -4.156911 4.287553
+v -1.672923 4.156909 4.038788
+v -1.672923 -4.156910 4.038786
+v -2.428706 4.156909 3.634813
+v -2.428706 -4.156911 3.634810
+v -3.091157 4.156909 3.091155
+v -3.091157 -4.156911 3.091152
+v -3.634815 4.156909 2.428703
+v -3.634815 -4.156910 2.428700
+v -4.038790 4.156909 1.672920
+v -4.038790 -4.156911 1.672916
+v -4.287555 4.156909 0.852847
+v -4.287555 -4.156909 0.852844
+v -4.371554 4.156910 -0.000003
+v -4.371554 -4.156910 -0.000006
+v -4.287554 4.156909 -0.852850
+v -4.287554 -4.156909 -0.852853
+v -4.038787 4.156910 -1.672924
+v -4.038787 -4.156909 -1.672927
+v -3.634812 4.156911 -2.428707
+v -3.634812 -4.156909 -2.428710
+v -3.091153 4.156911 -3.091157
+v -3.091153 -4.156909 -3.091160
+v -2.428702 4.156911 -3.634816
+v -2.428702 -4.156909 -3.634819
+v -1.672918 4.156911 -4.038791
+v -1.672918 -4.156909 -4.038793
+v -0.852844 4.156911 -4.287556
+v -0.852844 -4.156909 -4.287558
+v 0.000000 3.446066 -4.498246
+v 0.877564 3.446066 -4.411812
+v 0.000000 -3.446063 -4.498248
+v 0.877564 -3.446063 -4.411815
+v 1.721404 3.446066 -4.155838
+v 1.721404 -3.446063 -4.155839
+v 2.499091 3.446066 -3.740155
+v 2.499091 -3.446063 -3.740156
+v 3.180739 3.446065 -3.180740
+v 3.180739 -3.446064 -3.180742
+v 3.740153 3.446065 -2.499090
+v 3.740153 -3.446064 -2.499093
+v 4.155836 3.446064 -1.721404
+v 4.155836 -3.446064 -1.721407
+v 4.411812 3.446064 -0.877564
+v 4.411812 -3.446064 -0.877567
+v 4.498245 3.446064 -0.000000
+v 4.498245 -3.446065 -0.000003
+v 4.411812 3.446064 0.877564
+v 4.411812 -3.446065 0.877561
+v 4.155836 3.446064 1.721403
+v 4.155836 -3.446065 1.721400
+v 3.740153 3.446064 2.499091
+v 3.740153 -3.446065 2.499089
+v 3.180739 3.446064 3.180738
+v 3.180739 -3.446065 3.180737
+v 2.499090 3.446063 3.740152
+v 2.499090 -3.446066 3.740150
+v 1.721403 3.446063 4.155837
+v 1.721403 -3.446066 4.155835
+v 0.877563 3.446063 4.411811
+v 0.877563 -3.446066 4.411809
+v -0.000002 3.446063 4.498244
+v -0.000002 -3.446066 4.498242
+v -0.877566 3.446063 4.411811
+v -0.877566 -3.446066 4.411809
+v -1.721406 3.446063 4.155837
+v -1.721406 -3.446066 4.155835
+v -2.499093 3.446063 3.740154
+v -2.499093 -3.446066 3.740151
+v -3.180742 3.446064 3.180738
+v -3.180742 -3.446065 3.180737
+v -3.740156 3.446064 2.499089
+v -3.740156 -3.446065 2.499088
+v -4.155839 3.446064 1.721401
+v -4.155839 -3.446065 1.721398
+v -4.411813 3.446064 0.877561
+v -4.411813 -3.446065 0.877558
+v -4.498246 3.446064 -0.000004
+v -4.498246 -3.446065 -0.000007
+v -4.411812 3.446064 -0.877568
+v -4.411812 -3.446064 -0.877571
+v -4.155835 3.446064 -1.721408
+v -4.155835 -3.446064 -1.721411
+v -3.740152 3.446065 -2.499095
+v -3.740152 -3.446064 -2.499098
+v -3.180736 3.446065 -3.180743
+v -3.180736 -3.446064 -3.180744
+v -2.499087 3.446066 -3.740158
+v -2.499087 -3.446063 -3.740160
+v -1.721399 3.446066 -4.155839
+v -1.721399 -3.446063 -4.155841
+v -0.877558 3.446066 -4.411815
+v -0.877558 -3.446063 -4.411817
+v 0.000000 2.775532 -4.530448
+v 0.883846 2.775532 -4.443397
+v 0.883846 -2.775529 -4.443398
+v 0.000000 -2.775529 -4.530450
+v 1.733727 2.775532 -4.185588
+v 1.733727 -2.775529 -4.185590
+v 2.516982 2.775532 -3.766930
+v 2.516982 -2.775529 -3.766932
+v 3.203510 2.775532 -3.203511
+v 3.203510 -2.775530 -3.203512
+v 3.766928 2.775532 -2.516982
+v 3.766928 -2.775530 -2.516984
+v 4.185587 2.775531 -1.733728
+v 4.185587 -2.775530 -1.733729
+v 4.443395 2.775531 -0.883847
+v 4.443395 -2.775530 -0.883848
+v 4.530447 2.775530 -0.000001
+v 4.530447 -2.775531 -0.000002
+v 4.443395 2.775530 0.883846
+v 4.443395 -2.775531 0.883844
+v 4.185587 2.775530 1.733725
+v 4.185587 -2.775531 1.733724
+v 3.766928 2.775530 2.516983
+v 3.766928 -2.775532 2.516980
+v 3.203510 2.775530 3.203510
+v 3.203510 -2.775532 3.203507
+v 2.516981 2.775529 3.766928
+v 2.516981 -2.775532 3.766927
+v 1.733726 2.775529 4.185588
+v 1.733726 -2.775532 4.185586
+v 0.883845 2.775529 4.443396
+v 0.883845 -2.775532 4.443394
+v -0.000002 2.775529 4.530447
+v -0.000002 -2.775532 4.530445
+v -0.883848 2.775529 4.443396
+v -0.883848 -2.775532 4.443394
+v -1.733730 2.775529 4.185586
+v -1.733730 -2.775532 4.185585
+v -2.516984 2.775529 3.766929
+v -2.516984 -2.775532 3.766927
+v -3.203512 2.775530 3.203510
+v -3.203512 -2.775532 3.203507
+v -3.766931 2.775530 2.516979
+v -3.766931 -2.775532 2.516978
+v -4.185590 2.775530 1.733724
+v -4.185590 -2.775531 1.733721
+v -4.443397 2.775530 0.883842
+v -4.443397 -2.775531 0.883841
+v -4.530448 2.775530 -0.000005
+v -4.530448 -2.775531 -0.000006
+v -4.443395 2.775531 -0.883851
+v -4.443395 -2.775530 -0.883852
+v -4.185586 2.775531 -1.733732
+v -4.185586 -2.775530 -1.733734
+v -3.766927 2.775532 -2.516987
+v -3.766927 -2.775530 -2.516989
+v -3.203506 2.775532 -3.203514
+v -3.203506 -2.775530 -3.203516
+v -2.516978 2.775532 -3.766933
+v -2.516978 -2.775529 -3.766936
+v -1.733722 2.775532 -4.185591
+v -1.733722 -2.775529 -4.185593
+v -0.883841 2.775532 -4.443398
+v -0.883841 -2.775529 -4.443400
+vt 0.310819 0.890729
+vt 0.294243 0.911489
+vt 0.196123 0.808752
+vt 0.324309 0.867353
+vt 0.334402 0.841759
+vt 0.341594 0.814481
+vt 0.347246 0.785867
+vt 0.352959 0.756129
+vt 0.305065 0.703331
+vt 0.332135 0.715368
+vt 0.279620 0.690441
+vt 0.253993 0.679141
+vt 0.227614 0.671168
+vt 0.200680 0.667600
+vt 0.173817 0.668906
+vt 0.147813 0.675164
+vt 0.123506 0.686193
+vt 0.101690 0.701585
+vt 0.083132 0.720825
+vt 0.068570 0.743292
+vt 0.058848 0.768243
+vt 0.054898 0.794803
+vt 0.053571 0.821629
+vt 0.058234 0.848017
+vt 0.068092 0.872915
+vt 0.082487 0.895453
+vt 0.100766 0.914888
+vt 0.122276 0.930566
+vt 0.146260 0.941969
+vt 0.171881 0.948705
+vt 0.198268 0.950549
+vt 0.224511 0.947451
+vt 0.249717 0.939583
+vt 0.273129 0.927361
+vt 0.827298 0.658847
+vt 0.852437 0.682572
+vt 0.803930 0.683920
+vt 0.560095 0.842512
+vt 0.543284 0.850884
+vt 0.547844 0.818346
+vt 0.877532 0.706176
+vt 0.829114 0.707800
+vt 0.571672 0.867024
+vt 0.554656 0.874978
+vt 0.902799 0.729458
+vt 0.854355 0.731550
+vt 0.582544 0.891884
+vt 0.565382 0.899448
+vt 0.928374 0.752189
+vt 0.879925 0.754700
+vt 0.592932 0.916972
+vt 0.575573 0.924266
+vt 0.954934 0.774259
+vt 0.906154 0.776625
+vt 0.602607 0.942366
+vt 0.585092 0.949639
+vt 0.983820 0.793171
+vt 0.934760 0.795576
+vt 0.613526 0.967584
+vt 0.591890 0.975160
+vt 0.206566 0.005952
+vt 0.226105 0.036027
+vt 0.183705 0.025091
+vt 0.066880 0.370900
+vt 0.059215 0.388153
+vt 0.043231 0.358515
+vt 0.248183 0.063215
+vt 0.203224 0.055748
+vt 0.091403 0.382209
+vt 0.083303 0.399040
+vt 0.270868 0.089535
+vt 0.223262 0.084944
+vt 0.115594 0.393827
+vt 0.107163 0.410449
+vt 0.294169 0.115573
+vt 0.245008 0.112285
+vt 0.139526 0.406044
+vt 0.130704 0.422478
+vt 0.317869 0.141353
+vt 0.268039 0.138639
+vt 0.163046 0.419069
+vt 0.153821 0.435233
+vt 0.341615 0.167052
+vt 0.291800 0.164426
+vt 0.186199 0.432695
+vt 0.176552 0.448579
+vt 0.365404 0.192608
+vt 0.339601 0.215758
+vt 0.208898 0.446992
+vt 0.198842 0.462559
+vt 0.389051 0.218282
+vt 0.231248 0.461777
+vt 0.220744 0.477040
+vt 0.412776 0.243759
+vt 0.363409 0.241401
+vt 0.253088 0.477204
+vt 0.242194 0.492120
+vt 0.436367 0.269065
+vt 0.387262 0.266909
+vt 0.274446 0.493144
+vt 0.263158 0.507784
+vt 0.460089 0.293997
+vt 0.435017 0.317441
+vt 0.295238 0.509666
+vt 0.283655 0.523960
+vt 0.483922 0.318842
+vt 0.459075 0.342422
+vt 0.315632 0.526674
+vt 0.303709 0.540664
+vt 0.507990 0.343428
+vt 0.483239 0.367260
+vt 0.335580 0.544230
+vt 0.323233 0.557930
+vt 0.531987 0.368066
+vt 0.507555 0.391958
+vt 0.355038 0.562359
+vt 0.342363 0.575650
+vt 0.556122 0.392726
+vt 0.531777 0.416732
+vt 0.374097 0.580913
+vt 0.361048 0.593908
+vt 0.580290 0.417364
+vt 0.556040 0.441428
+vt 0.392630 0.599990
+vt 0.379254 0.612668
+vt 0.604730 0.441636
+vt 0.580570 0.465851
+vt 0.410526 0.619682
+vt 0.396810 0.632064
+vt 0.629245 0.465840
+vt 0.605209 0.490188
+vt 0.427940 0.639875
+vt 0.413924 0.651898
+vt 0.653937 0.490043
+vt 0.445007 0.660479
+vt 0.430583 0.672174
+vt 0.678760 0.514281
+vt 0.654773 0.538716
+vt 0.461355 0.681719
+vt 0.446653 0.693013
+vt 0.703521 0.538626
+vt 0.679508 0.563095
+vt 0.477303 0.703387
+vt 0.462216 0.714299
+vt 0.728189 0.563036
+vt 0.704214 0.587473
+vt 0.492624 0.725563
+vt 0.477184 0.736068
+vt 0.752866 0.587156
+vt 0.728955 0.611793
+vt 0.507350 0.748182
+vt 0.491570 0.758269
+vt 0.777444 0.611190
+vt 0.753825 0.635920
+vt 0.521490 0.771144
+vt 0.505475 0.780804
+vt 0.802363 0.634944
+vt 0.778838 0.659938
+vt 0.534963 0.794548
+vt 0.518623 0.803814
+vt 0.531294 0.827139
+vt 0.977298 0.154557
+vt 0.966929 0.158429
+vt 0.963016 0.123857
+vt 0.292457 0.956907
+vt 0.317677 0.937052
+vt 0.298751 0.966242
+vt 0.953207 0.129408
+vt 0.943177 0.095685
+vt 0.263875 0.972230
+vt 0.268426 0.982598
+vt 0.934463 0.102936
+vt 0.918271 0.071366
+vt 0.232719 0.982183
+vt 0.235285 0.993246
+vt 0.911028 0.080110
+vt 0.889118 0.051953
+vt 0.200053 0.986246
+vt 0.200532 0.997608
+vt 0.883617 0.061901
+vt 0.856740 0.038235
+vt 0.167078 0.984168
+vt 0.165436 0.995435
+vt 0.853181 0.049048
+vt 0.822285 0.030746
+vt 0.134973 0.975979
+vt 0.131261 0.986760
+vt 0.820793 0.042048
+vt 0.786964 0.029776
+vt 0.104864 0.961946
+vt 0.099218 0.971864
+vt 0.787589 0.041170
+vt 0.751998 0.035378
+vt 0.077826 0.942526
+vt 0.070428 0.951246
+vt 0.754724 0.046482
+vt 0.718579 0.047381
+vt 0.054770 0.918364
+vt 0.045879 0.925591
+vt 0.723312 0.057805
+vt 0.687828 0.065426
+vt 0.036508 0.890238
+vt 0.026413 0.895719
+vt 0.694416 0.074821
+vt 0.660766 0.089014
+vt 0.023708 0.859005
+vt 0.012723 0.862533
+vt 0.669020 0.097068
+vt 0.638338 0.117587
+vt 0.016940 0.825564
+vt 0.005404 0.826953
+vt 0.648039 0.123978
+vt 0.621516 0.150623
+vt 0.017101 0.791068
+vt 0.005093 0.789881
+vt 0.632793 0.154916
+vt 0.612084 0.186475
+vt 0.023699 0.757213
+vt 0.012652 0.753589
+vt 0.623588 0.188155
+vt 0.621338 0.222194
+vt 0.036873 0.725750
+vt 0.609807 0.222724
+vt 0.625502 0.255693
+vt 0.055541 0.697626
+vt 0.026792 0.720133
+vt 0.614306 0.258331
+vt 0.625244 0.292246
+vt 0.078954 0.673646
+vt 0.071634 0.664807
+vt 0.635753 0.287600
+vt 0.642179 0.323411
+vt 0.106278 0.654512
+vt 0.100698 0.644474
+vt 0.651662 0.316913
+vt 0.664494 0.350812
+vt 0.136563 0.640826
+vt 0.132897 0.629911
+vt 0.672656 0.342678
+vt 0.691375 0.373543
+vt 0.168730 0.633010
+vt 0.167098 0.621567
+vt 0.697948 0.364036
+vt 0.721816 0.390875
+vt 0.201641 0.631250
+vt 0.202075 0.619642
+vt 0.726613 0.380297
+vt 0.754659 0.402347
+vt 0.234151 0.635426
+vt 0.236587 0.624033
+vt 0.757566 0.391069
+vt 0.788666 0.407872
+vt 0.265283 0.645060
+vt 0.269486 0.634266
+vt 0.789725 0.396336
+vt 0.822684 0.407872
+vt 0.294487 0.659276
+vt 0.299930 0.649449
+vt 0.822200 0.396662
+vt 0.855921 0.403486
+vt 0.322120 0.676641
+vt 0.327717 0.668208
+vt 0.854675 0.393450
+vt 0.888710 0.397003
+vt 0.350805 0.693404
+vt 0.354167 0.688644
+vt 0.949772 0.354440
+vt 0.943960 0.351823
+vt 0.965830 0.322241
+vt 0.379271 0.789170
+vt 0.383438 0.753738
+vt 0.389806 0.789971
+vt 0.956035 0.318253
+vt 0.978784 0.289626
+vt 0.375591 0.822771
+vt 0.386843 0.824938
+vt 0.967746 0.286540
+vt 0.987001 0.255825
+vt 0.368111 0.855004
+vt 0.379111 0.858853
+vt 0.975439 0.254358
+vt 0.989629 0.221322
+vt 0.355886 0.885348
+vt 0.366064 0.890901
+vt 0.978035 0.221748
+vt 0.986322 0.187150
+vt 0.338899 0.912941
+vt 0.347853 0.920004
+vt 0.975156 0.189474
+vt 0.325233 0.945143
+vt 0.850291 0.540086
+vt 0.873302 0.552185
+vt 0.841159 0.556793
+vt 0.518911 0.862823
+vt 0.502178 0.870973
+vt 0.507262 0.839745
+vt 0.896641 0.563588
+vt 0.864639 0.569141
+vt 0.529972 0.886258
+vt 0.513018 0.893927
+vt 0.920340 0.574274
+vt 0.888520 0.580814
+vt 0.540419 0.910054
+vt 0.523239 0.917190
+vt 0.944409 0.584213
+vt 0.912797 0.591743
+vt 0.550231 0.934202
+vt 0.532793 0.940769
+vt 0.968921 0.593182
+vt 0.937480 0.601928
+vt 0.559251 0.958816
+vt 0.541411 0.964770
+vt 0.994380 0.599575
+vt 0.987321 0.621026
+vt 0.568553 0.982886
+vt 0.547518 0.989675
+vt 0.448462 0.016416
+vt 0.453523 0.043011
+vt 0.426102 0.022413
+vt 0.047989 0.412890
+vt 0.041065 0.430030
+vt 0.016710 0.422115
+vt 0.461225 0.068562
+vt 0.434617 0.048156
+vt 0.071833 0.423399
+vt 0.064204 0.440211
+vt 0.469690 0.093810
+vt 0.451385 0.100367
+vt 0.095124 0.434524
+vt 0.087002 0.451021
+vt 0.479081 0.118656
+vt 0.118028 0.446236
+vt 0.109377 0.462572
+vt 0.489103 0.143205
+vt 0.460924 0.125846
+vt 0.140507 0.458622
+vt 0.131446 0.474645
+vt 0.500007 0.167373
+vt 0.471281 0.150928
+vt 0.162614 0.471582
+vt 0.153132 0.487372
+vt 0.511606 0.191068
+vt 0.482439 0.175619
+vt 0.184340 0.485056
+vt 0.174417 0.500612
+vt 0.523812 0.214348
+vt 0.506948 0.223622
+vt 0.205621 0.499168
+vt 0.195343 0.514354
+vt 0.536823 0.237126
+vt 0.226506 0.513800
+vt 0.215805 0.528715
+vt 0.550358 0.259495
+vt 0.534172 0.269743
+vt 0.246952 0.528941
+vt 0.235904 0.543495
+vt 0.564699 0.281287
+vt 0.548886 0.291959
+vt 0.266898 0.544666
+vt 0.255494 0.558901
+vt 0.579625 0.302563
+vt 0.564174 0.313740
+vt 0.286440 0.560864
+vt 0.274614 0.574771
+vt 0.595062 0.323404
+vt 0.305493 0.577596
+vt 0.293346 0.591063
+vt 0.611298 0.343577
+vt 0.596644 0.355678
+vt 0.324068 0.594848
+vt 0.311460 0.608016
+vt 0.628118 0.363298
+vt 0.342130 0.612659
+vt 0.329151 0.625451
+vt 0.645705 0.382380
+vt 0.613881 0.375847
+vt 0.359734 0.630992
+vt 0.346319 0.643500
+vt 0.663772 0.401054
+vt 0.631800 0.395479
+vt 0.376850 0.649826
+vt 0.363153 0.661950
+vt 0.682489 0.419050
+vt 0.669467 0.432934
+vt 0.393493 0.669123
+vt 0.379453 0.680917
+vt 0.701729 0.436379
+vt 0.689164 0.450703
+vt 0.409640 0.688894
+vt 0.395187 0.700314
+vt 0.721448 0.453144
+vt 0.425221 0.709168
+vt 0.410448 0.720157
+vt 0.741711 0.469287
+vt 0.709403 0.467842
+vt 0.440294 0.729888
+vt 0.425198 0.740471
+vt 0.762485 0.484814
+vt 0.730144 0.484364
+vt 0.454800 0.751053
+vt 0.439419 0.761239
+vt 0.783824 0.499551
+vt 0.773159 0.515394
+vt 0.468741 0.772671
+vt 0.453004 0.782472
+vt 0.805546 0.513718
+vt 0.795428 0.529866
+vt 0.482162 0.794653
+vt 0.466143 0.804034
+vt 0.827708 0.527228
+vt 0.818103 0.543682
+vt 0.494986 0.817035
+vt 0.478719 0.825992
+vt 0.490767 0.848308
+vt 0.776542 0.713123
+vt 0.802035 0.737219
+vt 0.726484 0.766467
+vt 0.752362 0.790775
+vt 0.700776 0.843168
+vt 0.827882 0.761212
+vt 0.778597 0.815061
+vt 0.726398 0.867297
+vt 0.854406 0.784907
+vt 0.805208 0.839178
+vt 0.752193 0.891454
+vt 0.882354 0.806881
+vt 0.832596 0.863142
+vt 0.777582 0.915809
+vt 0.912487 0.825829
+vt 0.859459 0.885507
+vt 0.802168 0.941079
+vt 0.945802 0.837986
+vt 0.885555 0.905111
+vt 0.822384 0.969418
+vt 0.160524 0.044392
+vt 0.173681 0.078610
+vt 0.091566 0.105128
+vt 0.111404 0.131935
+vt 0.054687 0.190659
+vt 0.191746 0.109013
+vt 0.134786 0.160092
+vt 0.079897 0.215199
+vt 0.214027 0.137785
+vt 0.158255 0.187513
+vt 0.104518 0.241287
+vt 0.237580 0.165014
+vt 0.182309 0.214626
+vt 0.128916 0.267536
+vt 0.261551 0.191461
+vt 0.206598 0.241325
+vt 0.153252 0.293736
+vt 0.285616 0.217479
+vt 0.230939 0.267658
+vt 0.177698 0.319762
+vt 0.309680 0.243275
+vt 0.255354 0.293678
+vt 0.202133 0.345655
+vt 0.333732 0.268902
+vt 0.279697 0.319478
+vt 0.226672 0.371348
+vt 0.357773 0.294425
+vt 0.304073 0.345087
+vt 0.251254 0.396894
+vt 0.381838 0.319825
+vt 0.328474 0.370564
+vt 0.275843 0.422311
+vt 0.405979 0.345090
+vt 0.352914 0.395923
+vt 0.300441 0.447605
+vt 0.430226 0.370194
+vt 0.377401 0.421157
+vt 0.325044 0.472794
+vt 0.454548 0.395141
+vt 0.401917 0.446286
+vt 0.349604 0.497936
+vt 0.478855 0.420062
+vt 0.426474 0.471328
+vt 0.374270 0.522941
+vt 0.503290 0.444843
+vt 0.451065 0.496303
+vt 0.398902 0.547962
+vt 0.527785 0.469512
+vt 0.475711 0.521214
+vt 0.423580 0.572893
+vt 0.552315 0.494155
+vt 0.500407 0.546021
+vt 0.448294 0.597819
+vt 0.576994 0.518692
+vt 0.525152 0.570767
+vt 0.473052 0.622781
+vt 0.601744 0.543122
+vt 0.549976 0.595402
+vt 0.497921 0.647728
+vt 0.626501 0.567520
+vt 0.574857 0.619996
+vt 0.523026 0.672466
+vt 0.651337 0.591851
+vt 0.599837 0.644526
+vt 0.548178 0.697166
+vt 0.676170 0.616212
+vt 0.624899 0.668984
+vt 0.573479 0.721702
+vt 0.701102 0.640516
+vt 0.650079 0.693401
+vt 0.598776 0.746169
+vt 0.726074 0.664817
+vt 0.675373 0.717783
+vt 0.624201 0.770499
+vt 0.751241 0.688990
+vt 0.700838 0.742133
+vt 0.649636 0.794826
+vt 0.675171 0.819032
+vt 0.797607 0.690587
+vt 0.822827 0.714505
+vt 0.679128 0.865525
+vt 0.848163 0.738297
+vt 0.704522 0.889584
+vt 0.873881 0.761733
+vt 0.729828 0.913648
+vt 0.901036 0.783605
+vt 0.754991 0.937769
+vt 0.930297 0.802475
+vt 0.779907 0.962034
+vt 0.961832 0.818924
+vt 0.804336 0.986690
+vt 0.180227 0.028130
+vt 0.196613 0.060238
+vt 0.032679 0.212538
+vt 0.025442 0.169024
+vt 0.215969 0.090395
+vt 0.057312 0.238141
+vt 0.237890 0.118141
+vt 0.081866 0.263832
+vt 0.261131 0.144725
+vt 0.106162 0.289680
+vt 0.284904 0.170721
+vt 0.130498 0.315660
+vt 0.308851 0.196427
+vt 0.154967 0.341744
+vt 0.332738 0.222099
+vt 0.179685 0.367606
+vt 0.356625 0.247713
+vt 0.204374 0.393273
+vt 0.380501 0.273213
+vt 0.229051 0.418792
+vt 0.404388 0.298600
+vt 0.253721 0.444179
+vt 0.428365 0.323782
+vt 0.278384 0.469441
+vt 0.452462 0.348792
+vt 0.303031 0.494583
+vt 0.476649 0.373677
+vt 0.327625 0.519607
+vt 0.500972 0.398409
+vt 0.352181 0.544788
+vt 0.525245 0.423161
+vt 0.376983 0.569764
+vt 0.549576 0.447849
+vt 0.401676 0.594573
+vt 0.574102 0.472349
+vt 0.426253 0.619507
+vt 0.598736 0.496753
+vt 0.450990 0.644539
+vt 0.623512 0.521045
+vt 0.475914 0.669613
+vt 0.648319 0.545304
+vt 0.501087 0.694703
+vt 0.673050 0.569664
+vt 0.526554 0.719466
+vt 0.697770 0.594039
+vt 0.551960 0.744006
+vt 0.722546 0.618376
+vt 0.577297 0.768389
+vt 0.747496 0.642489
+vt 0.602599 0.792923
+vt 0.772489 0.666579
+vt 0.628163 0.817246
+vt 0.653671 0.841426
+vt 0.838480 0.561690
+vt 0.862100 0.574144
+vt 0.830878 0.575592
+vt 0.537718 0.853613
+vt 0.523834 0.860416
+vt 0.525780 0.830034
+vt 0.886135 0.585889
+vt 0.854939 0.588272
+vt 0.549021 0.877562
+vt 0.534961 0.883987
+vt 0.910573 0.596893
+vt 0.879399 0.600219
+vt 0.559683 0.901878
+vt 0.545467 0.907921
+vt 0.935416 0.607144
+vt 0.904230 0.611407
+vt 0.569809 0.926537
+vt 0.555359 0.932223
+vt 0.960740 0.616663
+vt 0.929409 0.621825
+vt 0.579117 0.951515
+vt 0.564470 0.956984
+vt 0.985964 0.624519
+vt 0.954911 0.631499
+vt 0.587713 0.976394
+vt 0.571982 0.981577
+vt 0.422546 0.023557
+vt 0.429142 0.049984
+vt 0.405693 0.028096
+vt 0.056651 0.393799
+vt 0.050336 0.407976
+vt 0.032638 0.383295
+vt 0.437155 0.076293
+vt 0.413417 0.054930
+vt 0.080692 0.404597
+vt 0.074107 0.418482
+vt 0.445975 0.102305
+vt 0.421746 0.081520
+vt 0.104418 0.415955
+vt 0.097534 0.429653
+vt 0.455593 0.127947
+vt 0.430740 0.107885
+vt 0.127807 0.427919
+vt 0.120574 0.441438
+vt 0.466011 0.153208
+vt 0.440571 0.133956
+vt 0.150783 0.440570
+vt 0.143188 0.453891
+vt 0.477229 0.178081
+vt 0.462708 0.185081
+vt 0.173372 0.453824
+vt 0.165436 0.466902
+vt 0.489292 0.202448
+vt 0.195533 0.467688
+vt 0.187247 0.480533
+vt 0.501970 0.226367
+vt 0.475061 0.209898
+vt 0.217286 0.482104
+vt 0.208668 0.494696
+vt 0.515352 0.249829
+vt 0.487980 0.234207
+vt 0.238613 0.497054
+vt 0.229683 0.509397
+vt 0.529436 0.272766
+vt 0.501683 0.258092
+vt 0.259443 0.512618
+vt 0.250204 0.524683
+vt 0.544213 0.295156
+vt 0.531199 0.304252
+vt 0.279844 0.528665
+vt 0.270298 0.540458
+vt 0.559653 0.317041
+vt 0.546980 0.326478
+vt 0.299749 0.545277
+vt 0.289926 0.556787
+vt 0.575718 0.338369
+vt 0.563293 0.348089
+vt 0.319182 0.562415
+vt 0.309059 0.573645
+vt 0.592339 0.359224
+vt 0.338183 0.580045
+vt 0.327769 0.590974
+vt 0.609670 0.379556
+vt 0.597750 0.389956
+vt 0.356739 0.598199
+vt 0.345956 0.608876
+vt 0.627685 0.399347
+vt 0.616107 0.410151
+vt 0.374801 0.616856
+vt 0.363700 0.627285
+vt 0.646368 0.418529
+vt 0.392258 0.636104
+vt 0.380895 0.646248
+vt 0.665644 0.437035
+vt 0.635161 0.429753
+vt 0.409259 0.655827
+vt 0.397627 0.665652
+vt 0.685482 0.454912
+vt 0.654854 0.448587
+vt 0.425802 0.675995
+vt 0.413879 0.685531
+vt 0.705851 0.472166
+vt 0.695794 0.484336
+vt 0.441759 0.696698
+vt 0.429561 0.705921
+vt 0.726724 0.488794
+vt 0.717030 0.501263
+vt 0.457209 0.717856
+vt 0.444729 0.726756
+vt 0.748103 0.504755
+vt 0.738770 0.517536
+vt 0.472050 0.739505
+vt 0.459301 0.748053
+vt 0.770003 0.520080
+vt 0.761128 0.533177
+vt 0.486380 0.761556
+vt 0.473386 0.769754
+vt 0.792447 0.534615
+vt 0.784013 0.548027
+vt 0.500160 0.783972
+vt 0.486870 0.791871
+vt 0.815257 0.548517
+vt 0.513226 0.806826
+vt 0.499766 0.814374
+vt 0.512091 0.837222
+vt 0.485463 0.851068
+vt 0.830795 0.521981
+vt 0.853233 0.534712
+vt 0.473525 0.828863
+vt 0.808790 0.508574
+vt 0.461038 0.807037
+vt 0.787212 0.494505
+vt 0.447991 0.785590
+vt 0.434489 0.764497
+vt 0.766033 0.479870
+vt 0.745416 0.464479
+vt 0.420379 0.743862
+vt 0.725305 0.448457
+vt 0.405733 0.723674
+vt 0.390584 0.703945
+vt 0.705722 0.431819
+vt 0.374975 0.684659
+vt 0.686625 0.414627
+vt 0.358747 0.665850
+vt 0.668095 0.396718
+vt 0.342040 0.647478
+vt 0.650126 0.378201
+vt 0.324988 0.629532
+vt 0.632665 0.359261
+vt 0.307451 0.612185
+vt 0.615945 0.339730
+vt 0.289458 0.595377
+vt 0.599861 0.319706
+vt 0.270851 0.579203
+vt 0.584552 0.299021
+vt 0.251839 0.563438
+vt 0.569749 0.277874
+vt 0.232370 0.548154
+vt 0.555547 0.256230
+vt 0.542110 0.234026
+vt 0.212399 0.533466
+vt 0.192052 0.519212
+vt 0.529220 0.211397
+vt 0.171257 0.505566
+vt 0.517113 0.188279
+vt 0.505621 0.164740
+vt 0.150093 0.492410
+vt 0.494819 0.140754
+vt 0.128542 0.479775
+vt 0.484866 0.116386
+vt 0.106615 0.467773
+vt 0.475565 0.091718
+vt 0.084388 0.456305
+vt 0.467156 0.066674
+vt 0.061766 0.445556
+vt 0.459500 0.041305
+vt 0.038778 0.435435
+vt 0.452668 0.015570
+vt 0.543661 0.990672
+vt 0.970736 0.587412
+vt 0.995421 0.595640
+vt 0.535753 0.966510
+vt 0.946600 0.578540
+vt 0.527218 0.942865
+vt 0.922748 0.568687
+vt 0.517751 0.919485
+vt 0.899225 0.558079
+vt 0.507603 0.896382
+vt 0.876058 0.546756
+vt 0.496830 0.873579
+vt 0.860237 0.521927
+vt 0.882674 0.533760
+vt 0.484020 0.879778
+vt 0.905425 0.544883
+vt 0.494614 0.902227
+vt 0.928499 0.555271
+vt 0.504564 0.924934
+vt 0.751373 0.500239
+vt 0.951892 0.564899
+vt 0.513824 0.947902
+vt 0.975605 0.573701
+vt 0.522300 0.971156
+vt 0.999730 0.581622
+vt 0.529918 0.994810
+vt 0.467214 0.012070
+vt 0.473830 0.037283
+vt 0.033395 0.448402
+vt 0.015426 0.425973
+vt 0.481368 0.062160
+vt 0.055934 0.458369
+vt 0.650334 0.414540
+vt 0.489639 0.086721
+vt 0.078127 0.468962
+vt 0.498737 0.110972
+vt 0.100005 0.480243
+vt 0.508525 0.134916
+vt 0.121599 0.492065
+vt 0.519107 0.158500
+vt 0.142847 0.504498
+vt 0.580101 0.334967
+vt 0.530354 0.181668
+vt 0.163714 0.517437
+vt 0.542218 0.204396
+vt 0.184195 0.530860
+vt 0.554830 0.226679
+vt 0.204276 0.544876
+vt 0.568031 0.248509
+vt 0.223946 0.559337
+vt 0.520249 0.246923
+vt 0.581929 0.269816
+vt 0.243134 0.574346
+vt 0.596432 0.290608
+vt 0.261860 0.589846
+vt 0.494313 0.199869
+vt 0.611460 0.310872
+vt 0.280125 0.605762
+vt 0.627142 0.330475
+vt 0.297784 0.622210
+vt 0.643523 0.349545
+vt 0.314966 0.639247
+vt 0.660687 0.368154
+vt 0.331748 0.656947
+vt 0.678435 0.386396
+vt 0.348234 0.675138
+vt 0.442608 0.074517
+vt 0.696616 0.404026
+vt 0.364209 0.693663
+vt 0.715301 0.420890
+vt 0.379524 0.712612
+vt 0.024957 0.401779
+vt 0.734521 0.437214
+vt 0.394405 0.732043
+vt 0.962651 0.611347
+vt 0.754258 0.452931
+vt 0.408793 0.751927
+vt 0.774510 0.468007
+vt 0.422653 0.772246
+vt 0.795301 0.482400
+vt 0.435941 0.793012
+vt 0.816530 0.496236
+vt 0.448774 0.814155
+vt 0.838173 0.509408
+vt 0.461060 0.835673
+vt 0.472817 0.857574
+vt 0.810139 0.626706
+vt 0.835143 0.650537
+vt 0.785264 0.603031
+vt 0.760751 0.579133
+vt 0.736210 0.554925
+vt 0.711447 0.530561
+vt 0.686657 0.506204
+vt 0.661819 0.481956
+vt 0.637138 0.457777
+vt 0.612637 0.433676
+vt 0.588357 0.409370
+vt 0.564176 0.384806
+vt 0.540067 0.360167
+vt 0.516069 0.335605
+vt 0.492141 0.310934
+vt 0.468266 0.286229
+vt 0.444694 0.261346
+vt 0.421183 0.236100
+vt 0.397539 0.210521
+vt 0.373758 0.184952
+vt 0.350073 0.159338
+vt 0.326382 0.133643
+vt 0.302760 0.107831
+vt 0.279284 0.081992
+vt 0.256199 0.056031
+vt 0.233466 0.029689
+vt 0.034190 0.379163
+vt 0.211248 0.002453
+vt 0.961022 0.766901
+vt 0.987214 0.788707
+vt 0.935565 0.744348
+vt 0.910380 0.721270
+vt 0.885255 0.697890
+vt 0.860213 0.674318
+vt 0.552346 0.815973
+vt 0.934527 0.170847
+vt 0.940105 0.196819
+vt 0.539367 0.792061
+vt 0.941741 0.223758
+vt 0.525826 0.768549
+vt 0.511609 0.745484
+vt 0.939350 0.251167
+vt 0.933610 0.278785
+vt 0.496815 0.722744
+vt 0.925906 0.306914
+vt 0.481402 0.700456
+vt 0.917751 0.336080
+vt 0.465369 0.678678
+vt 0.448901 0.657345
+vt 0.629920 0.514507
+vt 0.851341 0.361965
+vt 0.887827 0.391242
+vt 0.822820 0.362145
+vt 0.431762 0.636627
+vt 0.414252 0.616352
+vt 0.794848 0.360817
+vt 0.767693 0.356163
+vt 0.396257 0.596573
+vt 0.377629 0.577397
+vt 0.742000 0.347345
+vt 0.358476 0.558742
+vt 0.718546 0.334188
+vt 0.698067 0.316968
+vt 0.338910 0.540537
+vt 0.681227 0.296246
+vt 0.318863 0.522891
+vt 0.298376 0.505806
+vt 0.668578 0.272727
+vt 0.411051 0.292324
+vt 0.660557 0.247219
+vt 0.277489 0.489209
+vt 0.256036 0.473174
+vt 0.657544 0.220620
+vt 0.234090 0.457648
+vt 0.659981 0.193943
+vt 0.211634 0.442767
+vt 0.668297 0.168415
+vt 0.188811 0.428403
+vt 0.315700 0.190119
+vt 0.679071 0.143824
+vt 0.165543 0.414696
+vt 0.695019 0.122284
+vt 0.141891 0.401611
+vt 0.714951 0.104409
+vt 0.117852 0.389311
+vt 0.737887 0.090668
+vt 0.093592 0.377640
+vt 0.762916 0.081446
+vt 0.069213 0.366370
+vt 0.789162 0.077009
+vt 0.044729 0.355305
+vt 0.815709 0.077516
+vt 0.616898 0.966236
+vt 0.607364 0.940528
+vt 0.964960 0.815519
+vt 0.841645 0.082923
+vt 0.866069 0.093056
+vt 0.597648 0.915071
+vt 0.587227 0.889873
+vt 0.888166 0.107532
+vt 0.576292 0.864900
+vt 0.907215 0.125822
+vt 0.564652 0.840265
+vt 0.922713 0.147216
+vt 0.800886 0.218990
+vt 0.880922 0.363256
+vt 0.046709 0.690276
+vt 0.389807 0.753990
+vt 0.007574 0.187373
+vt 0.980575 0.640547
+vt 0.026447 0.398569
+vt 0.451184 0.159704
+vt 0.516083 0.281471
+vt 0.580179 0.369219
+vt 0.675067 0.466760
+vt 0.807231 0.562167
+vt 0.010443 0.439251
+vn 0.000214 -0.999969 0.001068
+vn 0.000000 -0.999969 0.001068
+vn 0.000000 -1.000000 0.000000
+vn 0.000397 -0.999969 0.001007
+vn 0.000580 -0.999969 0.000885
+vn 0.000763 -0.999969 0.000763
+vn 0.000885 -0.999969 0.000580
+vn 0.001007 -0.999969 0.000397
+vn 0.001068 -0.999969 0.000183
+vn 0.001099 -0.999969 0.000000
+vn 0.001068 -0.999969 -0.000214
+vn 0.001007 -0.999969 -0.000397
+vn 0.000885 -0.999969 -0.000610
+vn 0.000763 -0.999969 -0.000763
+vn 0.000610 -0.999969 -0.000885
+vn 0.000397 -0.999969 -0.001007
+vn 0.000214 -0.999969 -0.001068
+vn 0.000000 -0.999969 -0.001099
+vn -0.000214 -0.999969 -0.001068
+vn -0.000397 -0.999969 -0.001007
+vn -0.000610 -0.999969 -0.000885
+vn -0.000763 -0.999969 -0.000763
+vn -0.000885 -0.999969 -0.000610
+vn -0.001007 -0.999969 -0.000397
+vn -0.001068 -0.999969 -0.000214
+vn -0.001099 -0.999969 0.000000
+vn -0.001068 -0.999969 0.000183
+vn -0.001007 -0.999969 0.000397
+vn -0.000885 -0.999969 0.000580
+vn -0.000763 -0.999969 0.000763
+vn -0.000580 -0.999969 0.000885
+vn -0.000397 -0.999969 0.001007
+vn -0.000214 -0.999969 0.001068
+vn 0.000000 -0.047945 -0.998840
+vn -0.194861 -0.047945 -0.979644
+vn -0.194861 0.047945 -0.979644
+vn 0.000000 0.047945 -0.998840
+vn -0.382214 -0.047945 -0.922788
+vn -0.382214 0.047945 -0.922788
+vn -0.554918 -0.047945 -0.830500
+vn -0.554918 0.047945 -0.830500
+vn -0.706290 -0.047945 -0.706290
+vn -0.706290 0.047945 -0.706290
+vn -0.830500 -0.047945 -0.554918
+vn -0.830500 0.047945 -0.554918
+vn -0.922788 -0.047945 -0.382214
+vn -0.922788 0.047945 -0.382214
+vn -0.979644 -0.047945 -0.194861
+vn -0.979644 0.047945 -0.194861
+vn -0.998840 -0.047945 0.000000
+vn -0.998840 0.047945 0.000000
+vn -0.979644 -0.047945 0.194861
+vn -0.979644 0.047945 0.194861
+vn -0.922788 -0.047945 0.382214
+vn -0.922788 0.047945 0.382214
+vn -0.830500 -0.047945 0.554918
+vn -0.830500 0.047945 0.554918
+vn -0.706290 -0.047945 0.706290
+vn -0.706290 0.047945 0.706290
+vn -0.554918 -0.047945 0.830500
+vn -0.554918 0.047945 0.830500
+vn -0.382214 -0.047945 0.922788
+vn -0.382214 0.047945 0.922788
+vn -0.194861 -0.047945 0.979644
+vn -0.194861 0.047945 0.979644
+vn 0.000000 -0.047945 0.998840
+vn 0.000000 0.047945 0.998840
+vn 0.194861 -0.047945 0.979644
+vn 0.194861 0.047945 0.979644
+vn 0.382214 -0.047945 0.922788
+vn 0.382214 0.047945 0.922788
+vn 0.554918 -0.047945 0.830500
+vn 0.554918 0.047945 0.830500
+vn 0.706290 -0.047945 0.706290
+vn 0.706290 0.047945 0.706290
+vn 0.830500 -0.047945 0.554918
+vn 0.830500 0.047945 0.554918
+vn 0.922788 -0.047945 0.382214
+vn 0.922788 0.047945 0.382214
+vn 0.979644 -0.047945 0.194861
+vn 0.979644 0.047945 0.194861
+vn 0.998840 -0.047945 0.000000
+vn 0.998840 0.047945 0.000000
+vn 0.979644 -0.047945 -0.194861
+vn 0.979644 0.047945 -0.194861
+vn 0.922788 -0.047945 -0.382214
+vn 0.922788 0.047945 -0.382214
+vn 0.830500 -0.047945 -0.554918
+vn 0.830500 0.047945 -0.554918
+vn 0.706290 -0.047945 -0.706290
+vn 0.706290 0.047945 -0.706290
+vn 0.554918 -0.047945 -0.830500
+vn 0.554918 0.047945 -0.830500
+vn 0.382214 -0.047945 -0.922788
+vn 0.382214 0.047945 -0.922788
+vn 0.194861 -0.047945 -0.979644
+vn 0.194861 0.047945 -0.979644
+vn 0.000000 -0.470199 -0.882534
+vn 0.172155 -0.470199 -0.865566
+vn 0.172155 0.470199 -0.865566
+vn 0.000000 0.470199 -0.882534
+vn 0.337718 -0.470229 -0.815363
+vn 0.337718 0.470199 -0.815363
+vn 0.337718 -0.470229 -0.815332
+vn 0.490310 -0.470199 -0.733787
+vn 0.490310 0.470199 -0.733787
+vn 0.624043 -0.470229 -0.624043
+vn 0.624043 0.470229 -0.624043
+vn 0.733787 -0.470199 -0.490310
+vn 0.733787 0.470199 -0.490310
+vn 0.815363 -0.470199 -0.337718
+vn 0.815363 0.470199 -0.337718
+vn 0.865566 -0.470199 -0.172155
+vn 0.865566 0.470199 -0.172155
+vn 0.882534 -0.470199 0.000000
+vn 0.882534 0.470199 0.000000
+vn 0.865566 -0.470199 0.172155
+vn 0.865566 0.470199 0.172155
+vn 0.815363 -0.470199 0.337718
+vn 0.815363 0.470199 0.337718
+vn 0.733787 -0.470199 0.490310
+vn 0.733787 0.470199 0.490310
+vn 0.624043 -0.470229 0.624043
+vn 0.624043 0.470199 0.624043
+vn 0.490310 -0.470199 0.733787
+vn 0.490310 0.470199 0.733787
+vn 0.337718 -0.470199 0.815363
+vn 0.337718 0.470229 0.815332
+vn 0.172155 -0.470199 0.865566
+vn 0.172155 0.470199 0.865566
+vn 0.000000 -0.470199 0.882534
+vn 0.000000 0.470199 0.882534
+vn -0.172155 -0.470199 0.865566
+vn -0.172155 0.470199 0.865566
+vn -0.337718 -0.470229 0.815332
+vn -0.337718 0.470199 0.815363
+vn -0.337718 -0.470229 0.815363
+vn -0.490310 -0.470199 0.733787
+vn -0.490310 0.470199 0.733787
+vn -0.624043 -0.470229 0.624043
+vn -0.624043 0.470199 0.624043
+vn -0.733787 -0.470199 0.490310
+vn -0.733787 0.470199 0.490310
+vn -0.815363 -0.470199 0.337718
+vn -0.815363 0.470199 0.337718
+vn -0.865566 -0.470229 0.172155
+vn -0.865566 0.470199 0.172155
+vn -0.882534 -0.470199 0.000000
+vn -0.882534 0.470199 0.000000
+vn -0.865566 -0.470199 -0.172155
+vn -0.865566 0.470199 -0.172155
+vn -0.815363 -0.470199 -0.337718
+vn -0.815363 0.470199 -0.337718
+vn -0.733787 -0.470199 -0.490310
+vn -0.733787 0.470199 -0.490310
+vn -0.624043 -0.470199 -0.624043
+vn -0.624043 0.470199 -0.624043
+vn -0.490310 -0.470199 -0.733787
+vn -0.490310 0.470199 -0.733787
+vn -0.337718 -0.470199 -0.815363
+vn -0.337718 0.470229 -0.815332
+vn -0.337718 0.470199 -0.815363
+vn -0.337718 -0.470229 -0.815332
+vn -0.172155 -0.470199 -0.865566
+vn -0.172155 0.470229 -0.865566
+vn -0.172155 0.470199 -0.865566
+vn -0.172155 -0.470229 -0.865566
+vn 0.000000 -0.138279 -0.990387
+vn -0.193213 -0.138279 -0.971343
+vn -0.193213 0.138310 -0.971343
+vn 0.000000 0.138279 -0.990387
+vn -0.378979 -0.138279 -0.914975
+vn -0.378979 0.138310 -0.914975
+vn -0.550218 -0.138310 -0.823450
+vn -0.378979 -0.138310 -0.914975
+vn -0.550218 0.138310 -0.823450
+vn -0.700308 -0.138310 -0.700308
+vn -0.700308 0.138310 -0.700308
+vn -0.823450 -0.138279 -0.550218
+vn -0.823450 0.138279 -0.550218
+vn -0.823450 0.138310 -0.550218
+vn -0.914975 -0.138279 -0.378979
+vn -0.914975 0.138279 -0.378979
+vn -0.971343 -0.138279 -0.193213
+vn -0.971343 0.138279 -0.193213
+vn -0.990387 -0.138279 0.000000
+vn -0.990387 0.138310 0.000000
+vn -0.990387 0.138279 0.000000
+vn -0.971343 -0.138279 0.193213
+vn -0.971343 0.138310 0.193213
+vn -0.971343 0.138279 0.193213
+vn -0.914975 -0.138310 0.378979
+vn -0.914975 0.138310 0.378979
+vn -0.823450 -0.138279 0.550218
+vn -0.823450 0.138279 0.550218
+vn -0.700308 -0.138310 0.700308
+vn -0.700308 0.138279 0.700308
+vn -0.550218 -0.138310 0.823450
+vn -0.550218 0.138279 0.823450
+vn -0.378979 -0.138310 0.914975
+vn -0.378979 0.138310 0.914975
+vn -0.193213 -0.138310 0.971343
+vn -0.193213 0.138310 0.971343
+vn -0.193213 0.138279 0.971343
+vn 0.000000 -0.138310 0.990387
+vn 0.000000 0.138279 0.990387
+vn 0.193213 -0.138310 0.971343
+vn 0.193213 0.138279 0.971343
+vn 0.193213 0.138310 0.971343
+vn 0.378979 -0.138310 0.914975
+vn 0.378979 0.138279 0.914975
+vn 0.550218 -0.138279 0.823450
+vn 0.550218 0.138279 0.823450
+vn 0.700308 -0.138279 0.700308
+vn 0.700308 0.138279 0.700308
+vn 0.823450 -0.138310 0.550218
+vn 0.823450 0.138310 0.550218
+vn 0.914975 -0.138310 0.378979
+vn 0.914975 0.138279 0.378979
+vn 0.971343 -0.138279 0.193213
+vn 0.914975 -0.138279 0.378979
+vn 0.971343 0.138279 0.193213
+vn 0.990387 -0.138279 0.000000
+vn 0.990387 0.138279 0.000000
+vn 0.971343 -0.138279 -0.193213
+vn 0.971343 0.138279 -0.193213
+vn 0.914975 -0.138310 -0.378979
+vn 0.914975 0.138310 -0.378979
+vn 0.823450 -0.138310 -0.550218
+vn 0.823450 0.138279 -0.550218
+vn 0.823450 0.138310 -0.550218
+vn 0.700308 -0.138279 -0.700308
+vn 0.823450 -0.138279 -0.550218
+vn 0.700308 0.138279 -0.700308
+vn 0.550218 -0.138279 -0.823450
+vn 0.550218 0.138279 -0.823450
+vn 0.378979 -0.138279 -0.914975
+vn 0.378979 0.138279 -0.914975
+vn 0.193213 -0.138279 -0.971343
+vn 0.193213 0.138310 -0.971343
+vn 0.000000 0.138310 -0.990387
+vn 0.000000 -0.118900 -0.992889
+vn -0.193701 -0.118900 -0.973815
+vn 0.000000 0.000000 -0.999969
+vn -0.195074 0.000000 -0.980773
+vn -0.193701 0.118900 -0.973815
+vn -0.379955 -0.118900 -0.917325
+vn -0.382672 0.000000 -0.923856
+vn -0.379955 0.118900 -0.917325
+vn -0.551622 -0.118900 -0.825556
+vn -0.555559 0.000000 -0.831446
+vn -0.551622 0.118900 -0.825556
+vn -0.702078 -0.118900 -0.702078
+vn -0.707083 0.000000 -0.707083
+vn -0.702078 0.118900 -0.702078
+vn -0.825556 -0.118900 -0.551622
+vn -0.831446 0.000000 -0.555559
+vn -0.825556 0.118900 -0.551622
+vn -0.917295 -0.118900 -0.379955
+vn -0.923856 0.000000 -0.382672
+vn -0.917295 0.118900 -0.379955
+vn -0.973815 -0.118900 -0.193701
+vn -0.980773 0.000000 -0.195074
+vn -0.973815 0.118900 -0.193701
+vn -0.992889 -0.118900 0.000000
+vn -0.999969 0.000000 0.000000
+vn -0.992889 0.118900 0.000000
+vn -0.973815 -0.118900 0.193701
+vn -0.980773 0.000000 0.195074
+vn -0.973815 0.118900 0.193701
+vn -0.917325 -0.118900 0.379955
+vn -0.923856 0.000000 0.382672
+vn -0.917325 0.118900 0.379955
+vn -0.825556 -0.118900 0.551622
+vn -0.831446 0.000000 0.555559
+vn -0.825556 0.118900 0.551622
+vn -0.702078 -0.118900 0.702078
+vn -0.707083 0.000000 0.707083
+vn -0.702078 0.118900 0.702078
+vn -0.551622 -0.118900 0.825556
+vn -0.555559 0.000000 0.831446
+vn -0.551622 0.118900 0.825556
+vn -0.379955 -0.118900 0.917325
+vn -0.382672 0.000000 0.923856
+vn -0.379955 0.118900 0.917325
+vn -0.193701 -0.118900 0.973815
+vn -0.195074 0.000000 0.980773
+vn -0.193701 0.118900 0.973815
+vn 0.000000 -0.118900 0.992889
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.118900 0.992889
+vn 0.193701 -0.118900 0.973815
+vn 0.195074 0.000000 0.980773
+vn 0.193701 0.118900 0.973815
+vn 0.379955 -0.118900 0.917295
+vn 0.382672 0.000000 0.923856
+vn 0.379955 0.118900 0.917295
+vn 0.551622 -0.118900 0.825556
+vn 0.555559 0.000000 0.831446
+vn 0.551622 0.118900 0.825556
+vn 0.702078 -0.118900 0.702078
+vn 0.707083 0.000000 0.707083
+vn 0.702078 0.118900 0.702078
+vn 0.825556 -0.118900 0.551622
+vn 0.831446 0.000000 0.555559
+vn 0.825556 0.118900 0.551622
+vn 0.917325 -0.118900 0.379955
+vn 0.923856 0.000000 0.382672
+vn 0.917325 0.118900 0.379955
+vn 0.973815 -0.118900 0.193701
+vn 0.980773 0.000000 0.195074
+vn 0.973815 0.118900 0.193701
+vn 0.992889 -0.118900 0.000000
+vn 0.999969 0.000000 0.000000
+vn 0.992889 0.118900 0.000000
+vn 0.973815 -0.118900 -0.193701
+vn 0.980773 0.000000 -0.195074
+vn 0.973815 0.118900 -0.193701
+vn 0.917295 -0.118900 -0.379955
+vn 0.923856 0.000000 -0.382672
+vn 0.917295 0.118900 -0.379955
+vn 0.825556 -0.118900 -0.551622
+vn 0.831446 0.000000 -0.555559
+vn 0.825556 0.118900 -0.551622
+vn 0.702078 -0.118900 -0.702078
+vn 0.707083 0.000000 -0.707083
+vn 0.702078 0.118900 -0.702078
+vn 0.551622 -0.118900 -0.825556
+vn 0.555559 0.000000 -0.831446
+vn 0.551622 0.118900 -0.825556
+vn 0.379955 -0.118900 -0.917325
+vn 0.382672 0.000000 -0.923856
+vn 0.379955 0.118900 -0.917325
+vn 0.193701 -0.118900 -0.973815
+vn 0.195074 0.000000 -0.980773
+vn 0.193701 0.118900 -0.973815
+vn 0.000000 0.118900 -0.992889
+vn 0.000000 -0.192297 -0.981323
+vn -0.191443 -0.192297 -0.962462
+vn -0.191443 0.192297 -0.962462
+vn -0.375530 -0.192297 -0.906613
+vn -0.375530 0.192297 -0.906613
+vn -0.545183 -0.192297 -0.815943
+vn -0.545183 0.192297 -0.815943
+vn -0.693899 -0.192297 -0.693899
+vn -0.693899 0.192297 -0.693899
+vn -0.815943 -0.192297 -0.545183
+vn -0.815943 0.192297 -0.545183
+vn -0.906613 -0.192297 -0.375530
+vn -0.906613 0.192297 -0.375530
+vn -0.962462 -0.192297 -0.191443
+vn -0.962462 0.192297 -0.191443
+vn -0.981323 -0.192297 0.000000
+vn -0.981323 0.192297 0.000000
+vn -0.962462 -0.192297 0.191443
+vn -0.962462 0.192297 0.191443
+vn -0.906613 -0.192297 0.375530
+vn -0.906613 0.192297 0.375530
+vn -0.815943 -0.192297 0.545183
+vn -0.815943 0.192297 0.545183
+vn -0.693899 -0.192297 0.693899
+vn -0.693899 0.192297 0.693899
+vn -0.545183 -0.192297 0.815943
+vn -0.545183 0.192297 0.815943
+vn -0.375530 -0.192297 0.906613
+vn -0.375530 0.192297 0.906613
+vn -0.191443 -0.192297 0.962462
+vn -0.191443 0.192297 0.962462
+vn 0.000000 -0.192297 0.981323
+vn 0.000000 0.192297 0.981323
+vn 0.191443 -0.192297 0.962462
+vn 0.191443 0.192297 0.962462
+vn 0.375530 -0.192297 0.906613
+vn 0.375530 0.192297 0.906613
+vn 0.545183 -0.192297 0.815943
+vn 0.545183 0.192297 0.815943
+vn 0.693899 -0.192297 0.693899
+vn 0.693899 0.192297 0.693899
+vn 0.815943 -0.192297 0.545183
+vn 0.815943 0.192297 0.545183
+vn 0.906613 -0.192297 0.375530
+vn 0.906613 0.192297 0.375530
+vn 0.962462 -0.192297 0.191443
+vn 0.962462 0.192297 0.191443
+vn 0.981323 -0.192297 0.000000
+vn 0.981323 0.192297 0.000000
+vn 0.962462 -0.192297 -0.191443
+vn 0.962462 0.192297 -0.191443
+vn 0.906613 -0.192297 -0.375530
+vn 0.906613 0.192297 -0.375530
+vn 0.815943 -0.192297 -0.545183
+vn 0.815943 0.192297 -0.545183
+vn 0.693899 -0.192297 -0.693899
+vn 0.693899 0.192297 -0.693899
+vn 0.545183 -0.192297 -0.815943
+vn 0.545183 0.192297 -0.815943
+vn 0.375530 -0.192297 -0.906613
+vn 0.375530 0.192297 -0.906613
+vn 0.191443 -0.192297 -0.962462
+vn 0.191443 0.192297 -0.962462
+vn 0.000000 0.192297 -0.981323
+vn 0.000000 -0.190649 -0.981628
+vn -0.191504 -0.190649 -0.962767
+vn -0.191504 0.190649 -0.962767
+vn 0.000000 0.190649 -0.981628
+vn -0.375652 -0.190649 -0.906919
+vn -0.375652 0.190649 -0.906919
+vn -0.545366 -0.190649 -0.816187
+vn -0.545366 0.190649 -0.816187
+vn -0.694113 -0.190649 -0.694113
+vn -0.694113 0.190649 -0.694113
+vn -0.816187 -0.190649 -0.545366
+vn -0.816187 0.190649 -0.545366
+vn -0.906919 -0.190649 -0.375652
+vn -0.906919 0.190649 -0.375652
+vn -0.962767 -0.190649 -0.191504
+vn -0.962767 0.190649 -0.191504
+vn -0.981628 -0.190649 0.000000
+vn -0.981628 0.190649 0.000000
+vn -0.962767 -0.190649 0.191504
+vn -0.962767 0.190649 0.191504
+vn -0.906919 -0.190649 0.375652
+vn -0.906919 0.190649 0.375652
+vn -0.816187 -0.190649 0.545366
+vn -0.816187 0.190649 0.545366
+vn -0.694113 -0.190649 0.694113
+vn -0.694113 0.190649 0.694113
+vn -0.545366 -0.190649 0.816187
+vn -0.545366 0.190649 0.816187
+vn -0.375652 -0.190649 0.906919
+vn -0.375652 0.190649 0.906919
+vn -0.191504 -0.190649 0.962767
+vn -0.191504 0.190649 0.962767
+vn 0.000000 -0.190649 0.981628
+vn 0.000000 0.190649 0.981628
+vn 0.191504 -0.190649 0.962767
+vn 0.191504 0.190649 0.962767
+vn 0.375652 -0.190649 0.906919
+vn 0.375652 0.190649 0.906919
+vn 0.545366 -0.190649 0.816187
+vn 0.545366 0.190649 0.816187
+vn 0.694113 -0.190649 0.694113
+vn 0.694113 0.190649 0.694113
+vn 0.816187 -0.190649 0.545366
+vn 0.816187 0.190649 0.545366
+vn 0.906919 -0.190649 0.375652
+vn 0.906919 0.190649 0.375652
+vn 0.962767 -0.190649 0.191504
+vn 0.962767 0.190649 0.191504
+vn 0.981628 -0.190649 0.000000
+vn 0.981628 0.190649 0.000000
+vn 0.962767 -0.190649 -0.191504
+vn 0.962767 0.190649 -0.191504
+vn 0.906919 -0.190649 -0.375652
+vn 0.906919 0.190649 -0.375652
+vn 0.816187 -0.190649 -0.545366
+vn 0.816187 0.190649 -0.545366
+vn 0.694113 -0.190649 -0.694113
+vn 0.694113 0.190649 -0.694113
+vn 0.545366 -0.190649 -0.816187
+vn 0.545366 0.190649 -0.816187
+vn 0.375652 -0.190649 -0.906919
+vn 0.375652 0.190649 -0.906919
+vn 0.191504 -0.190649 -0.962767
+vn 0.191504 0.190649 -0.962767
+vn 0.000000 0.624348 -0.781121
+vn 0.152379 0.624348 -0.766106
+vn 0.152379 -0.624348 -0.766106
+vn 0.000000 -0.624348 -0.781121
+vn 0.298898 0.624348 -0.721671
+vn 0.298898 -0.624348 -0.721641
+vn 0.298898 -0.624348 -0.721671
+vn 0.433973 0.624348 -0.649464
+vn 0.433943 -0.624348 -0.649464
+vn 0.433973 -0.624348 -0.649464
+vn 0.433943 0.624348 -0.649464
+vn 0.552324 0.624348 -0.552324
+vn 0.552324 -0.624348 -0.552324
+vn 0.649464 0.624348 -0.433973
+vn 0.649464 -0.624348 -0.433973
+vn 0.649464 0.624348 -0.433943
+vn 0.721671 0.624348 -0.298898
+vn 0.721671 -0.624348 -0.298898
+vn 0.766106 0.624348 -0.152379
+vn 0.766106 -0.624348 -0.152379
+vn 0.781121 0.624348 0.000000
+vn 0.781121 -0.624348 0.000000
+vn 0.766106 0.624348 0.152379
+vn 0.766106 -0.624348 0.152379
+vn 0.721671 0.624348 0.298898
+vn 0.721671 -0.624348 0.298898
+vn 0.649464 0.624348 0.433973
+vn 0.649464 -0.624348 0.433973
+vn 0.552324 0.624348 0.552324
+vn 0.552324 -0.624348 0.552324
+vn 0.433973 0.624348 0.649464
+vn 0.433973 -0.624348 0.649464
+vn 0.298898 0.624348 0.721671
+vn 0.298898 -0.624348 0.721671
+vn 0.152379 0.624348 0.766106
+vn 0.152379 -0.624348 0.766106
+vn 0.000000 0.624348 0.781121
+vn 0.000000 -0.624348 0.781121
+vn -0.152379 0.624348 0.766106
+vn -0.152379 -0.624348 0.766106
+vn -0.298898 0.624348 0.721671
+vn -0.298898 -0.624348 0.721641
+vn -0.298898 -0.624348 0.721671
+vn -0.433973 0.624348 0.649464
+vn -0.433943 -0.624348 0.649464
+vn -0.552324 0.624348 0.552324
+vn -0.552324 -0.624348 0.552324
+vn -0.649464 0.624348 0.433973
+vn -0.649464 -0.624348 0.433973
+vn -0.721671 0.624348 0.298898
+vn -0.721671 -0.624348 0.298898
+vn -0.766106 0.624348 0.152379
+vn -0.766106 -0.624348 0.152379
+vn -0.781121 0.624348 0.000000
+vn -0.781121 -0.624348 0.000000
+vn -0.766106 0.624348 -0.152379
+vn -0.766106 -0.624348 -0.152379
+vn -0.721671 0.624348 -0.298898
+vn -0.721671 -0.624348 -0.298898
+vn -0.721671 -0.624348 -0.298929
+vn -0.649464 0.624348 -0.433973
+vn -0.649464 -0.624348 -0.433973
+vn -0.552324 0.624348 -0.552324
+vn -0.552324 -0.624348 -0.552324
+vn -0.433973 0.624348 -0.649464
+vn -0.433973 -0.624348 -0.649464
+vn -0.298898 0.624348 -0.721671
+vn -0.298898 -0.624348 -0.721671
+vn -0.152379 0.624348 -0.766106
+vn -0.152379 -0.624348 -0.766106
+vn 0.000000 -0.303140 -0.952910
+vn 0.185888 -0.303140 -0.934629
+vn 0.185888 0.303140 -0.934629
+vn 0.000000 0.303140 -0.952910
+vn 0.000000 -0.211005 -0.977477
+vn -0.190680 -0.211005 -0.958678
+vn -0.190680 0.211005 -0.958678
+vn 0.000000 0.211005 -0.977477
+vn 0.364666 -0.303140 -0.880398
+vn 0.364666 0.303140 -0.880398
+vn -0.374065 -0.211005 -0.903073
+vn -0.374035 0.211005 -0.903073
+vn -0.374065 0.211005 -0.903073
+vn 0.529405 -0.303140 -0.792322
+vn 0.529405 0.303140 -0.792322
+vn -0.543046 -0.211005 -0.812738
+vn -0.543046 0.211005 -0.812738
+vn 0.673818 -0.303140 -0.673818
+vn 0.673818 0.303140 -0.673818
+vn -0.691183 -0.211005 -0.691183
+vn -0.691183 0.211005 -0.691183
+vn 0.792322 -0.303140 -0.529405
+vn 0.792322 0.303140 -0.529405
+vn -0.812738 -0.211005 -0.543046
+vn -0.812738 0.211005 -0.543046
+vn 0.880398 -0.303140 -0.364666
+vn 0.880398 0.303140 -0.364666
+vn -0.903073 -0.211005 -0.374065
+vn -0.903073 0.211005 -0.374065
+vn 0.934629 -0.303140 -0.185888
+vn 0.934629 0.303140 -0.185888
+vn -0.958678 -0.211005 -0.190680
+vn -0.958678 0.211005 -0.190680
+vn 0.952940 -0.303140 0.000000
+vn 0.952940 0.303140 0.000000
+vn -0.977477 -0.211005 0.000000
+vn -0.977477 0.211005 0.000000
+vn 0.934629 -0.303140 0.185888
+vn 0.934599 0.303140 0.185888
+vn -0.958678 -0.211005 0.190680
+vn -0.958678 0.211005 0.190680
+vn 0.880398 -0.303140 0.364666
+vn 0.880398 0.303140 0.364666
+vn -0.903073 -0.211005 0.374065
+vn -0.903073 0.211005 0.374065
+vn 0.792322 -0.303140 0.529405
+vn 0.792322 0.303140 0.529405
+vn -0.812738 -0.211005 0.543046
+vn -0.812738 0.211005 0.543046
+vn 0.673818 -0.303140 0.673818
+vn 0.673818 0.303140 0.673818
+vn -0.691183 -0.211005 0.691183
+vn -0.691183 0.211005 0.691183
+vn 0.529405 -0.303140 0.792322
+vn 0.529405 0.303140 0.792322
+vn -0.543046 -0.211005 0.812738
+vn -0.543046 0.211005 0.812738
+vn 0.364666 -0.303140 0.880398
+vn 0.364666 0.303140 0.880398
+vn -0.374065 -0.211005 0.903073
+vn -0.374065 0.211005 0.903073
+vn 0.185888 -0.303140 0.934599
+vn 0.185888 0.303140 0.934599
+vn -0.190680 -0.211005 0.958678
+vn -0.190680 0.211005 0.958678
+vn 0.000000 -0.303140 0.952910
+vn 0.000000 0.303140 0.952910
+vn 0.000000 -0.211005 0.977477
+vn 0.000000 0.211005 0.977477
+vn -0.185888 -0.303140 0.934599
+vn -0.185888 0.303140 0.934599
+vn 0.190680 -0.211005 0.958678
+vn 0.190680 0.211005 0.958678
+vn -0.364666 -0.303140 0.880398
+vn -0.364666 0.303140 0.880398
+vn 0.374065 -0.211005 0.903073
+vn 0.374065 0.211005 0.903073
+vn -0.529405 -0.303140 0.792322
+vn -0.529405 0.303140 0.792322
+vn 0.543046 -0.211005 0.812738
+vn 0.543046 0.211005 0.812738
+vn -0.673818 -0.303140 0.673818
+vn -0.673818 0.303140 0.673818
+vn 0.691183 -0.211005 0.691183
+vn 0.691183 0.211005 0.691183
+vn -0.792322 -0.303140 0.529405
+vn -0.792322 0.303140 0.529405
+vn 0.812738 -0.211005 0.543046
+vn 0.812738 0.211005 0.543046
+vn -0.880398 -0.303140 0.364666
+vn -0.880398 0.303140 0.364666
+vn 0.903073 -0.211005 0.374065
+vn 0.903073 0.211005 0.374065
+vn -0.934629 -0.303140 0.185888
+vn -0.934629 0.303140 0.185888
+vn 0.958678 -0.211005 0.190680
+vn 0.958678 0.211005 0.190680
+vn -0.952910 -0.303140 0.000000
+vn -0.952910 0.303140 0.000000
+vn 0.977477 -0.211005 0.000000
+vn 0.977477 0.211005 0.000000
+vn -0.934629 -0.303140 -0.185888
+vn -0.934629 0.303140 -0.185888
+vn 0.958678 -0.211005 -0.190680
+vn 0.958678 0.211005 -0.190680
+vn -0.880398 -0.303140 -0.364666
+vn -0.880398 0.303140 -0.364666
+vn 0.903073 -0.211005 -0.374065
+vn 0.903073 0.211005 -0.374065
+vn -0.792322 -0.303140 -0.529405
+vn -0.792322 0.303140 -0.529405
+vn 0.812738 -0.211005 -0.543046
+vn 0.812738 0.211005 -0.543046
+vn -0.673818 -0.303140 -0.673818
+vn -0.673818 0.303140 -0.673818
+vn 0.691183 -0.211005 -0.691183
+vn 0.691183 0.211005 -0.691183
+vn -0.529405 -0.303140 -0.792322
+vn -0.529405 0.303140 -0.792322
+vn 0.543046 -0.211005 -0.812738
+vn 0.543046 0.211005 -0.812738
+vn -0.364666 -0.303140 -0.880398
+vn -0.364666 0.303140 -0.880398
+vn 0.374065 -0.211005 -0.903073
+vn 0.374065 0.211005 -0.903073
+vn -0.185888 -0.303140 -0.934629
+vn -0.185888 0.303140 -0.934629
+vn 0.190680 -0.211005 -0.958678
+vn 0.190680 0.211005 -0.958678
+vn 0.000000 0.482070 -0.876095
+vn 0.170904 0.482070 -0.859279
+vn 0.170904 -0.482070 -0.859279
+vn 0.000000 -0.482070 -0.876095
+vn 0.335276 0.482070 -0.809412
+vn 0.335276 -0.482070 -0.809412
+vn 0.486740 0.482070 -0.728446
+vn 0.486740 -0.482070 -0.728446
+vn 0.619495 0.482070 -0.619495
+vn 0.619495 -0.482070 -0.619495
+vn 0.728446 0.482070 -0.486740
+vn 0.728446 -0.482070 -0.486740
+vn 0.809412 0.482070 -0.335276
+vn 0.809412 -0.482070 -0.335276
+vn 0.859279 0.482070 -0.170904
+vn 0.859279 -0.482070 -0.170904
+vn 0.876095 0.482070 0.000000
+vn 0.876095 -0.482070 0.000000
+vn 0.859279 0.482070 0.170904
+vn 0.859279 -0.482070 0.170904
+vn 0.809412 0.482070 0.335276
+vn 0.809412 -0.482070 0.335246
+vn 0.728446 0.482070 0.486740
+vn 0.728446 -0.482070 0.486740
+vn 0.809412 -0.482070 0.335276
+vn 0.619495 0.482070 0.619495
+vn 0.619495 -0.482070 0.619495
+vn 0.486740 0.482070 0.728446
+vn 0.486740 -0.482070 0.728446
+vn 0.335276 0.482070 0.809412
+vn 0.335276 -0.482070 0.809412
+vn 0.170904 0.482070 0.859279
+vn 0.170904 -0.482070 0.859279
+vn 0.000000 0.482070 0.876125
+vn 0.000000 -0.482070 0.876125
+vn -0.170904 0.482070 0.859279
+vn -0.170904 -0.482070 0.859279
+vn -0.335276 0.482070 0.809412
+vn -0.335276 -0.482070 0.809412
+vn -0.486740 0.482070 0.728446
+vn -0.486740 -0.482070 0.728446
+vn -0.619495 0.482070 0.619495
+vn -0.619495 -0.482070 0.619495
+vn -0.728446 0.482070 0.486740
+vn -0.728446 -0.482070 0.486740
+vn -0.809412 0.482070 0.335276
+vn -0.809412 -0.482070 0.335246
+vn -0.859279 0.482070 0.170904
+vn -0.859279 -0.482070 0.170904
+vn -0.809412 -0.482070 0.335276
+vn -0.876095 0.482070 0.000000
+vn -0.876095 -0.482070 0.000000
+vn -0.859279 0.482070 -0.170904
+vn -0.859279 -0.482070 -0.170904
+vn -0.809412 0.482070 -0.335276
+vn -0.809412 -0.482070 -0.335276
+vn -0.728446 0.482070 -0.486740
+vn -0.728446 -0.482070 -0.486740
+vn -0.619495 0.482070 -0.619495
+vn -0.619495 -0.482070 -0.619495
+vn -0.486740 0.482070 -0.728446
+vn -0.486740 -0.482070 -0.728446
+vn -0.335246 0.482070 -0.809412
+vn -0.335246 -0.482070 -0.809412
+vn -0.170904 0.482070 -0.859279
+vn -0.170904 -0.482070 -0.859279
+vn 0.000000 -0.210883 -0.977508
+vn 0.190680 -0.210883 -0.958708
+vn 0.190680 0.210883 -0.958708
+vn 0.000000 0.210883 -0.977508
+vn -0.190130 -0.223518 -0.955962
+vn 0.000000 -0.223518 -0.974670
+vn 0.000000 0.223518 -0.974670
+vn -0.190130 0.223518 -0.955962
+vn 0.374065 -0.210883 -0.903073
+vn 0.374065 0.210883 -0.903073
+vn -0.372997 -0.223518 -0.900479
+vn -0.372997 0.223518 -0.900479
+vn 0.543046 -0.210883 -0.812769
+vn 0.543046 0.210883 -0.812738
+vn 0.543046 0.210883 -0.812769
+vn -0.541490 -0.223518 -0.810419
+vn -0.541490 0.223518 -0.810419
+vn 0.543046 -0.210883 -0.812738
+vn 0.691183 -0.210883 -0.691183
+vn 0.691183 0.210883 -0.691183
+vn -0.689200 -0.223518 -0.689200
+vn -0.689200 0.223518 -0.689200
+vn 0.812769 -0.210852 -0.543077
+vn 0.812769 0.210852 -0.543077
+vn -0.810419 -0.223518 -0.541490
+vn -0.810419 0.223518 -0.541490
+vn 0.903073 -0.210883 -0.374065
+vn 0.903073 0.210883 -0.374065
+vn -0.900479 -0.223518 -0.372967
+vn -0.900479 0.223518 -0.372997
+vn -0.900479 0.223518 -0.372967
+vn 0.958708 -0.210883 -0.190680
+vn 0.958708 0.210883 -0.190680
+vn -0.955962 -0.223518 -0.190130
+vn -0.900479 -0.223518 -0.372997
+vn -0.955962 0.223518 -0.190130
+vn 0.977508 -0.210883 0.000000
+vn 0.977508 0.210883 0.000000
+vn -0.974670 -0.223518 0.000000
+vn -0.974670 0.223518 0.000000
+vn -0.974670 0.223487 0.000000
+vn 0.958708 -0.210883 0.190680
+vn 0.958708 0.210883 0.190680
+vn -0.955962 -0.223518 0.190130
+vn -0.955962 0.223518 0.190130
+vn 0.903073 -0.210883 0.374065
+vn 0.903073 0.210883 0.374065
+vn -0.900479 -0.223518 0.372997
+vn -0.900479 0.223518 0.372997
+vn 0.812769 -0.210883 0.543046
+vn 0.812769 0.210883 0.543046
+vn -0.810419 -0.223518 0.541490
+vn -0.810419 0.223518 0.541490
+vn 0.691183 -0.210883 0.691183
+vn 0.691183 0.210883 0.691183
+vn -0.689200 -0.223518 0.689200
+vn -0.689200 0.223518 0.689200
+vn 0.543046 -0.210883 0.812769
+vn 0.543046 0.210883 0.812769
+vn -0.541490 -0.223518 0.810419
+vn -0.541490 0.223518 0.810419
+vn 0.374065 -0.210883 0.903073
+vn 0.374065 0.210883 0.903073
+vn -0.372997 -0.223518 0.900479
+vn -0.372997 0.223518 0.900479
+vn 0.190680 -0.210883 0.958708
+vn 0.190680 0.210883 0.958708
+vn -0.190130 -0.223518 0.955962
+vn -0.190130 0.223518 0.955962
+vn 0.000000 -0.210852 0.977508
+vn 0.000000 0.210852 0.977508
+vn 0.000000 -0.223518 0.974670
+vn 0.000000 0.223487 0.974700
+vn 0.000000 0.223518 0.974670
+vn -0.190680 -0.210883 0.958708
+vn -0.190680 0.210883 0.958708
+vn 0.190130 -0.223518 0.955962
+vn 0.190130 0.223518 0.955962
+vn -0.374065 -0.210852 0.903104
+vn -0.374065 0.210852 0.903104
+vn 0.372997 -0.223518 0.900479
+vn 0.372997 0.223487 0.900479
+vn 0.372997 0.223518 0.900479
+vn -0.543046 -0.210883 0.812769
+vn -0.543046 0.210883 0.812769
+vn 0.541490 -0.223518 0.810419
+vn 0.541490 0.223518 0.810419
+vn -0.691183 -0.210883 0.691183
+vn -0.691183 0.210852 0.691183
+vn 0.689200 -0.223518 0.689200
+vn 0.689200 0.223518 0.689200
+vn -0.812769 -0.210883 0.543046
+vn -0.812769 0.210883 0.543046
+vn 0.810419 -0.223518 0.541490
+vn 0.810419 0.223518 0.541490
+vn -0.903073 -0.210883 0.374065
+vn -0.903073 0.210883 0.374065
+vn 0.900479 -0.223518 0.372997
+vn 0.900479 0.223518 0.372997
+vn -0.958708 -0.210883 0.190680
+vn -0.958708 0.210883 0.190680
+vn 0.955962 -0.223518 0.190130
+vn 0.955962 0.223518 0.190130
+vn -0.977508 -0.210883 0.000000
+vn -0.977508 0.210883 0.000000
+vn 0.974670 -0.223518 0.000000
+vn 0.974670 0.223518 0.000000
+vn -0.958708 -0.210883 -0.190680
+vn -0.958708 0.210883 -0.190680
+vn 0.955962 -0.223518 -0.190130
+vn 0.955962 0.223518 -0.190130
+vn -0.903073 -0.210883 -0.374065
+vn -0.903073 0.210883 -0.374065
+vn 0.900479 -0.223518 -0.372997
+vn 0.900479 0.223518 -0.372997
+vn -0.812738 -0.210883 -0.543046
+vn -0.812738 0.210883 -0.543046
+vn 0.810419 -0.223518 -0.541490
+vn 0.810419 0.223518 -0.541490
+vn -0.691183 -0.210883 -0.691183
+vn -0.691183 0.210883 -0.691183
+vn 0.689200 -0.223518 -0.689200
+vn 0.689200 0.223518 -0.689200
+vn -0.543046 -0.210883 -0.812769
+vn -0.543046 0.210883 -0.812769
+vn 0.541490 -0.223518 -0.810419
+vn 0.541490 0.223518 -0.810419
+vn -0.374065 -0.210883 -0.903073
+vn -0.374065 0.210883 -0.903073
+vn 0.372997 -0.223518 -0.900479
+vn 0.372997 0.223518 -0.900479
+vn -0.190680 -0.210883 -0.958708
+vn -0.190680 0.210883 -0.958708
+vn 0.190130 -0.223518 -0.955962
+vn 0.190130 0.223518 -0.955962
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.999969 0.001099
+vn 0.000214 0.999969 0.001068
+vn 0.000397 0.999969 0.001007
+vn 0.000610 0.999969 0.000885
+vn 0.000763 0.999969 0.000763
+vn 0.000885 0.999969 0.000610
+vn 0.001007 0.999969 0.000397
+vn 0.001068 0.999969 0.000214
+vn 0.001099 0.999969 0.000000
+vn 0.001068 0.999969 -0.000214
+vn 0.001007 0.999969 -0.000397
+vn 0.000885 0.999969 -0.000610
+vn 0.000763 0.999969 -0.000763
+vn 0.000610 0.999969 -0.000885
+vn 0.000397 0.999969 -0.001007
+vn 0.000214 0.999969 -0.001068
+vn 0.000000 0.999969 -0.001099
+vn -0.000214 0.999969 -0.001068
+vn -0.000397 0.999969 -0.001007
+vn -0.000610 0.999969 -0.000885
+vn -0.000763 0.999969 -0.000763
+vn -0.000885 0.999969 -0.000610
+vn -0.001007 0.999969 -0.000397
+vn -0.001068 0.999969 -0.000214
+vn -0.001099 0.999969 0.000000
+vn -0.001068 0.999969 0.000214
+vn -0.001007 0.999969 0.000397
+vn -0.000885 0.999969 0.000610
+vn -0.000763 0.999969 0.000763
+vn -0.000610 0.999969 0.000885
+vn -0.000397 0.999969 0.001007
+vn -0.000214 0.999969 0.001068
+vn -0.990387 -0.138310 0.000000
+vn -0.550218 -0.138279 0.823450
+vn 0.000000 -0.223487 0.974700
+s 1
+f 1/1/1 32/2/2 33/3/3
+f 2/4/4 1/1/1 33/3/3
+f 3/5/5 2/4/4 33/3/3
+f 4/6/6 3/5/5 33/3/3
+f 5/7/7 4/6/6 33/3/3
+f 6/8/8 5/7/7 33/3/3
+f 7/9/9 6/10/8 33/3/3
+f 8/11/10 7/9/9 33/3/3
+f 9/12/11 8/11/10 33/3/3
+f 10/13/12 9/12/11 33/3/3
+f 11/14/13 10/13/12 33/3/3
+f 12/15/14 11/14/13 33/3/3
+f 13/16/15 12/15/14 33/3/3
+f 14/17/16 13/16/15 33/3/3
+f 15/18/17 14/17/16 33/3/3
+f 16/19/18 15/18/17 33/3/3
+f 17/20/19 16/19/18 33/3/3
+f 18/21/20 17/20/19 33/3/3
+f 19/22/21 18/21/20 33/3/3
+f 20/23/22 19/22/21 33/3/3
+f 21/24/23 20/23/22 33/3/3
+f 22/25/24 21/24/23 33/3/3
+f 23/26/25 22/25/24 33/3/3
+f 24/27/26 23/26/25 33/3/3
+f 25/28/27 24/27/26 33/3/3
+f 26/29/28 25/28/27 33/3/3
+f 27/30/29 26/29/28 33/3/3
+f 28/31/30 27/30/29 33/3/3
+f 29/32/31 28/31/30 33/3/3
+f 30/33/32 29/32/31 33/3/3
+f 31/34/33 30/33/32 33/3/3
+f 33/3/3 32/2/2 31/34/33
+f 1381/35/34 1442/36/35 1446/37/34
+f 1505/38/36 1441/39/36 1443/40/37
+f 1442/36/35 1440/41/38 1506/42/35
+f 1503/43/39 1439/44/39 1505/38/36
+f 1440/41/38 1438/45/40 1504/46/38
+f 1501/47/41 1437/48/41 1503/43/39
+f 1438/45/40 1436/49/42 1502/50/40
+f 1499/51/43 1435/52/43 1501/47/41
+f 1436/49/42 1434/53/44 1500/54/42
+f 1497/55/45 1433/56/45 1499/51/43
+f 1434/53/44 1432/57/46 1498/58/44
+f 1495/59/47 1431/60/47 1497/55/45
+f 1432/61/46 1430/62/48 1496/63/46
+f 1493/64/49 1429/65/49 1495/66/47
+f 1430/62/48 1428/67/50 1494/68/48
+f 1491/69/51 1427/70/51 1429/65/49
+f 1428/67/50 1426/71/52 1492/72/50
+f 1489/73/53 1425/74/53 1491/69/51
+f 1426/71/52 1424/75/54 1490/76/52
+f 1487/77/55 1423/78/55 1489/73/53
+f 1424/75/54 1422/79/56 1488/80/54
+f 1485/81/57 1421/82/57 1487/77/55
+f 1422/79/56 1420/83/58 1486/84/56
+f 1483/85/59 1419/86/59 1485/81/57
+f 1420/83/58 1418/87/60 1482/88/60
+f 1481/89/61 1417/90/61 1419/86/59
+f 1418/87/60 1416/91/62 1482/88/60
+f 1479/92/63 1415/93/63 1481/89/61
+f 1416/91/62 1414/94/64 1480/95/62
+f 1477/96/65 1413/97/65 1479/92/63
+f 1414/94/64 1412/98/66 1478/99/64
+f 1475/100/67 1411/101/67 1477/96/65
+f 1412/98/66 1410/102/68 1474/103/68
+f 1473/104/69 1409/105/69 1411/101/67
+f 1410/102/68 1408/106/70 1472/107/70
+f 1471/108/71 1407/109/71 1409/105/69
+f 1408/106/70 1406/110/72 1470/111/72
+f 1469/112/73 1405/113/73 1407/109/71
+f 1406/110/72 1404/114/74 1468/115/74
+f 1467/116/75 1403/117/75 1405/113/73
+f 1404/114/74 1402/118/76 1466/119/76
+f 1465/120/77 1401/121/77 1403/117/75
+f 1402/118/76 1400/122/78 1464/123/78
+f 1463/124/79 1399/125/79 1401/121/77
+f 1400/122/78 1398/126/80 1462/127/80
+f 1461/128/81 1397/129/81 1399/125/79
+f 1398/126/80 1396/130/82 1460/131/82
+f 1459/132/83 1395/133/83 1397/129/81
+f 1396/130/82 1394/134/84 1460/131/82
+f 1457/135/85 1393/136/85 1395/133/83
+f 1394/134/84 1392/137/86 1456/138/86
+f 1455/139/87 1391/140/87 1393/136/85
+f 1392/137/86 1390/141/88 1454/142/88
+f 1453/143/89 1389/144/89 1391/140/87
+f 1390/141/88 1388/145/90 1452/146/90
+f 1451/147/91 1387/148/91 1389/144/89
+f 1388/145/90 1386/149/92 1450/150/92
+f 1449/151/93 1385/152/93 1387/148/91
+f 1386/149/92 1384/153/94 1448/154/94
+f 1447/155/95 1383/156/95 1385/152/93
+f 1384/153/94 1382/157/96 1445/158/96
+f 1444/159/97 1380/160/97 1447/155/95
+f 1382/157/96 1381/35/34 1446/37/34
+f 1443/40/37 1379/161/37 1380/160/97
+f 98/162/98 35/163/98 99/164/99
+f 37/165/100 36/166/101 101/167/100
+f 99/164/99 34/168/99 102/169/102
+f 39/170/103 37/165/100 103/171/103
+f 102/169/102 38/172/104 104/173/105
+f 41/174/106 39/170/103 105/175/106
+f 104/173/105 40/176/105 106/177/107
+f 43/178/108 41/174/106 107/179/108
+f 106/177/107 42/180/107 108/181/109
+f 45/182/110 43/178/108 109/183/110
+f 108/181/109 44/184/109 110/185/111
+f 47/186/112 45/182/110 111/187/112
+f 110/185/111 46/188/111 112/189/113
+f 49/190/114 47/186/112 113/191/114
+f 112/189/113 48/192/113 114/193/115
+f 51/194/116 49/190/114 115/195/116
+f 114/193/115 50/196/115 116/197/117
+f 53/198/118 51/194/116 117/199/118
+f 116/197/117 52/200/117 118/201/119
+f 55/202/120 53/198/118 119/203/120
+f 118/201/119 54/204/119 120/205/121
+f 57/206/122 55/202/120 121/207/122
+f 120/205/121 56/208/121 122/209/123
+f 59/210/124 57/206/122 123/211/124
+f 122/209/123 58/212/123 124/213/125
+f 61/214/126 59/210/124 125/215/126
+f 124/213/125 60/216/125 126/217/127
+f 63/218/128 61/214/126 127/219/128
+f 126/217/127 62/220/127 64/221/129
+f 65/222/130 63/218/128 127/219/128
+f 128/223/129 64/221/129 66/224/131
+f 67/225/132 65/222/130 129/226/130
+f 130/227/131 66/224/131 132/228/133
+f 69/229/134 67/225/132 133/230/134
+f 132/228/133 68/231/133 134/232/135
+f 71/233/136 69/229/134 135/234/136
+f 134/232/135 70/235/137 136/236/138
+f 73/237/139 71/233/136 137/238/139
+f 136/236/138 72/239/138 138/240/140
+f 75/241/141 73/237/139 139/242/141
+f 138/240/140 74/243/140 140/244/142
+f 77/245/143 75/241/141 141/246/143
+f 140/244/142 76/247/142 142/248/144
+f 79/249/145 77/245/143 143/250/145
+f 142/248/144 78/251/144 144/252/146
+f 81/253/147 79/249/145 145/254/147
+f 144/252/146 80/255/146 146/256/148
+f 83/257/149 81/253/147 147/258/149
+f 146/256/148 82/259/148 148/260/150
+f 85/261/151 83/257/149 149/262/151
+f 148/260/150 84/263/150 150/264/152
+f 87/265/153 85/261/151 151/266/153
+f 150/267/152 86/268/152 152/269/154
+f 89/270/155 87/271/153 153/272/155
+f 152/269/154 88/273/154 154/274/156
+f 91/275/157 89/270/155 155/276/157
+f 154/274/156 90/277/156 156/278/158
+f 93/279/159 91/275/157 157/280/159
+f 156/278/158 92/281/158 158/282/160
+f 95/283/161 93/279/159 159/284/162
+f 158/282/160 94/285/163 160/286/164
+f 97/287/165 95/283/161 161/288/166
+f 160/286/164 96/289/167 98/162/98
+f 36/166/101 97/287/165 100/290/101
+f 1253/291/168 1314/292/169 1318/293/168
+f 1377/294/170 1313/295/170 1315/296/171
+f 1314/292/169 1312/297/172 1378/298/169
+f 1375/299/173 1311/300/173 1377/294/170
+f 1312/297/172 1310/301/174 1376/302/175
+f 1373/303/176 1309/304/176 1375/299/173
+f 1310/301/174 1308/305/177 1374/306/174
+f 1371/307/178 1307/308/178 1373/303/176
+f 1308/305/177 1306/309/179 1372/310/177
+f 1369/311/180 1305/312/181 1371/307/178
+f 1306/309/179 1304/313/182 1368/314/182
+f 1367/315/183 1303/316/183 1369/311/180
+f 1304/317/182 1302/318/184 1368/319/182
+f 1365/320/185 1301/321/185 1303/322/183
+f 1302/318/184 1300/323/186 1366/324/184
+f 1363/325/187 1299/326/188 1365/320/185
+f 1300/323/186 1298/327/189 1362/328/189
+f 1361/329/190 1297/330/191 1299/326/188
+f 1298/327/189 1296/331/192 1362/328/189
+f 1359/332/193 1295/333/193 1361/329/190
+f 1296/331/192 1294/334/194 1360/335/192
+f 1357/336/195 1293/337/195 1295/333/193
+f 1294/334/194 1292/338/196 1358/339/194
+f 1355/340/197 1291/341/197 1357/336/195
+f 1292/338/196 1290/342/198 1356/343/196
+f 1353/344/199 1289/345/199 1355/340/197
+f 1290/342/198 1288/346/200 1352/347/200
+f 1351/348/201 1287/349/201 1289/345/199
+f 1288/346/200 1286/350/202 1352/347/200
+f 1349/351/203 1285/352/204 1351/348/201
+f 1286/350/202 1284/353/205 1348/354/205
+f 1347/355/206 1283/356/206 1285/352/204
+f 1284/353/205 1282/357/207 1346/358/207
+f 1345/359/208 1281/360/209 1283/356/206
+f 1282/357/207 1280/361/210 1344/362/210
+f 1343/363/211 1279/364/211 1281/360/209
+f 1280/361/210 1278/365/212 1344/362/210
+f 1341/366/213 1277/367/213 1343/363/211
+f 1278/365/212 1276/368/214 1340/369/214
+f 1339/370/215 1275/371/215 1277/367/213
+f 1276/368/214 1274/372/216 1340/369/214
+f 1337/373/217 1273/374/217 1339/370/215
+f 1274/372/216 1272/375/218 1338/376/216
+f 1335/377/219 1271/378/219 1337/373/217
+f 1272/375/218 1270/379/220 1336/380/221
+f 1333/381/222 1269/382/222 1335/377/219
+f 1270/379/220 1268/383/223 1332/384/223
+f 1331/385/224 1267/386/224 1269/382/222
+f 1268/383/223 1266/387/225 1330/388/225
+f 1329/389/226 1265/390/226 1267/386/224
+f 1266/387/225 1264/391/227 1330/388/225
+f 1327/392/228 1263/393/228 1265/390/226
+f 1264/391/227 1262/394/229 1328/395/227
+f 1325/396/230 1261/397/231 1327/392/228
+f 1262/394/229 1260/398/232 1326/399/233
+f 1323/400/234 1259/401/234 1325/396/230
+f 1260/398/232 1258/402/235 1322/403/235
+f 1321/404/236 1257/405/236 1259/401/234
+f 1258/402/235 1256/406/237 1320/407/237
+f 1319/408/238 1255/409/238 1257/405/236
+f 1256/406/237 1254/410/239 1317/411/239
+f 1316/412/240 1252/413/240 1255/409/238
+f 1254/410/239 1253/291/168 1317/411/239
+f 1315/296/171 1251/414/241 1316/412/240
+f 1097/415/242 1218/416/243 1219/417/244
+f 1250/418/245 1216/419/246 1219/417/244
+f 1218/416/243 1214/420/247 1250/418/245
+f 1249/421/248 1212/422/249 1250/418/245
+f 1214/420/247 1210/423/250 1249/421/248
+f 1248/424/251 1208/425/252 1249/421/248
+f 1210/423/250 1206/426/253 1248/424/251
+f 1247/427/254 1204/428/255 1248/424/251
+f 1206/426/253 1202/429/256 1247/427/254
+f 1246/430/257 1200/431/258 1247/427/254
+f 1202/429/256 1198/432/259 1246/430/257
+f 1245/433/260 1196/434/261 1246/430/257
+f 1198/435/259 1194/436/262 1245/437/260
+f 1244/438/263 1192/439/264 1245/437/260
+f 1194/436/262 1190/440/265 1244/438/263
+f 1243/441/266 1188/442/267 1244/438/263
+f 1190/440/265 1186/443/268 1243/441/266
+f 1242/444/269 1184/445/270 1243/441/266
+f 1186/443/268 1182/446/271 1241/447/272
+f 1241/447/272 1180/448/273 1242/444/269
+f 1182/446/271 1178/449/274 1241/447/272
+f 1240/450/275 1176/451/276 1241/447/272
+f 1178/449/274 1174/452/277 1240/450/275
+f 1239/453/278 1172/454/279 1240/450/275
+f 1174/452/277 1170/455/280 1239/453/278
+f 1238/456/281 1168/457/282 1239/453/278
+f 1170/455/280 1166/458/283 1238/456/281
+f 1237/459/284 1164/460/285 1238/456/281
+f 1166/458/283 1162/461/286 1237/459/284
+f 1236/462/287 1160/463/288 1237/459/284
+f 1162/461/286 1158/464/289 1236/462/287
+f 1235/465/290 1156/466/291 1236/462/287
+f 1158/464/289 1154/467/292 1234/468/293
+f 1234/468/293 1152/469/294 1156/466/291
+f 1154/467/292 1150/470/295 1233/471/296
+f 1233/471/296 1148/472/297 1152/469/294
+f 1150/470/295 1146/473/298 1232/474/299
+f 1232/474/299 1144/475/300 1148/472/297
+f 1146/473/298 1142/476/301 1231/477/302
+f 1231/477/302 1140/478/303 1144/475/300
+f 1142/476/301 1138/479/304 1230/480/305
+f 1230/480/305 1136/481/306 1140/478/303
+f 1138/479/304 1134/482/307 1229/483/308
+f 1229/483/308 1132/484/309 1136/481/306
+f 1134/482/307 1130/485/310 1228/486/311
+f 1228/486/311 1128/487/312 1132/484/309
+f 1130/485/310 1126/488/313 1227/489/314
+f 1227/489/314 1124/490/315 1128/487/312
+f 1126/488/313 1122/491/316 1226/492/317
+f 1226/492/317 1120/493/318 1124/490/315
+f 1122/491/316 1118/494/319 1225/495/320
+f 1225/495/320 1116/496/321 1120/493/318
+f 1118/494/319 1114/497/322 1224/498/323
+f 1224/498/323 1112/499/324 1116/496/321
+f 1114/497/322 1110/500/325 1223/501/326
+f 1223/501/326 1108/502/327 1112/499/324
+f 1110/500/325 1106/503/328 1222/504/329
+f 1222/504/329 1104/505/330 1108/502/327
+f 1106/503/328 1102/506/331 1221/507/332
+f 1221/507/332 1100/508/333 1104/505/330
+f 1102/506/331 1098/509/334 1220/510/335
+f 1220/510/335 1094/511/336 1100/508/333
+f 1098/509/334 1097/415/242 1219/417/244
+f 1219/417/244 1091/512/337 1094/511/336
+f 1096/513/338 1217/514/339 1097/415/242
+f 1216/419/246 1215/515/340 1091/512/337
+f 1217/514/339 1213/516/341 1218/416/243
+f 1212/422/249 1211/517/342 1216/419/246
+f 1213/516/341 1209/518/343 1214/420/247
+f 1208/425/252 1207/519/344 1212/422/249
+f 1209/518/343 1205/520/345 1210/423/250
+f 1204/428/255 1203/521/346 1208/425/252
+f 1205/520/345 1201/522/347 1206/426/253
+f 1200/431/258 1199/523/348 1204/428/255
+f 1201/522/347 1197/524/349 1202/429/256
+f 1196/434/261 1195/525/350 1200/431/258
+f 1197/526/349 1193/527/351 1198/435/259
+f 1192/439/264 1191/528/352 1196/529/261
+f 1193/527/351 1189/530/353 1194/436/262
+f 1188/442/267 1187/531/354 1191/528/352
+f 1189/530/353 1185/532/355 1190/440/265
+f 1184/445/270 1183/533/356 1188/442/267
+f 1185/532/355 1181/534/357 1186/443/268
+f 1180/448/273 1179/535/358 1184/445/270
+f 1181/534/357 1177/536/359 1178/449/274
+f 1176/451/276 1175/537/360 1179/535/358
+f 1177/536/359 1173/538/361 1174/452/277
+f 1172/454/279 1171/539/362 1175/537/360
+f 1173/538/361 1169/540/363 1170/455/280
+f 1168/457/282 1167/541/364 1171/539/362
+f 1169/540/363 1165/542/365 1170/455/280
+f 1164/460/285 1163/543/366 1168/457/282
+f 1165/542/365 1161/544/367 1166/458/283
+f 1160/463/288 1159/545/368 1164/460/285
+f 1161/544/367 1157/546/369 1162/461/286
+f 1156/466/291 1155/547/370 1160/463/288
+f 1157/546/369 1153/548/371 1154/467/292
+f 1152/469/294 1151/549/372 1155/547/370
+f 1153/548/371 1149/550/373 1150/470/295
+f 1148/472/297 1147/551/374 1151/549/372
+f 1149/550/373 1145/552/375 1146/473/298
+f 1144/475/300 1143/553/376 1148/472/297
+f 1145/552/375 1141/554/377 1146/473/298
+f 1140/478/303 1139/555/378 1144/475/300
+f 1141/554/377 1137/556/379 1138/479/304
+f 1136/481/306 1135/557/380 1139/555/378
+f 1137/556/379 1133/558/381 1134/482/307
+f 1132/484/309 1131/559/382 1135/557/380
+f 1133/558/381 1129/560/383 1130/485/310
+f 1128/487/312 1127/561/384 1131/559/382
+f 1129/560/383 1125/562/385 1126/488/313
+f 1124/490/315 1123/563/386 1127/561/384
+f 1125/562/385 1121/564/387 1122/491/316
+f 1120/493/318 1119/565/388 1123/563/386
+f 1121/564/387 1117/566/389 1118/494/319
+f 1116/496/321 1115/567/390 1119/565/388
+f 1117/566/389 1113/568/391 1118/494/319
+f 1112/499/324 1111/569/392 1116/496/321
+f 1113/568/391 1109/570/393 1110/500/325
+f 1108/502/327 1107/571/394 1112/499/324
+f 1109/570/393 1105/572/395 1106/503/328
+f 1104/505/330 1103/573/396 1107/571/394
+f 1105/572/395 1101/574/397 1102/506/331
+f 1100/508/333 1099/575/398 1103/573/396
+f 1101/574/397 1095/576/399 1098/509/334
+f 1094/511/336 1093/577/400 1099/575/398
+f 1095/576/399 1096/513/338 1097/415/242
+f 1091/512/337 1092/578/401 1093/577/400
+f 968/579/402 1089/580/403 969/581/402
+f 1088/582/404 1087/583/404 963/584/405
+f 1089/580/403 1085/585/406 1090/586/403
+f 1084/587/407 1083/588/407 1088/582/404
+f 1085/585/406 1081/589/408 1086/590/406
+f 1080/591/409 1079/592/409 1084/587/407
+f 1081/589/408 1077/593/410 1082/594/408
+f 1076/595/411 1075/596/411 1080/591/409
+f 1077/593/410 1073/597/412 1078/598/410
+f 1072/599/413 1071/600/413 1076/595/411
+f 1073/597/412 1069/601/414 1074/602/412
+f 1068/603/415 1067/604/415 1072/599/413
+f 1069/605/414 1065/606/416 1070/607/414
+f 1064/608/417 1063/609/417 1068/610/415
+f 1065/606/416 1061/611/418 1066/612/416
+f 1060/613/419 1059/614/419 1064/608/417
+f 1061/611/418 1057/615/420 1062/616/418
+f 1056/617/421 1055/618/421 1060/613/419
+f 1057/615/420 1053/619/422 1058/620/420
+f 1052/621/423 1051/622/423 1056/617/421
+f 1053/619/422 1049/623/424 1054/624/422
+f 1048/625/425 1047/626/425 1052/621/423
+f 1049/623/424 1045/627/426 1046/628/426
+f 1044/629/427 1043/630/427 1048/625/425
+f 1045/627/426 1041/631/428 1046/628/426
+f 1040/632/429 1039/633/429 1044/629/427
+f 1041/631/428 1037/634/430 1042/635/428
+f 1036/636/431 1035/637/431 1040/632/429
+f 1037/634/430 1033/638/432 1038/639/430
+f 1032/640/433 1031/641/433 1036/636/431
+f 1033/638/432 1029/642/434 1034/643/432
+f 1028/644/435 1027/645/435 1032/640/433
+f 1029/642/434 1025/646/436 1026/647/436
+f 1024/648/437 1023/649/437 1027/645/435
+f 1025/646/436 1021/650/438 1022/651/438
+f 1020/652/439 1019/653/439 1023/649/437
+f 1021/650/438 1017/654/440 1018/655/440
+f 1016/656/441 1015/657/441 1020/652/439
+f 1017/654/440 1013/658/442 1018/655/440
+f 1012/659/443 1011/660/443 1015/657/441
+f 1013/658/442 1009/661/444 1010/662/444
+f 1008/663/445 1007/664/445 1011/660/443
+f 1009/661/444 1005/665/446 1006/666/446
+f 1004/667/447 1003/668/447 1007/664/445
+f 1005/665/446 1001/669/448 1006/666/446
+f 1000/670/449 999/671/449 1004/667/447
+f 1001/669/448 997/672/450 1002/673/448
+f 996/674/451 995/675/451 1000/670/449
+f 997/672/450 993/676/452 998/677/450
+f 992/678/453 991/679/453 995/675/451
+f 993/676/452 989/680/454 990/681/454
+f 988/682/455 987/683/455 991/679/453
+f 989/680/454 985/684/456 986/685/456
+f 984/686/457 983/687/457 987/683/455
+f 985/684/456 981/688/458 982/689/458
+f 980/690/459 979/691/459 984/686/457
+f 981/688/458 977/692/460 978/693/460
+f 976/694/461 975/695/461 979/691/459
+f 977/692/460 973/696/462 974/697/462
+f 972/698/463 971/699/463 975/695/461
+f 973/696/462 967/700/464 974/697/462
+f 966/701/465 965/702/465 972/698/463
+f 967/700/464 968/579/402 969/581/402
+f 963/584/405 964/703/405 966/701/465
+f 514/414/466 162/704/466 515/413/467
+f 165/705/468 164/706/469 517/410/468
+f 515/413/467 163/707/467 518/409/470
+f 167/708/471 165/705/468 519/406/472
+f 518/409/470 166/709/470 520/405/473
+f 169/710/474 167/708/471 521/402/475
+f 520/405/473 168/711/476 170/712/477
+f 171/713/478 169/710/474 521/402/475
+f 522/401/477 170/712/477 524/397/479
+f 173/714/480 171/713/478 525/394/480
+f 524/397/479 172/715/481 526/393/482
+f 175/716/483 173/714/480 527/391/483
+f 526/393/482 174/717/482 176/718/484
+f 177/719/485 175/716/483 529/387/485
+f 528/390/484 176/718/484 178/720/486
+f 179/721/487 177/719/485 529/387/485
+f 530/386/486 178/720/486 180/722/488
+f 181/723/489 179/721/487 531/383/487
+f 532/382/488 180/722/488 182/724/490
+f 183/725/491 181/723/489 533/379/489
+f 534/378/490 182/724/490 184/726/492
+f 185/727/493 183/725/491 535/375/491
+f 536/374/492 184/726/492 186/728/494
+f 187/729/495 185/727/493 537/372/493
+f 538/371/494 186/728/494 188/730/496
+f 189/731/497 187/729/495 539/368/495
+f 540/367/496 188/730/496 190/732/498
+f 191/733/499 189/731/497 541/365/497
+f 542/364/498 190/732/498 192/734/500
+f 193/735/501 191/733/499 543/361/499
+f 544/360/500 192/734/500 194/736/502
+f 195/737/503 193/735/501 545/357/501
+f 546/356/502 194/736/502 548/352/504
+f 197/738/505 195/737/503 549/350/505
+f 548/352/504 196/739/504 198/740/506
+f 199/741/507 197/738/505 551/346/508
+f 550/349/506 198/740/506 200/742/509
+f 201/743/510 199/741/507 551/346/508
+f 552/345/509 200/742/509 554/341/511
+f 203/744/512 201/743/510 555/338/512
+f 554/341/511 202/745/511 556/337/513
+f 205/746/514 203/744/512 557/334/514
+f 556/337/513 204/747/513 558/333/515
+f 207/748/516 205/746/514 559/331/516
+f 558/333/515 206/749/515 560/330/517
+f 209/750/518 207/748/516 561/327/518
+f 560/330/517 208/751/517 562/326/519
+f 211/752/520 209/750/518 563/323/520
+f 562/326/519 210/753/519 564/321/521
+f 213/754/522 211/752/520 565/318/522
+f 564/321/521 212/755/521 566/322/523
+f 215/756/524 213/754/522 567/317/525
+f 566/316/523 214/757/523 568/312/526
+f 217/758/527 215/759/524 569/309/527
+f 568/312/526 216/760/526 570/308/528
+f 219/761/529 217/758/527 571/305/529
+f 570/308/528 218/762/528 572/304/530
+f 221/763/531 219/761/529 573/301/531
+f 572/304/530 220/764/530 574/300/532
+f 223/765/533 221/763/531 575/297/533
+f 574/300/532 222/766/532 576/295/534
+f 225/767/535 223/765/533 577/292/535
+f 576/295/534 224/768/534 514/414/466
+f 164/706/469 225/767/535 516/291/469
+f 227/703/536 578/296/536 228/702/537
+f 580/411/538 581/293/539 231/579/539
+f 837/769/540 898/770/541 901/706/540
+f 961/768/542 897/771/542 899/704/543
+f 228/702/537 579/412/537 582/408/544
+f 583/407/545 580/411/538 230/700/538
+f 898/770/541 896/772/546 962/767/541
+f 959/766/547 895/773/548 961/768/542
+f 234/699/544 582/408/544 238/695/549
+f 585/403/550 583/407/545 240/692/550
+f 896/772/546 894/774/551 960/765/546
+f 957/764/552 893/775/552 959/766/547
+f 238/695/549 584/404/549 242/691/553
+f 587/776/554 585/403/550 244/688/554
+f 894/774/551 892/777/555 958/763/551
+f 955/762/556 891/778/556 957/764/552
+f 242/691/553 586/400/553 588/396/557
+f 589/399/558 587/776/554 244/688/554
+f 892/777/555 890/779/559 956/761/555
+f 953/760/560 889/780/560 955/762/556
+f 246/687/557 588/396/557 250/683/561
+f 591/395/562 589/399/558 252/680/562
+f 890/779/559 888/781/563 954/758/559
+f 951/757/564 887/782/564 953/760/560
+f 250/683/561 590/392/561 254/679/565
+f 593/388/566 591/395/562 256/676/566
+f 888/783/563 886/784/567 952/756/563
+f 949/755/568 885/785/568 951/786/564
+f 254/679/565 592/389/565 258/675/569
+f 595/384/570 593/388/566 260/672/570
+f 886/784/567 884/787/571 950/754/567
+f 947/753/572 883/788/572 949/755/568
+f 258/675/569 594/385/569 596/381/573
+f 597/789/574 595/384/570 260/672/570
+f 884/787/571 882/790/575 948/752/571
+f 945/751/576 881/791/576 947/753/572
+f 262/671/573 596/381/573 266/668/577
+f 599/380/578 597/789/574 264/669/574
+f 882/790/575 880/792/579 946/750/575
+f 943/749/580 879/793/580 945/751/576
+f 266/668/577 598/377/577 270/664/581
+f 601/376/582 599/380/578 268/665/578
+f 880/792/579 878/794/583 944/748/579
+f 941/747/584 877/795/584 943/749/580
+f 270/664/581 600/373/581 602/370/585
+f 603/369/586 601/376/582 272/661/582
+f 878/794/583 876/796/587 942/746/583
+f 939/745/588 875/797/588 941/747/584
+f 274/660/585 602/370/585 604/366/589
+f 605/798/590 603/369/586 276/658/586
+f 876/796/587 874/799/591 940/744/587
+f 937/742/592 873/800/592 939/745/588
+f 278/657/589 604/366/589 606/363/593
+f 607/362/594 605/798/590 280/654/590
+f 874/799/591 872/801/595 938/743/591
+f 935/740/596 871/802/596 937/742/592
+f 282/653/593 606/363/593 286/649/597
+f 609/358/598 607/362/594 288/646/598
+f 872/801/595 870/803/599 936/741/595
+f 933/739/600 869/804/600 935/740/596
+f 286/649/597 608/359/597 290/645/601
+f 611/354/602 609/358/598 292/642/602
+f 870/803/599 868/805/603 934/738/599
+f 931/736/604 867/806/604 933/739/600
+f 290/645/601 610/355/601 294/641/605
+f 613/807/606 611/354/602 296/638/606
+f 868/805/603 866/808/607 930/735/607
+f 929/734/608 865/809/608 867/806/604
+f 294/641/605 612/351/605 298/637/609
+f 615/347/610 613/807/606 300/634/610
+f 866/808/607 864/810/611 928/733/611
+f 927/732/612 863/811/612 865/809/608
+f 298/637/609 614/348/609 302/633/613
+f 617/812/614 615/347/610 304/631/614
+f 864/810/611 862/813/615 926/731/615
+f 925/730/616 861/814/616 863/811/612
+f 302/633/613 616/344/613 306/630/617
+f 619/343/618 617/812/614 308/627/618
+f 862/813/615 860/815/619 924/729/619
+f 923/728/620 859/816/620 861/814/616
+f 306/630/617 618/340/617 310/626/621
+f 621/339/622 619/343/618 312/623/622
+f 860/815/619 858/817/623 922/727/623
+f 921/726/624 857/818/624 923/728/620
+f 310/626/621 620/336/621 314/622/625
+f 623/335/626 621/339/622 316/619/626
+f 858/817/623 856/819/627 922/727/623
+f 919/724/628 855/820/628 921/726/624
+f 314/622/625 622/332/625 318/618/629
+f 625/328/630 623/335/626 320/615/630
+f 856/819/627 854/821/631 920/725/627
+f 917/722/632 853/822/632 919/724/628
+f 318/618/629 624/329/629 322/614/633
+f 627/823/634 625/328/630 324/611/634
+f 854/821/631 852/824/635 918/723/631
+f 915/720/636 851/825/636 917/722/632
+f 322/614/633 626/325/633 326/609/637
+f 629/324/638 627/823/634 328/606/638
+f 852/824/635 850/826/639 916/721/635
+f 913/718/640 849/827/640 915/720/636
+f 326/609/637 628/320/637 630/828/641
+f 631/319/642 629/324/638 332/605/642
+f 850/826/639 848/829/643 914/719/639
+f 911/717/644 847/830/644 913/718/640
+f 330/604/641 630/315/641 632/311/645
+f 633/831/646 631/314/642 336/597/646
+f 848/829/643 846/832/647 912/716/643
+f 909/715/648 845/833/648 911/717/644
+f 334/600/645 632/311/645 338/596/649
+f 635/310/650 633/831/646 340/593/650
+f 846/832/647 844/834/651 910/714/647
+f 907/712/652 843/835/652 909/715/648
+f 338/596/649 634/307/649 342/592/653
+f 637/306/654 635/310/650 344/589/654
+f 844/834/651 842/836/655 908/713/651
+f 905/711/656 841/837/656 907/712/652
+f 342/592/653 636/303/653 346/588/657
+f 639/302/658 637/306/654 348/585/658
+f 842/836/655 840/838/659 906/710/655
+f 903/709/660 839/839/660 905/711/656
+f 346/588/657 638/299/657 350/583/661
+f 641/298/662 639/302/658 352/580/662
+f 840/838/659 838/840/663 904/708/659
+f 900/707/664 836/841/664 903/709/660
+f 350/583/661 640/294/661 227/703/536
+f 581/293/539 641/298/662 231/579/539
+f 838/840/663 837/769/540 902/705/663
+f 899/704/543 835/842/543 900/707/664
+f 642/161/665 226/584/665 229/701/666
+f 233/843/667 232/844/668 644/35/668
+f 643/160/666 229/701/666 235/698/669
+f 237/845/670 233/843/667 645/157/667
+f 646/156/669 235/698/669 239/694/671
+f 241/846/672 237/845/670 647/153/670
+f 648/152/671 239/694/671 650/148/673
+f 245/847/674 241/846/672 651/145/674
+f 650/148/673 243/690/673 247/686/675
+f 249/848/676 245/847/674 651/145/674
+f 652/144/675 247/686/675 251/682/677
+f 253/849/678 249/848/676 653/141/676
+f 654/140/677 251/682/677 656/136/679
+f 257/850/680 253/849/678 657/134/680
+f 656/136/679 255/678/679 259/674/681
+f 261/851/682 257/850/680 659/130/682
+f 658/133/681 259/674/681 263/670/683
+f 265/852/684 261/851/682 659/130/682
+f 660/129/683 263/670/683 267/667/685
+f 269/853/686 265/852/684 661/126/684
+f 662/125/685 267/667/685 271/663/687
+f 273/854/688 269/853/686 663/122/689
+f 664/121/687 271/663/687 666/117/690
+f 277/855/691 273/854/688 667/114/691
+f 666/117/690 275/659/690 668/113/692
+f 281/856/693 277/855/691 669/110/693
+f 668/113/692 279/656/692 283/652/694
+f 285/857/695 281/856/693 669/110/693
+f 670/109/694 283/652/694 672/105/696
+f 289/858/697 285/857/695 673/102/697
+f 672/105/696 287/648/696 674/101/698
+f 293/859/699 289/858/697 675/98/699
+f 674/101/698 291/644/698 676/97/700
+f 297/860/701 293/859/699 677/94/701
+f 676/97/700 295/640/700 678/93/702
+f 301/861/703 297/860/701 679/91/703
+f 678/93/702 299/636/702 303/632/704
+f 305/862/705 301/861/703 679/91/703
+f 680/90/704 303/632/704 682/86/706
+f 309/863/707 305/862/705 683/83/707
+f 682/86/706 307/629/706 684/82/708
+f 313/864/709 309/863/707 685/79/709
+f 684/82/708 311/625/708 315/621/710
+f 317/865/711 313/864/709 685/79/709
+f 686/78/710 315/621/710 319/617/712
+f 321/866/713 317/865/711 687/75/714
+f 688/74/712 319/617/712 690/70/715
+f 325/867/716 321/866/713 691/67/716
+f 690/70/715 323/613/715 692/65/717
+f 329/868/718 325/867/716 693/62/718
+f 692/65/717 327/608/717 694/869/719
+f 333/870/720 329/868/718 695/61/720
+f 694/60/719 331/603/719 696/56/721
+f 337/871/722 333/872/720 697/53/722
+f 696/56/721 335/599/721 698/52/723
+f 341/873/724 337/871/722 699/49/724
+f 698/52/723 339/595/723 700/48/725
+f 345/874/726 341/873/724 701/45/726
+f 700/48/725 343/591/725 702/44/727
+f 349/875/728 345/874/726 703/41/728
+f 702/44/727 347/587/727 704/39/729
+f 353/876/730 349/875/728 705/36/730
+f 704/39/729 351/582/729 642/161/665
+f 232/844/668 353/876/730 644/35/668
+f 355/877/731 706/40/731 707/159/732
+f 708/158/733 709/37/734 359/513/734
+f 834/287/735 413/166/736 419/1/735
+f 512/878/737 415/163/737 421/879/738
+f 356/880/732 707/159/732 710/155/739
+f 711/154/740 708/158/733 358/576/733
+f 419/1/735 423/4/741 834/287/735
+f 831/285/742 425/881/742 833/289/738
+f 362/882/739 710/155/739 366/883/743
+f 713/150/744 711/154/740 368/572/745
+f 423/4/741 427/5/746 832/283/741
+f 829/281/747 429/884/747 831/285/742
+f 366/883/743 712/151/748 714/147/749
+f 715/146/750 713/150/744 368/572/745
+f 427/5/746 431/6/751 830/279/746
+f 827/277/752 433/885/752 829/281/747
+f 370/886/749 714/147/749 716/143/753
+f 717/142/754 715/146/750 372/570/750
+f 431/6/751 435/7/755 828/275/751
+f 825/273/756 437/887/756 827/277/752
+f 374/888/753 716/143/753 718/139/757
+f 719/138/758 717/142/754 376/568/754
+f 435/7/755 439/8/759 826/270/755
+f 823/268/760 441/889/761 825/273/756
+f 378/890/757 718/139/757 382/891/762
+f 721/892/763 719/138/758 380/566/758
+f 439/10/759 443/9/764 824/265/765
+f 821/263/766 445/893/766 823/894/760
+f 382/891/762 720/135/762 722/132/767
+f 723/131/768 721/892/763 388/562/768
+f 443/9/764 447/11/769 822/261/764
+f 819/259/770 449/895/771 821/263/766
+f 386/896/767 722/132/767 390/897/772
+f 725/127/773 723/131/768 392/560/773
+f 447/11/769 451/12/774 820/257/769
+f 817/255/775 453/898/775 819/259/770
+f 390/897/772 724/128/772 726/124/776
+f 727/123/777 725/127/773 392/560/773
+f 451/12/774 455/13/778 818/253/774
+f 815/251/779 457/899/779 817/255/775
+f 394/900/776 726/124/776 398/901/780
+f 729/119/781 727/123/777 400/556/781
+f 455/13/778 459/14/782 816/249/778
+f 813/247/783 461/902/783 815/251/779
+f 398/901/780 728/120/780 402/903/784
+f 731/115/785 729/119/781 404/554/785
+f 459/14/782 463/15/786 814/245/782
+f 811/243/787 465/904/787 813/247/783
+f 402/903/784 730/116/784 732/112/788
+f 733/111/789 731/115/785 404/554/785
+f 463/15/786 467/16/790 812/241/786
+f 809/239/791 469/905/791 811/243/787
+f 406/906/788 732/112/788 734/108/792
+f 735/107/793 733/111/789 408/552/789
+f 467/16/790 471/17/794 810/237/790
+f 807/235/795 473/907/795 809/239/791
+f 410/908/792 734/108/792 414/909/796
+f 737/103/797 735/107/793 416/548/797
+f 471/17/794 475/18/798 808/233/794
+f 805/231/799 477/910/799 807/235/795
+f 414/909/796 736/104/796 738/100/800
+f 739/911/801 737/103/797 420/546/801
+f 475/18/798 479/19/802 806/229/798
+f 803/224/803 481/912/804 805/231/799
+f 418/913/800 738/100/800 422/914/805
+f 741/99/806 739/911/801 424/544/806
+f 479/19/802 482/20/807 354/222/807
+f 357/221/808 483/915/808 481/912/804
+f 422/914/805 740/96/805 426/916/809
+f 743/95/810 741/99/806 428/542/810
+f 482/20/807 484/21/811 360/218/811
+f 361/220/812 485/917/813 483/915/808
+f 426/916/809 742/92/809 430/918/814
+f 745/88/815 743/95/810 432/540/815
+f 484/21/811 486/22/816 363/214/816
+f 365/216/817 487/919/817 485/917/813
+f 430/918/814 744/89/814 434/920/818
+f 747/921/819 745/88/815 436/538/819
+f 486/22/816 488/23/820 367/210/820
+f 369/212/821 489/922/821 487/919/817
+f 434/920/818 746/85/818 438/923/822
+f 749/84/823 747/921/819 440/536/823
+f 488/23/820 490/24/824 367/210/820
+f 373/208/825 491/924/825 369/212/821
+f 438/923/822 748/81/822 442/925/826
+f 751/80/827 749/84/823 444/534/827
+f 490/24/824 492/25/828 371/206/824
+f 377/204/829 493/926/829 373/208/825
+f 442/925/826 750/77/826 446/927/830
+f 753/76/831 751/80/827 448/532/831
+f 492/25/828 494/26/832 375/202/828
+f 381/200/833 495/928/833 377/204/829
+f 446/927/830 752/73/830 450/929/834
+f 755/72/835 753/76/831 448/532/831
+f 494/26/832 496/27/836 379/198/832
+f 385/196/837 497/930/837 381/200/833
+f 450/929/834 754/69/834 454/931/838
+f 757/68/839 755/72/835 456/527/839
+f 496/27/836 498/28/840 383/194/836
+f 389/192/841 499/932/841 385/196/837
+f 454/931/838 756/64/838 458/933/842
+f 759/63/843 757/68/839 460/526/843
+f 498/28/840 500/29/844 387/190/840
+f 393/188/845 501/934/845 389/192/841
+f 458/935/842 758/59/842 462/936/846
+f 761/58/847 759/937/843 464/522/847
+f 500/29/844 502/30/848 391/186/844
+f 397/184/849 503/938/849 393/188/845
+f 462/936/846 760/55/846 762/51/850
+f 763/54/851 761/58/847 464/522/847
+f 502/30/848 504/31/852 395/182/848
+f 401/180/853 505/939/853 397/184/849
+f 466/940/850 762/51/850 470/941/854
+f 765/50/855 763/54/851 472/518/855
+f 504/31/852 506/32/856 399/178/852
+f 405/176/857 507/942/857 401/180/853
+f 470/941/854 764/47/854 474/943/858
+f 767/46/859 765/50/855 476/516/859
+f 506/32/856 508/33/860 403/174/856
+f 409/172/861 509/944/861 405/176/857
+f 474/943/858 766/43/858 478/945/862
+f 769/42/863 767/46/859 480/514/863
+f 508/33/860 510/34/864 407/170/860
+f 417/168/865 513/946/865 409/172/861
+f 478/945/862 768/38/862 355/877/731
+f 709/37/734 769/42/863 359/513/734
+f 510/34/864 511/2/736 411/165/864
+f 513/946/865 417/168/865 512/878/737
+f 800/947/866 801/878/867 770/879/868
+f 800/947/866 770/879/868 771/881/869
+f 800/947/866 771/881/869 772/884/870
+f 800/947/866 772/884/870 773/885/871
+f 800/947/866 773/885/871 774/887/872
+f 800/947/866 774/887/872 775/889/873
+f 800/947/866 775/948/873 776/893/874
+f 800/947/866 776/893/874 777/895/875
+f 800/947/866 777/895/875 778/898/876
+f 800/947/866 778/898/876 779/899/877
+f 800/947/866 779/899/877 780/902/878
+f 800/947/866 780/902/878 781/904/879
+f 800/947/866 781/904/879 782/905/880
+f 800/947/866 782/905/880 783/907/881
+f 800/947/866 783/907/881 784/910/882
+f 800/947/866 784/910/882 785/912/883
+f 800/947/866 785/912/883 786/915/884
+f 800/947/866 786/915/884 787/917/885
+f 800/947/866 787/917/885 788/919/886
+f 800/947/866 788/919/886 789/922/887
+f 800/947/866 789/922/887 790/924/888
+f 800/947/866 790/924/888 791/926/889
+f 800/947/866 791/926/889 792/928/890
+f 800/947/866 792/928/890 793/930/891
+f 800/947/866 793/930/891 794/932/892
+f 800/947/866 794/932/892 795/934/893
+f 800/947/866 795/934/893 796/938/894
+f 800/947/866 796/938/894 797/939/895
+f 800/947/866 797/939/895 798/942/896
+f 800/947/866 798/942/896 799/944/897
+f 799/944/897 802/946/898 800/947/866
+f 802/946/898 801/878/867 800/947/866
+f 1442/36/35 1506/42/35 1446/37/34
+f 1441/39/36 1379/161/37 1443/40/37
+f 1440/41/38 1504/46/38 1506/42/35
+f 1439/44/39 1441/39/36 1505/38/36
+f 1438/45/40 1502/50/40 1504/46/38
+f 1437/48/41 1439/44/39 1503/43/39
+f 1436/49/42 1500/54/42 1502/50/40
+f 1435/52/43 1437/48/41 1501/47/41
+f 1434/53/44 1498/58/44 1500/54/42
+f 1433/56/45 1435/52/43 1499/51/43
+f 1432/57/46 1496/937/46 1498/58/44
+f 1431/60/47 1433/56/45 1497/55/45
+f 1430/62/48 1494/68/48 1496/63/46
+f 1429/65/49 1431/869/47 1495/66/47
+f 1428/67/50 1492/72/50 1494/68/48
+f 1493/64/49 1491/69/51 1429/65/49
+f 1426/71/52 1490/76/52 1492/72/50
+f 1425/74/53 1427/70/51 1491/69/51
+f 1424/75/54 1488/80/54 1490/76/52
+f 1423/78/55 1425/74/53 1489/73/53
+f 1422/79/56 1486/84/56 1488/80/54
+f 1421/82/57 1423/78/55 1487/77/55
+f 1420/83/58 1484/921/58 1486/84/56
+f 1419/86/59 1421/82/57 1485/81/57
+f 1484/921/58 1420/83/58 1482/88/60
+f 1483/85/59 1481/89/61 1419/86/59
+f 1416/91/62 1480/95/62 1482/88/60
+f 1415/93/63 1417/90/61 1481/89/61
+f 1414/94/64 1478/99/64 1480/95/62
+f 1413/97/65 1415/93/63 1479/92/63
+f 1412/98/66 1476/911/66 1478/99/64
+f 1411/101/67 1413/97/65 1477/96/65
+f 1476/911/66 1412/98/66 1474/103/68
+f 1475/100/67 1473/104/69 1411/101/67
+f 1474/103/68 1410/102/68 1472/107/70
+f 1473/104/69 1471/108/71 1409/105/69
+f 1472/107/70 1408/106/70 1470/111/72
+f 1471/108/71 1469/112/73 1407/109/71
+f 1470/111/72 1406/110/72 1468/115/74
+f 1469/112/73 1467/116/75 1405/113/73
+f 1468/115/74 1404/114/74 1466/119/76
+f 1467/116/75 1465/120/77 1403/117/75
+f 1466/119/76 1402/118/76 1464/123/78
+f 1465/120/77 1463/124/79 1401/121/77
+f 1464/123/78 1400/122/78 1462/127/80
+f 1463/124/79 1461/128/81 1399/125/79
+f 1462/127/80 1398/126/80 1460/131/82
+f 1461/128/81 1459/132/83 1397/129/81
+f 1394/134/84 1458/892/84 1460/131/82
+f 1459/132/83 1457/135/85 1395/133/83
+f 1458/892/84 1394/134/84 1456/138/86
+f 1457/135/85 1455/139/87 1393/136/85
+f 1456/138/86 1392/137/86 1454/142/88
+f 1455/139/87 1453/143/89 1391/140/87
+f 1454/142/88 1390/141/88 1452/146/90
+f 1453/143/89 1451/147/91 1389/144/89
+f 1452/146/90 1388/145/90 1450/150/92
+f 1451/147/91 1449/151/93 1387/148/91
+f 1450/150/92 1386/149/92 1448/154/94
+f 1449/151/93 1447/155/95 1385/152/93
+f 1448/154/94 1384/153/94 1445/158/96
+f 1380/160/97 1383/156/95 1447/155/95
+f 1445/158/96 1382/157/96 1446/37/34
+f 1444/159/97 1443/40/37 1380/160/97
+f 35/163/98 34/168/99 99/164/99
+f 36/166/101 100/290/101 101/167/100
+f 34/168/99 38/172/104 102/169/102
+f 37/165/100 101/167/100 103/171/103
+f 38/172/104 40/176/105 104/173/105
+f 39/170/103 103/171/103 105/175/106
+f 40/176/105 42/180/107 106/177/107
+f 41/174/106 105/175/106 107/179/108
+f 42/180/107 44/184/109 108/181/109
+f 43/178/108 107/179/108 109/183/110
+f 44/184/109 46/188/111 110/185/111
+f 45/182/110 109/183/110 111/187/112
+f 46/188/111 48/192/113 112/189/113
+f 47/186/112 111/187/112 113/191/114
+f 48/192/113 50/196/115 114/193/115
+f 49/190/114 113/191/114 115/195/116
+f 50/196/115 52/200/117 116/197/117
+f 51/194/116 115/195/116 117/199/118
+f 52/200/117 54/204/119 118/201/119
+f 53/198/118 117/199/118 119/203/120
+f 54/204/119 56/208/121 120/205/121
+f 55/202/120 119/203/120 121/207/122
+f 56/208/121 58/212/123 122/209/123
+f 57/206/122 121/207/122 123/211/124
+f 58/212/123 60/216/125 124/213/125
+f 59/210/124 123/211/124 125/215/126
+f 60/216/125 62/220/127 126/217/127
+f 61/214/126 125/215/126 127/219/128
+f 128/223/129 126/217/127 64/221/129
+f 129/226/130 65/222/130 127/219/128
+f 130/227/131 128/223/129 66/224/131
+f 131/949/132 67/225/132 129/226/130
+f 66/224/131 68/231/133 132/228/133
+f 67/225/132 131/949/132 133/230/134
+f 68/231/133 70/235/137 134/232/135
+f 69/229/134 133/230/134 135/234/136
+f 70/235/137 72/239/138 136/236/138
+f 71/233/136 135/234/136 137/238/139
+f 72/239/138 74/243/140 138/240/140
+f 73/237/139 137/238/139 139/242/141
+f 74/243/140 76/247/142 140/244/142
+f 75/241/141 139/242/141 141/246/143
+f 76/247/142 78/251/144 142/248/144
+f 77/245/143 141/246/143 143/250/145
+f 78/251/144 80/255/146 144/252/146
+f 79/249/145 143/250/145 145/254/147
+f 80/255/146 82/259/148 146/256/148
+f 81/253/147 145/254/147 147/258/149
+f 82/259/148 84/263/150 148/260/150
+f 83/257/149 147/258/149 149/262/151
+f 84/263/150 86/894/152 150/264/152
+f 85/261/151 149/262/151 151/266/153
+f 86/268/152 88/273/154 152/269/154
+f 87/271/153 151/950/153 153/272/155
+f 88/273/154 90/277/156 154/274/156
+f 89/270/155 153/272/155 155/276/157
+f 90/277/156 92/281/158 156/278/158
+f 91/275/157 155/276/157 157/280/159
+f 92/281/158 94/285/163 158/282/160
+f 93/279/159 157/280/159 159/284/162
+f 94/285/163 96/289/167 160/286/164
+f 95/283/161 159/284/162 161/288/166
+f 96/289/167 35/163/98 98/162/98
+f 97/287/165 161/288/166 100/290/101
+f 1314/292/169 1378/298/169 1318/293/168
+f 1313/295/170 1251/414/241 1315/296/171
+f 1312/297/172 1376/302/175 1378/298/169
+f 1311/300/173 1313/295/170 1377/294/170
+f 1310/301/174 1374/306/174 1376/302/175
+f 1309/304/176 1311/300/173 1375/299/173
+f 1308/305/177 1372/310/177 1374/306/174
+f 1307/308/178 1309/304/176 1373/303/176
+f 1306/309/179 1370/831/179 1372/310/177
+f 1305/312/181 1307/308/178 1371/307/178
+f 1370/831/179 1306/309/179 1368/314/182
+f 1303/316/183 1305/312/181 1369/311/180
+f 1302/318/184 1366/324/184 1368/319/182
+f 1367/828/183 1365/320/185 1303/322/183
+f 1300/323/186 1364/823/899 1366/324/184
+f 1299/326/188 1301/321/185 1365/320/185
+f 1364/823/899 1300/323/186 1362/328/189
+f 1363/325/187 1361/329/190 1299/326/188
+f 1296/331/192 1360/335/192 1362/328/189
+f 1295/333/193 1297/330/191 1361/329/190
+f 1294/334/194 1358/339/194 1360/335/192
+f 1359/332/193 1357/336/195 1295/333/193
+f 1292/338/196 1356/343/196 1358/339/194
+f 1291/341/197 1293/337/195 1357/336/195
+f 1290/342/198 1354/812/900 1356/343/196
+f 1289/345/199 1291/341/197 1355/340/197
+f 1354/812/900 1290/342/198 1352/347/200
+f 1353/344/199 1351/348/201 1289/345/199
+f 1286/350/202 1350/807/202 1352/347/200
+f 1285/352/204 1287/349/201 1351/348/201
+f 1350/807/202 1286/350/202 1348/354/205
+f 1349/351/203 1347/355/206 1285/352/204
+f 1348/354/205 1284/353/205 1346/358/207
+f 1347/355/206 1345/359/208 1283/356/206
+f 1346/358/207 1282/357/207 1344/362/210
+f 1345/359/208 1343/363/211 1281/360/209
+f 1278/365/212 1342/798/212 1344/362/210
+f 1277/367/213 1279/364/211 1343/363/211
+f 1342/798/212 1278/365/212 1340/369/214
+f 1341/366/213 1339/370/215 1277/367/213
+f 1274/372/216 1338/376/216 1340/369/214
+f 1273/374/217 1275/371/215 1339/370/215
+f 1272/375/218 1336/380/221 1338/376/216
+f 1271/378/219 1273/374/217 1337/373/217
+f 1270/379/220 1334/789/220 1336/380/221
+f 1269/382/222 1271/378/219 1335/377/219
+f 1334/789/220 1270/379/220 1332/384/223
+f 1333/381/222 1331/385/224 1269/382/222
+f 1332/384/223 1268/383/223 1330/388/225
+f 1331/385/224 1329/389/226 1267/386/224
+f 1264/391/227 1328/395/227 1330/388/225
+f 1329/389/226 1327/392/228 1265/390/226
+f 1262/394/229 1326/399/233 1328/395/227
+f 1261/397/231 1263/393/228 1327/392/228
+f 1260/398/232 1324/776/232 1326/399/233
+f 1259/401/234 1261/397/231 1325/396/230
+f 1324/776/232 1260/398/232 1322/403/235
+f 1323/400/234 1321/404/236 1259/401/234
+f 1322/403/235 1258/402/235 1320/407/237
+f 1321/404/236 1319/408/238 1257/405/236
+f 1320/407/237 1256/406/237 1317/411/239
+f 1319/408/238 1316/412/240 1255/409/238
+f 1253/291/168 1318/293/168 1317/411/239
+f 1251/414/241 1252/413/240 1316/412/240
+f 1218/416/243 1250/418/245 1219/417/244
+f 1216/419/246 1091/512/337 1219/417/244
+f 1214/420/247 1249/421/248 1250/418/245
+f 1212/422/249 1216/419/246 1250/418/245
+f 1210/423/250 1248/424/251 1249/421/248
+f 1208/425/252 1212/422/249 1249/421/248
+f 1206/426/253 1247/427/254 1248/424/251
+f 1204/428/255 1208/425/252 1248/424/251
+f 1202/429/256 1246/430/257 1247/427/254
+f 1200/431/258 1204/428/255 1247/427/254
+f 1198/432/259 1245/433/260 1246/430/257
+f 1196/434/261 1200/431/258 1246/430/257
+f 1194/436/262 1244/438/263 1245/437/260
+f 1192/439/264 1196/529/261 1245/437/260
+f 1190/440/265 1243/441/266 1244/438/263
+f 1188/442/267 1192/439/264 1244/438/263
+f 1186/443/268 1242/444/269 1243/441/266
+f 1184/445/270 1188/442/267 1243/441/266
+f 1242/444/269 1186/443/268 1241/447/272
+f 1180/448/273 1184/445/270 1242/444/269
+f 1178/449/274 1240/450/275 1241/447/272
+f 1176/451/276 1180/448/273 1241/447/272
+f 1174/452/277 1239/453/278 1240/450/275
+f 1172/454/279 1176/451/276 1240/450/275
+f 1170/455/280 1238/456/281 1239/453/278
+f 1168/457/282 1172/454/279 1239/453/278
+f 1166/458/283 1237/459/284 1238/456/281
+f 1164/460/285 1168/457/282 1238/456/281
+f 1162/461/286 1236/462/287 1237/459/284
+f 1160/463/288 1164/460/285 1237/459/284
+f 1158/464/289 1235/465/290 1236/462/287
+f 1156/466/291 1160/463/288 1236/462/287
+f 1235/465/290 1158/464/289 1234/468/293
+f 1235/465/290 1234/468/293 1156/466/291
+f 1234/468/293 1154/467/292 1233/471/296
+f 1234/468/293 1233/471/296 1152/469/294
+f 1233/471/296 1150/470/295 1232/474/299
+f 1233/471/296 1232/474/299 1148/472/297
+f 1232/474/299 1146/473/298 1231/477/302
+f 1232/474/299 1231/477/302 1144/475/300
+f 1231/477/302 1142/476/301 1230/480/305
+f 1231/477/302 1230/480/305 1140/478/303
+f 1230/480/305 1138/479/304 1229/483/308
+f 1230/480/305 1229/483/308 1136/481/306
+f 1229/483/308 1134/482/307 1228/486/311
+f 1229/483/308 1228/486/311 1132/484/309
+f 1228/486/311 1130/485/310 1227/489/314
+f 1228/486/311 1227/489/314 1128/487/312
+f 1227/489/314 1126/488/313 1226/492/317
+f 1227/489/314 1226/492/317 1124/490/315
+f 1226/492/317 1122/491/316 1225/495/320
+f 1226/492/317 1225/495/320 1120/493/318
+f 1225/495/320 1118/494/319 1224/498/323
+f 1225/495/320 1224/498/323 1116/496/321
+f 1224/498/323 1114/497/322 1223/501/326
+f 1224/498/323 1223/501/326 1112/499/324
+f 1223/501/326 1110/500/325 1222/504/329
+f 1223/501/326 1222/504/329 1108/502/327
+f 1222/504/329 1106/503/328 1221/507/332
+f 1222/504/329 1221/507/332 1104/505/330
+f 1221/507/332 1102/506/331 1220/510/335
+f 1221/507/332 1220/510/335 1100/508/333
+f 1220/510/335 1098/509/334 1219/417/244
+f 1220/510/335 1219/417/244 1094/511/336
+f 1217/514/339 1218/416/243 1097/415/242
+f 1215/515/340 1092/578/401 1091/512/337
+f 1213/516/341 1214/420/247 1218/416/243
+f 1211/517/342 1215/515/340 1216/419/246
+f 1209/518/343 1210/423/250 1214/420/247
+f 1207/519/344 1211/517/342 1212/422/249
+f 1205/520/345 1206/426/253 1210/423/250
+f 1203/521/346 1207/519/344 1208/425/252
+f 1201/522/347 1202/429/256 1206/426/253
+f 1199/523/348 1203/521/346 1204/428/255
+f 1197/524/349 1198/432/259 1202/429/256
+f 1195/525/350 1199/523/348 1200/431/258
+f 1193/527/351 1194/436/262 1198/435/259
+f 1191/528/352 1195/951/350 1196/529/261
+f 1189/530/353 1190/440/265 1194/436/262
+f 1192/439/264 1188/442/267 1191/528/352
+f 1185/532/355 1186/443/268 1190/440/265
+f 1183/533/356 1187/531/354 1188/442/267
+f 1181/534/357 1182/446/271 1186/443/268
+f 1179/535/358 1183/533/356 1184/445/270
+f 1182/446/271 1181/534/357 1178/449/274
+f 1180/448/273 1176/451/276 1179/535/358
+f 1178/449/274 1177/536/359 1174/452/277
+f 1176/451/276 1172/454/279 1175/537/360
+f 1174/452/277 1173/538/361 1170/455/280
+f 1172/454/279 1168/457/282 1171/539/362
+f 1165/542/365 1166/458/283 1170/455/280
+f 1163/543/366 1167/541/364 1168/457/282
+f 1161/544/367 1162/461/286 1166/458/283
+f 1159/545/368 1163/543/366 1164/460/285
+f 1157/546/369 1158/464/289 1162/461/286
+f 1155/547/370 1159/545/368 1160/463/288
+f 1158/464/289 1157/546/369 1154/467/292
+f 1156/466/291 1152/469/294 1155/547/370
+f 1154/467/292 1153/548/371 1150/470/295
+f 1152/469/294 1148/472/297 1151/549/372
+f 1150/470/295 1149/550/373 1146/473/298
+f 1143/553/376 1147/551/374 1148/472/297
+f 1141/554/377 1142/476/301 1146/473/298
+f 1139/555/378 1143/553/376 1144/475/300
+f 1142/476/301 1141/554/377 1138/479/304
+f 1140/478/303 1136/481/306 1139/555/378
+f 1138/479/304 1137/556/379 1134/482/307
+f 1136/481/306 1132/484/309 1135/557/380
+f 1134/482/307 1133/558/381 1130/485/310
+f 1132/484/309 1128/487/312 1131/559/382
+f 1130/485/310 1129/560/383 1126/488/313
+f 1128/487/312 1124/490/315 1127/561/384
+f 1126/488/313 1125/562/385 1122/491/316
+f 1124/490/315 1120/493/318 1123/563/386
+f 1122/491/316 1121/564/387 1118/494/319
+f 1120/493/318 1116/496/321 1119/565/388
+f 1113/568/391 1114/497/322 1118/494/319
+f 1111/569/392 1115/567/390 1116/496/321
+f 1114/497/322 1113/568/391 1110/500/325
+f 1107/571/394 1111/569/392 1112/499/324
+f 1110/500/325 1109/570/393 1106/503/328
+f 1108/502/327 1104/505/330 1107/571/394
+f 1106/503/328 1105/572/395 1102/506/331
+f 1104/505/330 1100/508/333 1103/573/396
+f 1102/506/331 1101/574/397 1098/509/334
+f 1100/508/333 1094/511/336 1099/575/398
+f 1098/509/334 1095/576/399 1097/415/242
+f 1094/511/336 1091/512/337 1093/577/400
+f 1089/580/403 1090/586/403 969/581/402
+f 1087/583/404 964/703/405 963/584/405
+f 1085/585/406 1086/590/406 1090/586/403
+f 1083/588/407 1087/583/404 1088/582/404
+f 1081/589/408 1082/594/408 1086/590/406
+f 1079/592/409 1083/588/407 1084/587/407
+f 1077/593/410 1078/598/410 1082/594/408
+f 1075/596/411 1079/592/409 1080/591/409
+f 1073/597/412 1074/602/412 1078/598/410
+f 1071/600/413 1075/596/411 1076/595/411
+f 1069/601/414 1070/952/414 1074/602/412
+f 1067/604/415 1071/600/413 1072/599/413
+f 1065/606/416 1066/612/416 1070/607/414
+f 1063/609/417 1067/953/415 1068/610/415
+f 1061/611/418 1062/616/418 1066/612/416
+f 1059/614/419 1063/609/417 1064/608/417
+f 1057/615/420 1058/620/420 1062/616/418
+f 1055/618/421 1059/614/419 1060/613/419
+f 1053/619/422 1054/624/422 1058/620/420
+f 1051/622/423 1055/618/421 1056/617/421
+f 1049/623/424 1050/954/424 1054/624/422
+f 1047/626/425 1051/622/423 1052/621/423
+f 1050/954/424 1049/623/424 1046/628/426
+f 1043/630/427 1047/626/425 1048/625/425
+f 1041/631/428 1042/635/428 1046/628/426
+f 1039/633/429 1043/630/427 1044/629/427
+f 1037/634/430 1038/639/430 1042/635/428
+f 1035/637/431 1039/633/429 1040/632/429
+f 1033/638/432 1034/643/432 1038/639/430
+f 1031/641/433 1035/637/431 1036/636/431
+f 1029/642/434 1030/955/434 1034/643/432
+f 1027/645/435 1031/641/433 1032/640/433
+f 1030/955/434 1029/642/434 1026/647/436
+f 1028/644/435 1024/648/437 1027/645/435
+f 1026/647/436 1025/646/436 1022/651/438
+f 1024/648/437 1020/652/439 1023/649/437
+f 1022/651/438 1021/650/438 1018/655/440
+f 1015/657/441 1019/653/439 1020/652/439
+f 1013/658/442 1014/956/442 1018/655/440
+f 1016/656/441 1012/659/443 1015/657/441
+f 1014/956/442 1013/658/442 1010/662/444
+f 1012/659/443 1008/663/445 1011/660/443
+f 1010/662/444 1009/661/444 1006/666/446
+f 1008/663/445 1004/667/447 1007/664/445
+f 1001/669/448 1002/673/448 1006/666/446
+f 999/671/449 1003/668/447 1004/667/447
+f 997/672/450 998/677/450 1002/673/448
+f 995/675/451 999/671/449 1000/670/449
+f 993/676/452 994/957/452 998/677/450
+f 996/674/451 992/678/453 995/675/451
+f 994/957/452 993/676/452 990/681/454
+f 992/678/453 988/682/455 991/679/453
+f 990/681/454 989/680/454 986/685/456
+f 988/682/455 984/686/457 987/683/455
+f 986/685/456 985/684/456 982/689/458
+f 979/691/459 983/687/457 984/686/457
+f 982/689/458 981/688/458 978/693/460
+f 980/690/459 976/694/461 979/691/459
+f 978/693/460 977/692/460 974/697/462
+f 976/694/461 972/698/463 975/695/461
+f 967/700/464 970/958/464 974/697/462
+f 965/702/465 971/699/463 972/698/463
+f 970/958/464 967/700/464 969/581/402
+f 964/703/405 965/702/465 966/701/465
+f 162/704/466 163/707/467 515/413/467
+f 164/706/469 516/291/469 517/410/468
+f 163/707/467 166/709/470 518/409/470
+f 165/705/468 517/410/468 519/406/472
+f 166/709/470 168/711/476 520/405/473
+f 167/708/471 519/406/472 521/402/475
+f 522/401/477 520/405/473 170/712/477
+f 523/398/478 171/713/478 521/402/475
+f 170/712/477 172/715/481 524/397/479
+f 171/713/478 523/398/478 525/394/480
+f 172/715/481 174/717/482 526/393/482
+f 173/714/480 525/394/480 527/391/483
+f 528/390/484 526/393/482 176/718/484
+f 175/716/483 527/391/483 529/387/485
+f 530/386/486 528/390/484 178/720/486
+f 531/383/487 179/721/487 529/387/485
+f 532/382/488 530/386/486 180/722/488
+f 533/379/489 181/723/489 531/383/487
+f 534/378/490 532/382/488 182/724/490
+f 535/375/491 183/725/491 533/379/489
+f 536/374/492 534/378/490 184/726/492
+f 537/372/493 185/727/493 535/375/491
+f 538/371/494 536/374/492 186/728/494
+f 539/368/495 187/729/495 537/372/493
+f 540/367/496 538/371/494 188/730/496
+f 541/365/497 189/731/497 539/368/495
+f 542/364/498 540/367/496 190/732/498
+f 543/361/499 191/733/499 541/365/497
+f 544/360/500 542/364/498 192/734/500
+f 545/357/501 193/735/501 543/361/499
+f 546/356/502 544/360/500 194/736/502
+f 547/353/503 195/737/503 545/357/501
+f 194/736/502 196/739/504 548/352/504
+f 195/737/503 547/353/503 549/350/505
+f 550/349/506 548/352/504 198/740/506
+f 197/738/505 549/350/505 551/346/508
+f 552/345/509 550/349/506 200/742/509
+f 553/342/510 201/743/510 551/346/508
+f 200/742/509 202/745/511 554/341/511
+f 201/743/510 553/342/510 555/338/512
+f 202/745/511 204/747/513 556/337/513
+f 203/744/512 555/338/512 557/334/514
+f 204/747/513 206/749/515 558/333/515
+f 205/746/514 557/334/514 559/331/516
+f 206/749/515 208/751/517 560/330/517
+f 207/748/516 559/331/516 561/327/518
+f 208/751/517 210/753/519 562/326/519
+f 209/750/518 561/327/518 563/323/520
+f 210/753/519 212/755/521 564/321/521
+f 211/752/520 563/323/520 565/318/522
+f 212/755/521 214/786/523 566/322/523
+f 213/754/522 565/318/522 567/317/525
+f 214/757/523 216/760/526 568/312/526
+f 215/759/524 567/313/525 569/309/527
+f 216/760/526 218/762/528 570/308/528
+f 217/758/527 569/309/527 571/305/529
+f 218/762/528 220/764/530 572/304/530
+f 219/761/529 571/305/529 573/301/531
+f 220/764/530 222/766/532 574/300/532
+f 221/763/531 573/301/531 575/297/533
+f 222/766/532 224/768/534 576/295/534
+f 223/765/533 575/297/533 577/292/535
+f 224/768/534 162/704/466 514/414/466
+f 225/767/535 577/292/535 516/291/469
+f 578/296/536 579/412/537 228/702/537
+f 230/700/538 580/411/538 231/579/539
+f 898/770/541 962/767/541 901/706/540
+f 897/771/542 835/842/543 899/704/543
+f 234/699/544 228/702/537 582/408/544
+f 236/696/545 583/407/545 230/700/538
+f 896/772/546 960/765/546 962/767/541
+f 895/773/548 897/771/542 961/768/542
+f 582/408/544 584/404/549 238/695/549
+f 583/407/545 236/696/545 240/692/550
+f 894/774/551 958/763/551 960/765/546
+f 893/775/552 895/773/548 959/766/547
+f 584/404/549 586/400/553 242/691/553
+f 585/403/550 240/692/550 244/688/554
+f 892/777/555 956/761/555 958/763/551
+f 891/778/556 893/775/552 957/764/552
+f 246/687/557 242/691/553 588/396/557
+f 248/684/558 589/399/558 244/688/554
+f 890/779/559 954/758/559 956/761/555
+f 889/780/560 891/778/556 955/762/556
+f 588/396/557 590/392/561 250/683/561
+f 589/399/558 248/684/558 252/680/562
+f 888/781/563 952/759/563 954/758/559
+f 887/782/564 889/780/560 953/760/560
+f 590/392/561 592/389/565 254/679/565
+f 591/395/562 252/680/562 256/676/566
+f 886/784/567 950/754/567 952/756/563
+f 885/785/568 887/959/564 951/786/564
+f 592/389/565 594/385/569 258/675/569
+f 593/388/566 256/676/566 260/672/570
+f 884/787/571 948/752/571 950/754/567
+f 883/788/572 885/785/568 949/755/568
+f 262/671/573 258/675/569 596/381/573
+f 264/669/574 597/789/574 260/672/570
+f 882/790/575 946/750/575 948/752/571
+f 881/791/576 883/788/572 947/753/572
+f 596/381/573 598/377/577 266/668/577
+f 268/665/578 599/380/578 264/669/574
+f 880/792/579 944/748/579 946/750/575
+f 879/793/580 881/791/576 945/751/576
+f 598/377/577 600/373/581 270/664/581
+f 272/661/582 601/376/582 268/665/578
+f 878/794/583 942/746/583 944/748/579
+f 877/795/584 879/793/580 943/749/580
+f 274/660/585 270/664/581 602/370/585
+f 276/658/586 603/369/586 272/661/582
+f 876/796/587 940/744/587 942/746/583
+f 875/797/588 877/795/584 941/747/584
+f 278/657/589 274/660/585 604/366/589
+f 280/654/590 605/798/590 276/658/586
+f 874/799/591 938/743/591 940/744/587
+f 873/800/592 875/797/588 939/745/588
+f 282/653/593 278/657/589 606/363/593
+f 284/650/594 607/362/594 280/654/590
+f 872/801/595 936/741/595 938/743/591
+f 871/802/596 873/800/592 937/742/592
+f 606/363/593 608/359/597 286/649/597
+f 607/362/594 284/650/594 288/646/598
+f 870/803/599 934/738/599 936/741/595
+f 869/804/600 871/802/596 935/740/596
+f 608/359/597 610/355/601 290/645/601
+f 609/358/598 288/646/598 292/642/602
+f 868/805/603 932/737/603 934/738/599
+f 867/806/604 869/804/600 933/739/600
+f 610/355/601 612/351/605 294/641/605
+f 611/354/602 292/642/602 296/638/606
+f 932/737/603 868/805/603 930/735/607
+f 931/736/604 929/734/608 867/806/604
+f 612/351/605 614/348/609 298/637/609
+f 613/807/606 296/638/606 300/634/610
+f 930/735/607 866/808/607 928/733/611
+f 929/734/608 927/732/612 865/809/608
+f 614/348/609 616/344/613 302/633/613
+f 615/347/610 300/634/610 304/631/614
+f 928/733/611 864/810/611 926/731/615
+f 927/732/612 925/730/616 863/811/612
+f 616/344/613 618/340/617 306/630/617
+f 617/812/614 304/631/614 308/627/618
+f 926/731/615 862/813/615 924/729/619
+f 925/730/616 923/728/620 861/814/616
+f 618/340/617 620/336/621 310/626/621
+f 619/343/618 308/627/618 312/623/622
+f 924/729/619 860/815/619 922/727/623
+f 857/818/624 859/816/620 923/728/620
+f 620/336/621 622/332/625 314/622/625
+f 621/339/622 312/623/622 316/619/626
+f 856/819/627 920/725/627 922/727/623
+f 855/820/628 857/818/624 921/726/624
+f 622/332/625 624/329/629 318/618/629
+f 623/335/626 316/619/626 320/615/630
+f 854/821/631 918/723/631 920/725/627
+f 853/822/632 855/820/628 919/724/628
+f 624/329/629 626/325/633 322/614/633
+f 625/328/630 320/615/630 324/611/634
+f 852/824/635 916/721/635 918/723/631
+f 851/825/636 853/822/632 917/722/632
+f 626/325/633 628/320/637 326/609/637
+f 627/823/634 324/611/634 328/606/638
+f 850/826/639 914/719/639 916/721/635
+f 849/827/640 851/825/636 915/720/636
+f 330/953/641 326/609/637 630/828/641
+f 629/324/638 328/606/638 332/605/642
+f 848/829/643 912/716/643 914/719/639
+f 847/830/644 849/827/640 913/718/640
+f 334/600/645 330/604/641 632/311/645
+f 631/314/642 332/601/642 336/597/646
+f 846/832/647 910/714/647 912/716/643
+f 845/833/648 847/830/644 911/717/644
+f 632/311/645 634/307/649 338/596/649
+f 633/831/646 336/597/646 340/593/650
+f 844/834/651 908/713/651 910/714/647
+f 843/835/652 845/833/648 909/715/648
+f 634/307/649 636/303/653 342/592/653
+f 635/310/650 340/593/650 344/589/654
+f 842/836/655 906/710/655 908/713/651
+f 841/837/656 843/835/652 907/712/652
+f 636/303/653 638/299/657 346/588/657
+f 637/306/654 344/589/654 348/585/658
+f 840/838/659 904/708/659 906/710/655
+f 839/839/660 841/837/656 905/711/656
+f 638/299/657 640/294/661 350/583/661
+f 639/302/658 348/585/658 352/580/662
+f 838/840/663 902/705/663 904/708/659
+f 836/841/664 839/839/660 903/709/660
+f 640/294/661 578/296/536 227/703/536
+f 641/298/662 352/580/662 231/579/539
+f 837/769/540 901/706/540 902/705/663
+f 835/842/543 836/841/664 900/707/664
+f 643/160/666 642/161/665 229/701/666
+f 645/157/667 233/843/667 644/35/668
+f 646/156/669 643/160/666 235/698/669
+f 647/153/670 237/845/670 645/157/667
+f 648/152/671 646/156/669 239/694/671
+f 649/149/672 241/846/672 647/153/670
+f 239/694/671 243/690/673 650/148/673
+f 241/846/672 649/149/672 651/145/674
+f 652/144/675 650/148/673 247/686/675
+f 653/141/676 249/848/676 651/145/674
+f 654/140/677 652/144/675 251/682/677
+f 655/137/678 253/849/678 653/141/676
+f 251/682/677 255/678/679 656/136/679
+f 253/849/678 655/137/678 657/134/680
+f 658/133/681 656/136/679 259/674/681
+f 257/850/680 657/134/680 659/130/682
+f 660/129/683 658/133/681 263/670/683
+f 661/126/684 265/852/684 659/130/682
+f 662/125/685 660/129/683 267/667/685
+f 663/122/689 269/853/686 661/126/684
+f 664/121/687 662/125/685 271/663/687
+f 665/118/688 273/854/688 663/122/689
+f 271/663/687 275/659/690 666/117/690
+f 273/854/688 665/118/688 667/114/691
+f 275/659/690 279/656/692 668/113/692
+f 277/855/691 667/114/691 669/110/693
+f 670/109/694 668/113/692 283/652/694
+f 671/106/695 285/857/695 669/110/693
+f 283/652/694 287/648/696 672/105/696
+f 285/857/695 671/106/695 673/102/697
+f 287/648/696 291/644/698 674/101/698
+f 289/858/697 673/102/697 675/98/699
+f 291/644/698 295/640/700 676/97/700
+f 293/859/699 675/98/699 677/94/701
+f 295/640/700 299/636/702 678/93/702
+f 297/860/701 677/94/701 679/91/703
+f 680/90/704 678/93/702 303/632/704
+f 681/87/705 305/862/705 679/91/703
+f 303/632/704 307/629/706 682/86/706
+f 305/862/705 681/87/705 683/83/707
+f 307/629/706 311/625/708 684/82/708
+f 309/863/707 683/83/707 685/79/709
+f 686/78/710 684/82/708 315/621/710
+f 687/75/714 317/865/711 685/79/709
+f 688/74/712 686/78/710 319/617/712
+f 689/71/713 321/866/713 687/75/714
+f 319/617/712 323/613/715 690/70/715
+f 321/866/713 689/71/713 691/67/716
+f 323/613/715 327/608/717 692/65/717
+f 325/867/716 691/67/716 693/62/718
+f 327/608/717 331/610/719 694/869/719
+f 329/868/718 693/62/718 695/61/720
+f 331/603/719 335/599/721 696/56/721
+f 333/872/720 695/57/720 697/53/722
+f 335/599/721 339/595/723 698/52/723
+f 337/871/722 697/53/722 699/49/724
+f 339/595/723 343/591/725 700/48/725
+f 341/873/724 699/49/724 701/45/726
+f 343/591/725 347/587/727 702/44/727
+f 345/874/726 701/45/726 703/41/728
+f 347/587/727 351/582/729 704/39/729
+f 349/875/728 703/41/728 705/36/730
+f 351/582/729 226/584/665 642/161/665
+f 353/876/730 705/36/730 644/35/668
+f 356/880/732 355/877/731 707/159/732
+f 358/576/733 708/158/733 359/513/734
+f 413/166/736 511/2/736 419/1/735
+f 415/163/737 833/289/738 421/879/738
+f 362/882/739 356/880/732 710/155/739
+f 364/574/740 711/154/740 358/576/733
+f 423/4/741 832/283/741 834/287/735
+f 425/881/742 421/879/738 833/289/738
+f 710/155/739 712/151/748 366/883/743
+f 711/154/740 364/574/740 368/572/745
+f 427/5/746 830/279/746 832/283/741
+f 429/884/747 425/881/742 831/285/742
+f 370/886/749 366/883/743 714/147/749
+f 372/570/750 715/146/750 368/572/745
+f 431/6/751 828/275/751 830/279/746
+f 433/885/752 429/884/747 829/281/747
+f 374/888/753 370/886/749 716/143/753
+f 376/568/754 717/142/754 372/570/750
+f 435/7/755 826/270/755 828/275/751
+f 437/887/756 433/885/752 827/277/752
+f 378/890/757 374/888/753 718/139/757
+f 380/566/758 719/138/758 376/568/754
+f 439/8/759 824/271/765 826/270/755
+f 441/889/761 437/887/756 825/273/756
+f 718/139/757 720/135/762 382/891/762
+f 384/564/763 721/892/763 380/566/758
+f 443/9/764 822/261/764 824/265/765
+f 445/893/766 441/948/761 823/894/760
+f 386/896/767 382/891/762 722/132/767
+f 721/892/763 384/564/763 388/562/768
+f 447/11/769 820/257/769 822/261/764
+f 449/895/771 445/893/766 821/263/766
+f 722/132/767 724/128/772 390/897/772
+f 723/131/768 388/562/768 392/560/773
+f 451/12/774 818/253/774 820/257/769
+f 453/898/775 449/895/771 819/259/770
+f 394/900/776 390/897/772 726/124/776
+f 396/558/777 727/123/777 392/560/773
+f 455/13/778 816/249/778 818/253/774
+f 457/899/779 453/898/775 817/255/775
+f 726/124/776 728/120/780 398/901/780
+f 727/123/777 396/558/777 400/556/781
+f 459/14/782 814/245/782 816/249/778
+f 461/902/783 457/899/779 815/251/779
+f 728/120/780 730/116/784 402/903/784
+f 729/119/781 400/556/781 404/554/785
+f 463/15/786 812/241/786 814/245/782
+f 465/904/787 461/902/783 813/247/783
+f 406/906/788 402/903/784 732/112/788
+f 408/552/789 733/111/789 404/554/785
+f 467/16/790 810/237/790 812/241/786
+f 469/905/791 465/904/787 811/243/787
+f 410/908/792 406/906/788 734/108/792
+f 412/550/793 735/107/793 408/552/789
+f 471/17/794 808/233/794 810/237/790
+f 473/907/795 469/905/791 809/239/791
+f 734/108/792 736/104/796 414/909/796
+f 735/107/793 412/550/793 416/548/797
+f 475/18/798 806/229/798 808/233/794
+f 477/910/799 473/907/795 807/235/795
+f 418/913/800 414/909/796 738/100/800
+f 737/103/797 416/548/797 420/546/801
+f 479/19/802 804/225/901 806/229/798
+f 481/912/804 477/910/799 805/231/799
+f 738/100/800 740/96/805 422/914/805
+f 739/911/801 420/546/801 424/544/806
+f 804/225/901 479/19/802 354/222/807
+f 803/224/803 357/221/808 481/912/804
+f 740/96/805 742/92/809 426/916/809
+f 741/99/806 424/544/806 428/542/810
+f 354/222/807 482/20/807 360/218/811
+f 357/221/808 361/220/812 483/915/808
+f 742/92/809 744/89/814 430/918/814
+f 743/95/810 428/542/810 432/540/815
+f 360/218/811 484/21/811 363/214/816
+f 361/220/812 365/216/817 485/917/813
+f 744/89/814 746/85/818 434/920/818
+f 745/88/815 432/540/815 436/538/819
+f 363/214/816 486/22/816 367/210/820
+f 365/216/817 369/212/821 487/919/817
+f 746/85/818 748/81/822 438/923/822
+f 747/921/819 436/538/819 440/536/823
+f 490/24/824 371/206/824 367/210/820
+f 491/924/825 489/922/821 369/212/821
+f 748/81/822 750/77/826 442/925/826
+f 749/84/823 440/536/823 444/534/827
+f 492/25/828 375/202/828 371/206/824
+f 493/926/829 491/924/825 373/208/825
+f 750/77/826 752/73/830 446/927/830
+f 751/80/827 444/534/827 448/532/831
+f 494/26/832 379/198/832 375/202/828
+f 495/928/833 493/926/829 377/204/829
+f 752/73/830 754/69/834 450/929/834
+f 452/530/835 755/72/835 448/532/831
+f 496/27/836 383/194/836 379/198/832
+f 497/930/837 495/928/833 381/200/833
+f 754/69/834 756/64/838 454/931/838
+f 755/72/835 452/530/835 456/527/839
+f 498/28/840 387/190/840 383/194/836
+f 499/932/841 497/930/837 385/196/837
+f 756/64/838 758/66/842 458/933/842
+f 757/68/839 456/527/839 460/526/843
+f 500/29/844 391/186/844 387/190/840
+f 501/934/845 499/932/841 389/192/841
+f 758/59/842 760/55/846 462/936/846
+f 759/937/843 460/524/843 464/522/847
+f 502/30/848 395/182/848 391/186/844
+f 503/938/849 501/934/845 393/188/845
+f 466/940/850 462/936/846 762/51/850
+f 468/520/851 763/54/851 464/522/847
+f 504/31/852 399/178/852 395/182/848
+f 505/939/853 503/938/849 397/184/849
+f 762/51/850 764/47/854 470/941/854
+f 763/54/851 468/520/851 472/518/855
+f 506/32/856 403/174/856 399/178/852
+f 507/942/857 505/939/853 401/180/853
+f 764/47/854 766/43/858 474/943/858
+f 765/50/855 472/518/855 476/516/859
+f 508/33/860 407/170/860 403/174/856
+f 509/944/861 507/942/857 405/176/857
+f 766/43/858 768/38/862 478/945/862
+f 767/46/859 476/516/859 480/514/863
+f 510/34/864 411/165/864 407/170/860
+f 513/946/865 509/944/861 409/172/861
+f 768/38/862 706/40/731 355/877/731
+f 769/42/863 480/514/863 359/513/734
+f 511/2/736 413/166/736 411/165/864
+f 417/168/865 415/163/737 512/878/737
diff --git a/08-august/resources/boulder.obj b/08-august/resources/boulder.obj
new file mode 100644
index 0000000..d993ab0
--- /dev/null
+++ b/08-august/resources/boulder.obj
@@ -0,0 +1,1166 @@
+# Blender v2.67 (sub 0) OBJ File: ''
+# www.blender.org
+o Stone_F_3_LOD1
+v -1.916053 -3.630385 1.916053
+v -1.774122 -3.027584 2.466601
+v -2.670772 -3.076572 2.670771
+v -2.880061 -3.357386 2.038919
+v -1.936080 -2.197929 3.002565
+v -3.134844 -2.311625 3.134844
+v -4.026964 -2.620021 2.510522
+v -0.000000 -3.674069 1.907996
+v -0.000001 -3.221349 2.570857
+v -0.910614 -3.116154 2.475319
+v -0.941118 -3.450117 1.768421
+v -0.000000 -2.443571 3.211287
+v -1.037349 -2.350119 3.086367
+v 2.189848 -4.043650 2.189848
+v 2.041765 -3.360931 2.884505
+v 1.027460 -3.437876 2.868851
+v 1.142183 -4.159623 2.218114
+v 2.289629 -2.457712 3.633047
+v 1.177833 -2.584327 3.647763
+v 3.304351 -2.322276 2.105309
+v 3.055634 -2.274841 3.055635
+v 2.832890 -3.202250 2.832890
+v 2.967863 -3.427424 2.095152
+v -4.100050 -2.773015 1.291013
+v -3.162618 -3.678038 1.114685
+v -4.794678 -3.102422 -0.000001
+v -3.473299 -3.967102 -0.000000
+v -2.551345 -4.711632 -0.000001
+v -1.974967 -3.775994 1.033467
+v -1.342576 -4.863437 -0.000001
+v -1.090065 -3.866515 1.090065
+v 0.000000 -4.587823 -0.000001
+v -0.000000 -3.907883 1.104650
+v 1.234499 -4.429379 -0.000001
+v 1.226352 -4.398590 1.226351
+v 2.211653 -4.163794 -0.000001
+v 2.083042 -3.946513 1.081790
+v 3.006132 -3.581049 -0.000000
+v 3.007863 -3.551523 1.068736
+v 3.679332 -2.638325 -0.000000
+v 3.523236 -2.532375 1.146671
+v -4.663065 -3.007899 -1.431903
+v -3.589066 -4.026671 -1.241307
+v -4.159923 -2.674804 -2.585081
+v -3.551812 -3.893219 -2.469140
+v -2.687516 -4.794826 -2.687517
+v -2.763435 -5.020007 -1.386008
+v -1.328313 -4.816418 -2.634399
+v -1.496500 -5.453263 -1.496500
+v 0.000000 -4.501268 -2.420907
+v 0.000000 -4.898719 -1.351362
+v 1.159430 -4.220480 -2.256687
+v 1.267391 -4.558809 -1.267393
+v 1.970464 -3.712511 -1.970464
+v 2.167963 -4.080496 -1.119761
+v 2.618176 -3.148489 -1.871197
+v 2.672010 -3.276953 -0.969015
+v 3.104623 -2.239979 -1.993309
+v 3.093093 -2.352924 -1.039033
+v -3.271620 -2.375141 -3.271621
+v -3.320482 -3.580238 -3.320482
+v -2.344594 -2.498099 -3.731067
+v -2.480156 -3.906940 -3.569014
+v -1.215784 -2.647596 -3.799423
+v -1.207849 -3.934551 -3.476385
+v -0.000000 -2.691176 -3.806350
+v -0.000000 -3.634715 -3.071074
+v 1.148567 -2.535534 -3.530811
+v 1.072443 -3.561728 -3.020347
+v 1.985007 -2.233879 -3.089818
+v 1.858490 -3.132663 -2.598335
+v 2.717236 -2.117692 -2.717235
+v 2.507789 -2.950224 -2.507790
+v -2.005798 9.496864 2.005800
+v -3.590262 8.179170 2.492548
+v -3.380737 7.519215 3.380738
+v -2.462314 8.161996 3.542846
+v -4.511351 6.086253 2.772030
+v -3.652474 5.791484 3.652474
+v -2.421854 5.937723 3.872226
+v -1.308723 6.299657 4.175407
+v -1.229926 8.693329 3.553876
+v 0.000000 6.357834 3.991156
+v -0.000000 8.888184 3.504623
+v -0.000000 10.985978 2.328364
+v -1.155102 10.614158 2.245318
+v 1.230484 6.227292 3.851398
+v 1.186444 8.642007 3.404518
+v 2.165694 5.829069 3.404693
+v 1.930707 7.860015 2.709054
+v 1.953033 9.466584 1.953035
+v 1.252909 10.735368 2.465424
+v 2.956054 5.601676 2.956056
+v 2.766640 7.284450 2.766641
+v 3.563187 5.865902 2.252534
+v 2.906995 7.931705 2.056913
+v -2.293816 10.966983 0.000003
+v -3.173147 8.776424 0.000002
+v -3.295717 8.604621 1.154773
+v -2.065859 10.515332 1.075361
+v -4.073105 6.375723 0.000002
+v -4.593215 6.392972 1.409615
+v 0.000000 12.931432 1.591478
+v -1.466942 12.358363 1.466945
+v 0.000000 14.342896 0.000003
+v -1.744971 13.135221 0.000003
+v 2.607131 10.813407 1.315883
+v 1.768368 12.748035 1.768370
+v 2.827488 11.260423 0.000003
+v 1.769937 13.168368 0.000003
+v 4.311605 6.330076 1.341613
+v 3.477753 8.667175 1.207767
+v 4.659688 6.503766 0.000001
+v 4.288108 9.152349 0.000002
+v -2.503155 9.782269 -2.503151
+v -3.235073 8.050528 -2.266084
+v -3.712446 8.747819 -1.276088
+v -2.615859 10.818212 -1.319756
+v -3.263525 5.796263 -2.088347
+v -3.572301 6.164958 -1.163087
+v 0.000000 13.100103 -1.718517
+v -1.421705 12.299883 -1.421703
+v -0.000000 11.043085 -2.432215
+v -1.228719 10.705389 -2.410980
+v 3.120996 11.096388 -1.544221
+v 1.537507 12.449586 -1.537504
+v 2.442287 9.747341 -2.442284
+v 1.356366 10.863578 -2.698236
+v 4.522304 6.377136 -1.392488
+v 3.878502 8.804877 -1.324430
+v 4.313411 6.040253 -2.663577
+v 3.142899 8.017145 -2.207316
+v -2.177104 5.833910 -3.425515
+v -2.826335 5.566323 -2.826334
+v -2.762691 7.282940 -2.762690
+v -2.144224 7.981304 -3.043936
+v -0.000000 8.739096 -3.062430
+v -1.007499 8.430799 -2.789842
+v -0.000000 6.296713 -3.711135
+v -1.225290 6.222490 -3.829889
+v 2.130118 7.973291 -3.021813
+v 1.125967 8.570626 -3.196775
+v 2.421118 5.937411 -3.870881
+v 1.229298 6.226196 -3.846483
+v 3.251200 5.682119 -3.251198
+v 2.773384 7.287028 -2.773382
+v -2.803517 1.172553 4.560723
+v -4.072896 1.193099 4.072896
+v -3.810574 -0.853687 3.810574
+v -2.316849 -0.871623 3.679116
+v -4.973468 1.171004 3.029232
+v -4.800019 -1.058370 2.939719
+v 0.000000 -1.099875 4.005143
+v -1.190453 -0.998273 3.550861
+v 0.000000 1.129720 4.907054
+v -1.413840 1.141560 4.500068
+v 2.591413 -0.953942 4.173216
+v 1.382793 -1.128851 4.372849
+v 2.610734 1.173876 4.208201
+v 1.453762 1.140962 4.675025
+v 3.735243 -0.880974 2.348038
+v 3.405689 -0.774173 3.405690
+v 4.223934 1.173818 2.619340
+v 3.587192 1.195416 3.587193
+v 4.064046 -1.109102 -0.000000
+v 4.089301 -1.083807 1.316444
+v 4.884167 1.129800 0.000000
+v 4.599715 1.141221 1.436578
+v 3.222341 -0.795522 -2.063025
+v 3.629696 -1.010794 -1.208900
+v 3.675643 1.175878 -2.319497
+v 4.617282 1.141162 -1.440586
+v 2.188590 -0.833168 -3.448305
+v 3.033731 -0.701124 -3.033731
+v 2.342211 1.175721 -3.717174
+v 2.957400 1.198425 -2.957399
+v -0.000000 -1.112108 -4.083237
+v 1.210952 -1.012188 -3.638467
+v 0.000000 1.131142 -4.493519
+v 1.420941 1.141456 -4.531190
+v -2.531963 -0.936117 -4.066232
+v -1.350453 -1.106895 -4.234642
+v -2.438426 1.175060 -3.893116
+v -1.321748 1.142939 -4.096478
+v -4.373033 -0.987231 -2.702449
+v -3.401402 -0.773330 -3.401402
+v -4.108176 1.174253 -2.556035
+v -3.267244 1.196945 -3.267243
+v -5.179070 -1.283801 -0.000000
+v -5.014218 -1.230736 -1.532869
+v -4.908771 1.129714 0.000000
+v -4.476716 1.141640 -1.408511
+v -5.012662 -1.230490 1.532505
+v -5.091325 1.139543 1.548753
+v -3.808316 3.487754 3.808316
+v -2.439959 3.528414 3.898350
+v -4.997580 3.657859 3.041126
+v 0.000000 3.739314 4.247563
+v -1.318340 3.679163 4.090331
+v 2.382792 3.516103 3.793822
+v 1.408322 3.721921 4.482589
+v 4.135642 3.556357 2.569734
+v 3.097726 3.386422 3.097728
+v 4.998064 3.819278 0.000001
+v 4.776843 3.754000 1.475823
+v 4.040967 3.545209 -2.517955
+v 4.724630 3.748308 -1.463844
+v 2.807437 3.607542 -4.570280
+v 3.704641 3.472973 -3.704640
+v 0.000000 3.827823 -5.078245
+v 1.574307 3.800802 -5.206170
+v -2.411557 3.522299 -3.846417
+v -1.382326 3.709572 -4.369264
+v -3.778896 3.514346 -2.374629
+v -3.181887 3.398424 -3.181885
+v -4.749122 3.792755 0.000001
+v -4.114111 3.681755 -1.323795
+v -5.002842 3.778636 1.527665
+vt 0.797339 0.944145
+vt 0.804120 0.966415
+vt 0.775228 0.971191
+vt 0.768051 0.940817
+vt 0.422888 0.065050
+vt 0.383434 0.064168
+vt 0.402450 0.020161
+vt 0.429948 0.026777
+vt 0.257977 0.578822
+vt 0.235327 0.535789
+vt 0.260305 0.556510
+vt 0.286825 0.597852
+vt 0.868575 0.933450
+vt 0.869041 0.966379
+vt 0.833013 0.961638
+vt 0.830821 0.937582
+vt 0.495428 0.075056
+vt 0.456415 0.072415
+vt 0.457447 0.033394
+vt 0.493201 0.028334
+vt 0.939813 0.935370
+vt 0.936916 0.969799
+vt 0.905070 0.971120
+vt 0.907106 0.936102
+vt 0.573069 0.075613
+vt 0.535550 0.072684
+vt 0.528954 0.023273
+vt 0.561137 0.031201
+vt 0.090160 0.107872
+vt 0.063747 0.128539
+vt 0.069596 0.084592
+vt 0.097015 0.068436
+vt 0.593320 0.039128
+vt 0.608480 0.081300
+vt 0.973915 0.936855
+vt 0.968762 0.968478
+vt 0.214713 0.568420
+vt 0.210350 0.515068
+vt 0.167865 0.563608
+vt 0.168226 0.513264
+vt 0.790595 0.859556
+vt 0.793292 0.906310
+vt 0.760874 0.910443
+vt 0.750848 0.869319
+vt 0.827836 0.856132
+vt 0.828821 0.905081
+vt 0.876622 0.859115
+vt 0.871131 0.902032
+vt 0.918550 0.858530
+vt 0.912326 0.901152
+vt 0.953722 0.863400
+vt 0.946893 0.902118
+vt 0.984940 0.869601
+vt 0.979069 0.905233
+vt 0.162604 0.092283
+vt 0.123316 0.096197
+vt 0.124434 0.052280
+vt 0.158983 0.053156
+vt 0.121568 0.563630
+vt 0.126102 0.511460
+vt 0.078655 0.566826
+vt 0.088695 0.518678
+vt 0.789188 0.771322
+vt 0.785093 0.813459
+vt 0.740822 0.828196
+vt 0.753964 0.790730
+vt 0.828732 0.760798
+vt 0.826181 0.804495
+vt 0.873975 0.766916
+vt 0.874812 0.806982
+vt 0.917559 0.775060
+vt 0.921512 0.813321
+vt 0.952239 0.788599
+vt 0.956415 0.823276
+vt 0.981081 0.803700
+vt 0.990812 0.833968
+vt 0.235979 0.103874
+vt 0.201099 0.095616
+vt 0.193532 0.054031
+vt 0.221693 0.063423
+vt 0.038063 0.574365
+vt 0.051287 0.525896
+vt 0.903723 0.086395
+vt 0.894349 0.038473
+vt 0.932327 0.049517
+vt 0.945079 0.095636
+vt 0.767106 0.753264
+vt 0.799552 0.731727
+vt 0.863290 0.079378
+vt 0.856371 0.027430
+vt 0.818669 0.079787
+vt 0.815857 0.031760
+vt 0.831999 0.710190
+vt 0.873567 0.723891
+vt 0.776948 0.081185
+vt 0.775343 0.036090
+vt 0.743123 0.088464
+vt 0.748433 0.047734
+vt 0.915136 0.737591
+vt 0.943243 0.755512
+vt 0.711946 0.100207
+vt 0.721523 0.059378
+vt 0.249854 0.072815
+vt 0.266958 0.112009
+vt 0.971350 0.773432
+vt 0.426501 0.603057
+vt 0.360164 0.613281
+vt 0.393511 0.564802
+vt 0.440592 0.533787
+vt 0.256747 0.867553
+vt 0.297094 0.852586
+vt 0.285803 0.924722
+vt 0.250719 0.946916
+vt 0.428991 0.351112
+vt 0.429726 0.440163
+vt 0.395758 0.416066
+vt 0.392779 0.334441
+vt 0.463107 0.372691
+vt 0.463693 0.464260
+vt 0.505663 0.381250
+vt 0.504535 0.466408
+vt 0.531460 0.577419
+vt 0.480976 0.586585
+vt 0.487672 0.502771
+vt 0.526176 0.497042
+vt 0.546210 0.375491
+vt 0.545376 0.468556
+vt 0.580439 0.359668
+vt 0.573995 0.439243
+vt 0.646015 0.586775
+vt 0.582642 0.576519
+vt 0.564680 0.491312
+vt 0.616448 0.528277
+vt 0.610246 0.338821
+vt 0.602613 0.409930
+vt 0.073129 0.385810
+vt 0.080100 0.463825
+vt 0.045638 0.444300
+vt 0.035510 0.375775
+vt 0.668215 0.565243
+vt 0.708230 0.612168
+vt 0.404051 0.710343
+vt 0.325279 0.719950
+vt 0.326818 0.661759
+vt 0.408910 0.659563
+vt 0.169462 0.878169
+vt 0.215740 0.876665
+vt 0.215635 0.969111
+vt 0.170496 0.966680
+vt 0.533778 0.651832
+vt 0.476508 0.657429
+vt 0.536965 0.716245
+vt 0.475245 0.715405
+vt 0.662700 0.653083
+vt 0.592028 0.649827
+vt 0.668126 0.715895
+vt 0.597291 0.713027
+vt 0.113686 0.394151
+vt 0.114562 0.483349
+vt 0.159479 0.399822
+vt 0.156150 0.487401
+vt 0.748245 0.659094
+vt 0.747608 0.713054
+vt 0.423973 0.844689
+vt 0.359536 0.821095
+vt 0.323740 0.778140
+vt 0.408364 0.776278
+vt 0.082734 0.854822
+vt 0.121890 0.870961
+vt 0.125358 0.964250
+vt 0.095909 0.931223
+vt 0.537687 0.778158
+vt 0.478524 0.776761
+vt 0.536431 0.855051
+vt 0.486341 0.852328
+vt 0.667025 0.770922
+vt 0.597687 0.774520
+vt 0.657343 0.831384
+vt 0.591744 0.848574
+vt 0.206986 0.397387
+vt 0.197738 0.491453
+vt 0.248991 0.385898
+vt 0.234718 0.466345
+vt 0.746971 0.767013
+vt 0.721810 0.818949
+vt 0.906267 0.374916
+vt 0.943591 0.356444
+vt 0.921225 0.425752
+vt 0.891900 0.456772
+vt 0.066459 0.898197
+vt 0.050905 0.830371
+vt 0.449299 0.900840
+vt 0.395331 0.864049
+vt 0.540406 0.938048
+vt 0.503267 0.937631
+vt 0.822147 0.398397
+vt 0.869902 0.391997
+vt 0.862575 0.487791
+vt 0.824985 0.490413
+vt 0.637097 0.904675
+vt 0.577545 0.938465
+vt 0.732077 0.382093
+vt 0.777205 0.395704
+vt 0.787394 0.493034
+vt 0.753838 0.462566
+vt 0.295740 0.370352
+vt 0.271698 0.441237
+vt 0.720281 0.432098
+vt 0.695460 0.360706
+vt 0.696649 0.870884
+vt 0.409030 0.191850
+vt 0.377109 0.180495
+vt 0.364418 0.108175
+vt 0.411558 0.120309
+vt 0.265442 0.707502
+vt 0.264856 0.635425
+vt 0.313344 0.639194
+vt 0.310865 0.709823
+vt 0.497926 0.128083
+vt 0.453570 0.125115
+vt 0.501630 0.204324
+vt 0.453659 0.201619
+vt 0.580806 0.129330
+vt 0.541362 0.127952
+vt 0.581765 0.201442
+vt 0.545377 0.203762
+vt 0.086825 0.160901
+vt 0.057897 0.172487
+vt 0.083178 0.230889
+vt 0.041640 0.239869
+vt 0.623639 0.123471
+vt 0.620759 0.195592
+vt 0.164962 0.144820
+vt 0.121137 0.147854
+vt 0.168900 0.222365
+vt 0.118928 0.223308
+vt 0.249711 0.153161
+vt 0.210390 0.146614
+vt 0.266525 0.225290
+vt 0.217360 0.223077
+vt 0.737780 0.141296
+vt 0.702370 0.141035
+vt 0.734967 0.215285
+vt 0.686504 0.215174
+vt 0.284062 0.151204
+vt 0.301922 0.225335
+vt 0.823341 0.134433
+vt 0.776129 0.134848
+vt 0.829638 0.213642
+vt 0.775617 0.214655
+vt 0.914218 0.141785
+vt 0.871317 0.136315
+vt 0.920921 0.215088
+vt 0.878394 0.214879
+vt 0.071189 0.624477
+vt 0.024838 0.622835
+vt 0.067612 0.695620
+vt 0.030094 0.692690
+vt 0.957830 0.141755
+vt 0.961894 0.214445
+vt 0.167890 0.623661
+vt 0.117015 0.622349
+vt 0.167384 0.702228
+vt 0.114663 0.699269
+vt 0.218664 0.627111
+vt 0.219151 0.704435
+vt 0.389800 0.252815
+vt 0.420475 0.272480
+vt 0.262923 0.786834
+vt 0.308385 0.780451
+vt 0.503684 0.293051
+vt 0.457704 0.288138
+vt 0.583362 0.280328
+vt 0.547869 0.289580
+vt 0.072315 0.307893
+vt 0.025383 0.307251
+vt 0.617880 0.267713
+vt 0.164422 0.310546
+vt 0.114372 0.308672
+vt 0.264258 0.305758
+vt 0.216355 0.310360
+vt 0.726221 0.298995
+vt 0.670638 0.289313
+vt 0.319782 0.299467
+vt 0.826902 0.307054
+vt 0.773455 0.305823
+vt 0.920441 0.296006
+vt 0.879181 0.303697
+vt 0.073925 0.774898
+vt 0.035350 0.762546
+vt 0.965957 0.287136
+vt 0.166992 0.789707
+vt 0.115901 0.784656
+vt 0.217938 0.790346
+vn -0.000458 -0.893429 0.449171
+vn 0.055300 -0.610248 0.790246
+vn -0.064547 -0.700674 0.710532
+vn -0.277657 -0.861965 0.424146
+vn 0.025117 -0.460402 0.887326
+vn -0.104587 -0.502091 0.858425
+vn -0.608142 -0.647328 0.459395
+vn -0.289193 -0.855617 0.429243
+vn -0.245552 -0.717551 0.651753
+vn -0.101962 -0.740623 0.664083
+vn -0.033235 -0.876217 0.480728
+vn -0.261971 -0.524491 0.810083
+vn -0.156255 -0.494888 0.854762
+vn 0.342174 -0.871334 0.351665
+vn 0.102573 -0.674398 0.731162
+vn -0.173009 -0.675924 0.716330
+vn -0.166478 -0.855678 0.489944
+vn 0.325632 -0.485183 0.811487
+vn -0.139470 -0.545610 0.826319
+vn 0.906308 -0.329997 0.263955
+vn 0.803491 -0.309885 0.508255
+vn 0.626576 -0.546129 0.555956
+vn 0.813562 -0.547014 0.197089
+vn -0.709952 -0.626759 0.321055
+vn -0.382336 -0.828883 0.408338
+vn -0.814814 -0.558031 0.156987
+vn -0.573351 -0.787927 0.224494
+vn -0.352458 -0.828303 0.435469
+vn -0.086520 -0.884274 0.458846
+vn 0.032594 -0.854701 0.518052
+vn -0.024628 -0.854793 0.518357
+vn 0.096988 -0.933134 0.346141
+vn -0.208441 -0.894955 0.394391
+vn 0.194739 -0.978637 0.065432
+vn 0.040742 -0.983490 0.176214
+vn 0.496963 -0.867733 -0.003296
+vn 0.435041 -0.898251 0.061739
+vn 0.696524 -0.688223 -0.202857
+vn 0.717368 -0.689627 0.098910
+vn 0.886502 -0.421735 -0.190344
+vn 0.881283 -0.416364 0.223518
+vn -0.826411 -0.484390 -0.286996
+vn -0.711051 -0.701834 -0.042543
+vn -0.774377 -0.271828 -0.571337
+vn -0.801935 -0.551805 -0.228797
+vn -0.394726 -0.791620 -0.466384
+vn -0.560533 -0.827052 0.041993
+vn 0.144292 -0.793420 -0.591296
+vn 0.031800 -0.997986 -0.054506
+vn 0.282876 -0.783563 -0.553148
+vn 0.309793 -0.948973 -0.058443
+vn 0.424207 -0.766015 -0.482955
+vn 0.356090 -0.923399 -0.143193
+vn 0.601459 -0.666128 -0.440992
+vn 0.680746 -0.688894 -0.248909
+vn 0.763604 -0.608386 -0.216163
+vn 0.790307 -0.543107 -0.283517
+vn 0.901578 -0.336894 -0.271310
+vn 0.865658 -0.401715 -0.298654
+vn -0.525956 -0.037873 -0.849635
+vn -0.607715 -0.305216 -0.733116
+vn -0.258553 -0.158513 -0.952879
+vn -0.160375 -0.420515 -0.892972
+vn -0.052736 -0.259133 -0.964385
+vn 0.141789 -0.503708 -0.852138
+vn 0.178076 -0.333140 -0.925871
+vn 0.234626 -0.590381 -0.772240
+vn 0.389843 -0.265542 -0.881741
+vn 0.369762 -0.569262 -0.734275
+vn 0.453230 -0.309091 -0.836085
+vn 0.466109 -0.544511 -0.697287
+vn 0.662984 -0.315744 -0.678732
+vn 0.584490 -0.535691 -0.609424
+vn -0.662099 0.531449 0.528336
+vn -0.733299 0.610950 0.298227
+vn -0.529954 0.389904 0.753044
+vn -0.349071 0.486038 0.801172
+vn -0.869137 0.273385 0.412061
+vn -0.456679 0.141240 0.878323
+vn -0.212561 0.096683 0.972320
+vn -0.085788 0.121128 0.988891
+vn -0.198065 0.438765 0.876492
+vn 0.081637 0.158208 0.984008
+vn 0.065645 0.357799 0.931455
+vn -0.097903 0.412091 0.905850
+vn -0.416089 0.404096 0.814570
+vn 0.315653 0.213202 0.924589
+vn 0.460677 0.300516 0.835109
+vn 0.524155 0.194861 0.829005
+vn 0.548082 0.347758 0.760674
+vn 0.652943 0.234169 0.720237
+vn 0.362194 0.279733 0.889096
+vn 0.628620 0.117161 0.768822
+vn 0.556627 0.340434 0.757775
+vn 0.712302 0.201483 0.672292
+vn 0.683920 0.373241 0.626820
+vn -0.898923 0.403516 0.170537
+vn -0.919614 0.358196 0.161138
+vn -0.851222 0.520402 0.067568
+vn -0.859615 0.353465 0.368877
+vn -0.932096 0.226386 -0.282693
+vn -0.937284 0.335429 -0.094729
+vn -0.152898 0.584216 0.797021
+vn -0.614521 0.449751 0.648091
+vn -0.052950 0.998535 -0.008454
+vn -0.786981 0.616474 -0.023957
+vn 0.792535 0.242164 0.559618
+vn 0.512070 0.552263 0.657826
+vn 0.866909 0.486557 0.108158
+vn 0.710898 0.693350 -0.117710
+vn 0.835597 0.251198 0.488510
+vn 0.710318 0.302072 0.635731
+vn 0.977508 0.195257 0.079501
+vn 0.917234 0.374706 0.135014
+vn -0.489425 0.345836 -0.800531
+vn -0.781030 0.091250 -0.617756
+vn -0.953734 0.271065 -0.129887
+vn -0.822169 0.540605 -0.178106
+vn -0.879330 0.117069 -0.461562
+vn -0.926145 0.068819 -0.370769
+vn -0.062502 0.631581 -0.772759
+vn -0.601520 0.529069 -0.598498
+vn -0.113804 0.357158 -0.927061
+vn -0.156590 0.351482 -0.923002
+vn 0.763756 0.503464 -0.403912
+vn 0.493301 0.608905 -0.621174
+vn 0.522629 0.231819 -0.820399
+vn 0.212256 0.401868 -0.890744
+vn 0.971954 0.173315 -0.158757
+vn 0.830042 0.298166 -0.471236
+vn 0.766472 0.227760 -0.600513
+vn 0.579852 0.306223 -0.754936
+vn -0.545152 0.209479 -0.811701
+vn -0.770409 0.155217 -0.618336
+vn -0.662282 0.076052 -0.745354
+vn -0.196783 0.199957 -0.959807
+vn -0.200873 0.255379 -0.945708
+vn -0.121433 0.261666 -0.957457
+vn -0.073122 0.354381 -0.932218
+vn -0.210395 0.331217 -0.919767
+vn 0.455153 0.298502 -0.838862
+vn 0.102939 0.265511 -0.958586
+vn 0.420392 0.385266 -0.821467
+vn -0.007019 0.375805 -0.926664
+vn 0.508377 0.318949 -0.799860
+vn 0.546312 0.348216 -0.761742
+vn -0.125095 -0.061159 0.990234
+vn -0.578753 -0.006897 0.815455
+vn -0.331950 -0.338145 0.880581
+vn 0.066713 -0.409223 0.909970
+vn -0.907010 -0.018830 0.420606
+vn -0.823817 -0.285928 0.489425
+vn -0.297433 -0.423383 0.855708
+vn -0.144017 -0.405408 0.902707
+vn -0.114017 -0.075777 0.990570
+vn -0.115726 -0.135960 0.983917
+vn 0.460280 -0.197729 0.865444
+vn 0.005615 -0.312479 0.949889
+vn 0.484573 0.047212 0.873440
+vn 0.267647 -0.030061 0.963012
+vn 0.896084 -0.289865 0.336131
+vn 0.800958 -0.227485 0.553789
+vn 0.882504 -0.054598 0.467116
+vn 0.699026 0.088076 0.709616
+vn 0.939634 -0.289438 -0.182318
+vn 0.930937 -0.305155 0.200507
+vn 0.980529 -0.194555 -0.026490
+vn 0.956969 -0.149785 0.248512
+vn 0.925230 -0.175420 -0.336314
+vn 0.874081 -0.288217 -0.390942
+vn 0.741722 -0.210059 -0.636921
+vn 0.856624 -0.224555 -0.464461
+vn 0.343211 -0.213569 -0.914640
+vn 0.759209 -0.183233 -0.624500
+vn 0.635731 -0.254250 -0.728782
+vn 0.709769 -0.189032 -0.678549
+vn 0.232398 -0.171422 -0.957366
+vn 0.308542 -0.203131 -0.929258
+vn -0.112339 -0.182134 -0.976806
+vn 0.328806 -0.315775 -0.890011
+vn -0.397320 -0.072726 -0.914762
+vn -0.067324 -0.127842 -0.989502
+vn -0.418836 0.034639 -0.907376
+vn -0.234046 -0.022279 -0.971954
+vn -0.751701 -0.000275 -0.659474
+vn -0.591540 -0.011872 -0.806146
+vn -0.820490 0.138951 -0.554491
+vn -0.622639 0.074587 -0.778924
+vn -0.998657 -0.051271 0.000488
+vn -0.954497 -0.020478 -0.297464
+vn -0.978698 0.092044 -0.183416
+vn -0.938444 0.185736 -0.291177
+vn -0.962188 -0.224128 0.154698
+vn -0.999817 0.000000 -0.018433
+vn -0.375439 0.127964 0.917936
+vn -0.130985 0.155187 0.979156
+vn -0.868191 0.104648 0.485061
+vn -0.142186 0.168462 0.975372
+vn -0.135472 0.128697 0.982360
+vn 0.649617 0.189245 0.736290
+vn 0.255135 0.185492 0.948912
+vn 0.667287 0.146306 0.730247
+vn 0.598682 0.172765 0.782098
+vn 0.998871 0.043519 -0.017823
+vn 0.931303 0.091037 0.352641
+vn 0.907346 -0.148503 -0.393200
+vn 0.938169 -0.031648 -0.344707
+vn 0.576159 -0.029176 -0.816797
+vn 0.803064 -0.094638 -0.588305
+vn -0.263741 0.144627 -0.953673
+vn 0.197882 0.091342 -0.975951
+vn -0.565874 0.111332 -0.816919
+vn -0.400647 0.105472 -0.910123
+vn -0.859279 0.203131 -0.469405
+vn -0.712546 0.146855 -0.686026
+vn -0.941923 0.151311 -0.299692
+vn -0.911222 0.177038 -0.371868
+vn -0.990600 0.115970 -0.072146
+s 1
+f 1/1/1 2/2/2 3/3/3
+f 4/4/4 1/1/1 3/3/3
+f 5/5/5 6/6/6 3/7/3
+f 3/7/3 2/8/2 5/5/5
+f 7/9/7 4/10/4 3/11/3
+f 3/11/3 6/12/6 7/9/7
+f 8/13/8 9/14/9 10/15/10
+f 10/15/10 11/16/11 8/13/8
+f 12/17/12 13/18/13 10/19/10
+f 10/19/10 9/20/9 12/17/12
+f 5/5/5 2/8/2 10/19/10
+f 10/19/10 13/18/13 5/5/5
+f 1/1/1 11/16/11 10/15/10
+f 2/2/2 1/1/1 10/15/10
+f 14/21/14 15/22/15 16/23/16
+f 16/23/16 17/24/17 14/21/14
+f 18/25/18 19/26/19 16/27/16
+f 16/27/16 15/28/15 18/25/18
+f 12/17/12 9/20/9 16/27/16
+f 16/27/16 19/26/19 12/17/12
+f 8/13/8 17/24/17 16/23/16
+f 16/23/16 9/14/9 8/13/8
+f 20/29/20 21/30/21 22/31/22
+f 22/31/22 23/32/23 20/29/20
+f 18/25/18 15/28/15 22/33/22
+f 22/33/22 21/34/21 18/25/18
+f 14/21/14 23/35/23 22/36/22
+f 22/36/22 15/22/15 14/21/14
+f 7/9/7 24/37/24 25/38/25
+f 25/38/25 4/10/4 7/9/7
+f 26/39/26 27/40/27 25/38/25
+f 25/38/25 24/37/24 26/39/26
+f 28/41/28 29/42/29 25/43/25
+f 25/43/25 27/44/27 28/41/28
+f 1/1/1 4/4/4 25/43/25
+f 29/42/29 1/1/1 25/43/25
+f 28/41/28 30/45/30 31/46/31
+f 31/46/31 29/42/29 28/41/28
+f 32/47/32 33/48/33 31/46/31
+f 31/46/31 30/45/30 32/47/32
+f 8/13/8 11/16/11 31/46/31
+f 31/46/31 33/48/33 8/13/8
+f 1/1/1 29/42/29 31/46/31
+f 11/16/11 1/1/1 31/46/31
+f 32/47/32 34/49/34 35/50/35
+f 35/50/35 33/48/33 32/47/32
+f 36/51/36 37/52/37 35/50/35
+f 35/50/35 34/49/34 36/51/36
+f 14/21/14 17/24/17 35/50/35
+f 35/50/35 37/52/37 14/21/14
+f 8/13/8 33/48/33 35/50/35
+f 35/50/35 17/24/17 8/13/8
+f 36/51/36 38/53/38 39/54/39
+f 39/54/39 37/52/37 36/51/36
+f 40/55/40 41/56/41 39/57/39
+f 39/57/39 38/58/38 40/55/40
+f 20/29/20 23/32/23 39/57/39
+f 39/57/39 41/56/41 20/29/20
+f 14/21/14 37/52/37 39/54/39
+f 39/54/39 23/35/23 14/21/14
+f 26/39/26 42/59/42 43/60/43
+f 43/60/43 27/40/27 26/39/26
+f 44/61/44 45/62/45 43/60/43
+f 43/60/43 42/59/42 44/61/44
+f 46/63/46 47/64/47 43/65/43
+f 43/65/43 45/66/45 46/63/46
+f 28/41/28 27/44/27 43/65/43
+f 43/65/43 47/64/47 28/41/28
+f 46/63/46 48/67/48 49/68/49
+f 49/68/49 47/64/47 46/63/46
+f 50/69/50 51/70/51 49/68/49
+f 49/68/49 48/67/48 50/69/50
+f 32/47/32 30/45/30 49/68/49
+f 49/68/49 51/70/51 32/47/32
+f 28/41/28 47/64/47 49/68/49
+f 49/68/49 30/45/30 28/41/28
+f 50/69/50 52/71/52 53/72/53
+f 53/72/53 51/70/51 50/69/50
+f 54/73/54 55/74/55 53/72/53
+f 53/72/53 52/71/52 54/73/54
+f 36/51/36 34/49/34 53/72/53
+f 53/72/53 55/74/55 36/51/36
+f 32/47/32 51/70/51 53/72/53
+f 53/72/53 34/49/34 32/47/32
+f 54/73/54 56/75/56 57/76/57
+f 57/76/57 55/74/55 54/73/54
+f 58/77/58 59/78/59 57/79/57
+f 57/79/57 56/80/56 58/77/58
+f 40/55/40 38/58/38 57/79/57
+f 57/79/57 59/78/59 40/55/40
+f 36/51/36 55/74/55 57/76/57
+f 57/76/57 38/53/38 36/51/36
+f 44/61/44 60/81/60 61/82/61
+f 61/82/61 45/62/45 44/61/44
+f 62/83/62 63/84/63 61/85/61
+f 61/85/61 60/86/60 62/83/62
+f 46/63/46 45/66/45 61/87/61
+f 61/87/61 63/88/63 46/63/46
+f 62/83/62 64/89/64 65/90/65
+f 65/90/65 63/84/63 62/83/62
+f 66/91/66 67/92/67 65/90/65
+f 65/90/65 64/89/64 66/91/66
+f 50/69/50 48/67/48 65/93/65
+f 65/93/65 67/94/67 50/69/50
+f 46/63/46 63/88/63 65/93/65
+f 65/93/65 48/67/48 46/63/46
+f 66/91/66 68/95/68 69/96/69
+f 69/96/69 67/92/67 66/91/66
+f 70/97/70 71/98/71 69/96/69
+f 69/96/69 68/95/68 70/97/70
+f 54/73/54 52/71/52 69/99/69
+f 69/99/69 71/100/71 54/73/54
+f 50/69/50 67/94/67 69/99/69
+f 69/99/69 52/71/52 50/69/50
+f 70/97/70 72/101/72 73/102/73
+f 73/102/73 71/98/71 70/97/70
+f 58/77/58 56/80/56 73/103/73
+f 73/103/73 72/104/72 58/77/58
+f 54/73/54 71/100/71 73/105/73
+f 73/105/73 56/75/56 54/73/54
+f 74/106/74 75/107/75 76/108/76
+f 76/108/76 77/109/77 74/106/74
+f 78/110/78 79/111/79 76/112/76
+f 76/112/76 75/113/75 78/110/78
+f 80/114/80 77/115/77 76/116/76
+f 76/116/76 79/117/79 80/114/80
+f 80/114/80 81/118/81 82/119/82
+f 82/119/82 77/115/77 80/114/80
+f 83/120/83 84/121/84 82/119/82
+f 82/119/82 81/118/81 83/120/83
+f 85/122/85 86/123/86 82/124/82
+f 82/124/82 84/125/84 85/122/85
+f 74/106/74 77/109/77 82/124/82
+f 82/124/82 86/123/86 74/106/74
+f 83/120/83 87/126/87 88/127/88
+f 88/127/88 84/121/84 83/120/83
+f 89/128/89 90/129/90 88/127/88
+f 88/127/88 87/126/87 89/128/89
+f 91/130/91 92/131/92 88/132/88
+f 88/132/88 90/133/90 91/130/91
+f 85/122/85 84/125/84 88/132/88
+f 88/132/88 92/131/92 85/122/85
+f 89/128/89 93/134/93 94/135/94
+f 94/135/94 90/129/90 89/128/89
+f 95/136/95 96/137/96 94/138/94
+f 94/138/94 93/139/93 95/136/95
+f 91/130/91 90/133/90 94/140/94
+f 94/140/94 96/141/96 91/130/91
+f 97/142/97 98/143/98 99/144/99
+f 99/144/99 100/145/100 97/142/97
+f 101/146/101 102/147/102 99/148/99
+f 99/148/99 98/149/98 101/146/101
+f 78/110/78 75/113/75 99/148/99
+f 99/148/99 102/147/102 78/110/78
+f 74/106/74 100/145/100 99/144/99
+f 99/144/99 75/107/75 74/106/74
+f 85/122/85 103/150/103 104/151/104
+f 104/151/104 86/123/86 85/122/85
+f 105/152/105 106/153/106 104/151/104
+f 104/151/104 103/150/103 105/152/105
+f 97/142/97 100/145/100 104/151/104
+f 104/151/104 106/153/106 97/142/97
+f 74/106/74 86/123/86 104/151/104
+f 104/151/104 100/145/100 74/106/74
+f 91/130/91 107/154/107 108/155/108
+f 108/155/108 92/131/92 91/130/91
+f 109/156/109 110/157/110 108/155/108
+f 108/155/108 107/154/107 109/156/109
+f 105/152/105 103/150/103 108/155/108
+f 108/155/108 110/157/110 105/152/105
+f 85/122/85 92/131/92 108/155/108
+f 108/155/108 103/150/103 85/122/85
+f 95/136/95 111/158/111 112/159/112
+f 112/159/112 96/137/96 95/136/95
+f 113/160/113 114/161/114 112/159/112
+f 112/159/112 111/158/111 113/160/113
+f 109/156/109 107/154/107 112/162/112
+f 112/162/112 114/163/114 109/156/109
+f 91/130/91 96/141/96 112/162/112
+f 112/162/112 107/154/107 91/130/91
+f 115/164/115 116/165/116 117/166/117
+f 117/166/117 118/167/118 115/164/115
+f 119/168/119 120/169/120 117/170/117
+f 117/170/117 116/171/116 119/168/119
+f 101/146/101 98/149/98 117/170/117
+f 117/170/117 120/169/120 101/146/101
+f 97/142/97 118/167/118 117/166/117
+f 117/166/117 98/143/98 97/142/97
+f 105/152/105 121/172/121 122/173/122
+f 122/173/122 106/153/106 105/152/105
+f 123/174/123 124/175/124 122/173/122
+f 122/173/122 121/172/121 123/174/123
+f 115/164/115 118/167/118 122/173/122
+f 122/173/122 124/175/124 115/164/115
+f 97/142/97 106/153/106 122/173/122
+f 122/173/122 118/167/118 97/142/97
+f 109/156/109 125/176/125 126/177/126
+f 126/177/126 110/157/110 109/156/109
+f 127/178/127 128/179/128 126/177/126
+f 126/177/126 125/176/125 127/178/127
+f 123/174/123 121/172/121 126/177/126
+f 126/177/126 128/179/128 123/174/123
+f 105/152/105 110/157/110 126/177/126
+f 126/177/126 121/172/121 105/152/105
+f 113/160/113 129/180/129 130/181/130
+f 130/181/130 114/161/114 113/160/113
+f 131/182/131 132/183/132 130/181/130
+f 130/181/130 129/180/129 131/182/131
+f 127/178/127 125/176/125 130/184/130
+f 130/184/130 132/185/132 127/178/127
+f 109/156/109 114/163/114 130/184/130
+f 130/184/130 125/176/125 109/156/109
+f 133/186/133 134/187/134 135/188/135
+f 135/188/135 136/189/136 133/186/133
+f 119/168/119 116/171/116 135/190/135
+f 135/190/135 134/191/134 119/168/119
+f 115/164/115 136/192/136 135/193/135
+f 135/193/135 116/165/116 115/164/115
+f 123/174/123 137/194/137 138/195/138
+f 138/195/138 124/175/124 123/174/123
+f 139/196/139 140/197/140 138/198/138
+f 138/198/138 137/199/137 139/196/139
+f 133/186/133 136/189/136 138/198/138
+f 138/198/138 140/197/140 133/186/133
+f 115/164/115 124/175/124 138/195/138
+f 138/195/138 136/192/136 115/164/115
+f 127/178/127 141/200/141 142/201/142
+f 142/201/142 128/179/128 127/178/127
+f 143/202/143 144/203/144 142/204/142
+f 142/204/142 141/205/141 143/202/143
+f 139/196/139 137/199/137 142/204/142
+f 142/204/142 144/203/144 139/196/139
+f 123/174/123 128/179/128 142/201/142
+f 142/201/142 137/194/137 123/174/123
+f 131/182/131 145/206/145 146/207/146
+f 146/207/146 132/183/132 131/182/131
+f 143/202/143 141/205/141 146/208/146
+f 146/208/146 145/209/145 143/202/143
+f 127/178/127 132/185/132 146/210/146
+f 146/210/146 141/200/141 127/178/127
+f 147/211/147 148/212/148 149/213/149
+f 149/213/149 150/214/150 147/211/147
+f 151/215/151 152/216/152 149/217/149
+f 149/217/149 148/218/148 151/215/151
+f 7/9/7 6/12/6 149/217/149
+f 149/217/149 152/216/152 7/9/7
+f 5/5/5 150/214/150 149/213/149
+f 149/213/149 6/6/6 5/5/5
+f 12/17/12 153/219/153 154/220/154
+f 154/220/154 13/18/13 12/17/12
+f 155/221/155 156/222/156 154/220/154
+f 154/220/154 153/219/153 155/221/155
+f 147/211/147 150/214/150 154/220/154
+f 154/220/154 156/222/156 147/211/147
+f 5/5/5 13/18/13 154/220/154
+f 154/220/154 150/214/150 5/5/5
+f 18/25/18 157/223/157 158/224/158
+f 158/224/158 19/26/19 18/25/18
+f 159/225/159 160/226/160 158/224/158
+f 158/224/158 157/223/157 159/225/159
+f 155/221/155 153/219/153 158/224/158
+f 158/224/158 160/226/160 155/221/155
+f 12/17/12 19/26/19 158/224/158
+f 158/224/158 153/219/153 12/17/12
+f 20/29/20 161/227/161 162/228/162
+f 162/228/162 21/30/21 20/29/20
+f 163/229/163 164/230/164 162/228/162
+f 162/228/162 161/227/161 163/229/163
+f 159/225/159 157/223/157 162/231/162
+f 162/231/162 164/232/164 159/225/159
+f 18/25/18 21/34/21 162/231/162
+f 162/231/162 157/223/157 18/25/18
+f 40/55/40 165/233/165 166/234/166
+f 166/234/166 41/56/41 40/55/40
+f 167/235/167 168/236/168 166/234/166
+f 166/234/166 165/233/165 167/235/167
+f 163/229/163 161/227/161 166/234/166
+f 166/234/166 168/236/168 163/229/163
+f 20/29/20 41/56/41 166/234/166
+f 166/234/166 161/227/161 20/29/20
+f 58/77/58 169/237/169 170/238/170
+f 170/238/170 59/78/59 58/77/58
+f 171/239/171 172/240/172 170/238/170
+f 170/238/170 169/237/169 171/239/171
+f 167/235/167 165/233/165 170/238/170
+f 170/238/170 172/240/172 167/235/167
+f 40/55/40 59/78/59 170/238/170
+f 170/238/170 165/233/165 40/55/40
+f 70/97/70 173/241/173 174/242/174
+f 174/242/174 72/101/72 70/97/70
+f 175/243/175 176/244/176 174/242/174
+f 174/242/174 173/241/173 175/243/175
+f 171/239/171 169/237/169 174/245/174
+f 174/245/174 176/246/176 171/239/171
+f 58/77/58 72/104/72 174/245/174
+f 174/245/174 169/237/169 58/77/58
+f 66/91/66 177/247/177 178/248/178
+f 178/248/178 68/95/68 66/91/66
+f 179/249/179 180/250/180 178/248/178
+f 178/248/178 177/247/177 179/249/179
+f 175/243/175 173/241/173 178/248/178
+f 178/248/178 180/250/180 175/243/175
+f 70/97/70 68/95/68 178/248/178
+f 178/248/178 173/241/173 70/97/70
+f 62/83/62 181/251/181 182/252/182
+f 182/252/182 64/89/64 62/83/62
+f 183/253/183 184/254/184 182/252/182
+f 182/252/182 181/251/181 183/253/183
+f 179/249/179 177/247/177 182/252/182
+f 182/252/182 184/254/184 179/249/179
+f 66/91/66 64/89/64 182/252/182
+f 182/252/182 177/247/177 66/91/66
+f 44/61/44 185/255/185 186/256/186
+f 186/256/186 60/81/60 44/61/44
+f 187/257/187 188/258/188 186/256/186
+f 186/256/186 185/255/185 187/257/187
+f 183/253/183 181/251/181 186/259/186
+f 186/259/186 188/260/188 183/253/183
+f 62/83/62 60/86/60 186/259/186
+f 186/259/186 181/251/181 62/83/62
+f 26/39/26 189/261/189 190/262/190
+f 190/262/190 42/59/42 26/39/26
+f 191/263/191 192/264/192 190/262/190
+f 190/262/190 189/261/189 191/263/191
+f 187/257/187 185/255/185 190/262/190
+f 190/262/190 192/264/192 187/257/187
+f 44/61/44 42/59/42 190/262/190
+f 190/262/190 185/255/185 44/61/44
+f 7/9/7 152/216/152 193/265/193
+f 193/265/193 24/37/24 7/9/7
+f 151/215/151 194/266/194 193/265/193
+f 193/265/193 152/216/152 151/215/151
+f 191/263/191 189/261/189 193/265/193
+f 193/265/193 194/266/194 191/263/191
+f 26/39/26 24/37/24 193/265/193
+f 193/265/193 189/261/189 26/39/26
+f 80/114/80 79/117/79 195/267/195
+f 195/267/195 196/268/196 80/114/80
+f 78/110/78 197/269/197 195/270/195
+f 195/270/195 79/111/79 78/110/78
+f 151/215/151 148/218/148 195/270/195
+f 195/270/195 197/269/197 151/215/151
+f 147/211/147 196/268/196 195/267/195
+f 195/267/195 148/212/148 147/211/147
+f 155/221/155 198/271/198 199/272/199
+f 199/272/199 156/222/156 155/221/155
+f 83/120/83 81/118/81 199/272/199
+f 199/272/199 198/271/198 83/120/83
+f 80/114/80 196/268/196 199/272/199
+f 199/272/199 81/118/81 80/114/80
+f 147/211/147 156/222/156 199/272/199
+f 199/272/199 196/268/196 147/211/147
+f 159/225/159 200/273/200 201/274/201
+f 201/274/201 160/226/160 159/225/159
+f 89/128/89 87/126/87 201/274/201
+f 201/274/201 200/273/200 89/128/89
+f 83/120/83 198/271/198 201/274/201
+f 201/274/201 87/126/87 83/120/83
+f 155/221/155 160/226/160 201/274/201
+f 201/274/201 198/271/198 155/221/155
+f 163/229/163 202/275/202 203/276/203
+f 203/276/203 164/230/164 163/229/163
+f 95/136/95 93/139/93 203/276/203
+f 203/276/203 202/275/202 95/136/95
+f 89/128/89 200/273/200 203/277/203
+f 203/277/203 93/134/93 89/128/89
+f 159/225/159 164/232/164 203/277/203
+f 203/277/203 200/273/200 159/225/159
+f 167/235/167 204/278/204 205/279/205
+f 205/279/205 168/236/168 167/235/167
+f 113/160/113 111/158/111 205/279/205
+f 205/279/205 204/278/204 113/160/113
+f 95/136/95 202/275/202 205/279/205
+f 205/279/205 111/158/111 95/136/95
+f 163/229/163 168/236/168 205/279/205
+f 205/279/205 202/275/202 163/229/163
+f 171/239/171 206/280/206 207/281/207
+f 207/281/207 172/240/172 171/239/171
+f 131/182/131 129/180/129 207/281/207
+f 207/281/207 206/280/206 131/182/131
+f 113/160/113 204/278/204 207/281/207
+f 207/281/207 129/180/129 113/160/113
+f 167/235/167 172/240/172 207/281/207
+f 207/281/207 204/278/204 167/235/167
+f 175/243/175 208/282/208 209/283/209
+f 209/283/209 176/244/176 175/243/175
+f 143/202/143 145/209/145 209/283/209
+f 209/283/209 208/282/208 143/202/143
+f 131/182/131 206/280/206 209/284/209
+f 209/284/209 145/206/145 131/182/131
+f 171/239/171 176/246/176 209/284/209
+f 209/284/209 206/280/206 171/239/171
+f 179/249/179 210/285/210 211/286/211
+f 211/286/211 180/250/180 179/249/179
+f 139/196/139 144/203/144 211/286/211
+f 211/286/211 210/285/210 139/196/139
+f 143/202/143 208/282/208 211/286/211
+f 211/286/211 144/203/144 143/202/143
+f 175/243/175 180/250/180 211/286/211
+f 211/286/211 208/282/208 175/243/175
+f 183/253/183 212/287/212 213/288/213
+f 213/288/213 184/254/184 183/253/183
+f 133/186/133 140/197/140 213/288/213
+f 213/288/213 212/287/212 133/186/133
+f 139/196/139 210/285/210 213/288/213
+f 213/288/213 140/197/140 139/196/139
+f 179/249/179 184/254/184 213/288/213
+f 213/288/213 210/285/210 179/249/179
+f 187/257/187 214/289/214 215/290/215
+f 215/290/215 188/258/188 187/257/187
+f 119/168/119 134/191/134 215/290/215
+f 215/290/215 214/289/214 119/168/119
+f 133/186/133 212/287/212 215/291/215
+f 215/291/215 134/187/134 133/186/133
+f 183/253/183 188/260/188 215/291/215
+f 215/291/215 212/287/212 183/253/183
+f 191/263/191 216/292/216 217/293/217
+f 217/293/217 192/264/192 191/263/191
+f 101/146/101 120/169/120 217/293/217
+f 217/293/217 216/292/216 101/146/101
+f 119/168/119 214/289/214 217/293/217
+f 217/293/217 120/169/120 119/168/119
+f 187/257/187 192/264/192 217/293/217
+f 217/293/217 214/289/214 187/257/187
+f 151/215/151 197/269/197 218/294/218
+f 218/294/218 194/266/194 151/215/151
+f 78/110/78 102/147/102 218/294/218
+f 218/294/218 197/269/197 78/110/78
+f 101/146/101 216/292/216 218/294/218
+f 218/294/218 102/147/102 101/146/101
+f 191/263/191 194/266/194 218/294/218
+f 218/294/218 216/292/216 191/263/191
diff --git a/08-august/resources/crate.obj b/08-august/resources/crate.obj
new file mode 100644
index 0000000..5954600
--- /dev/null
+++ b/08-august/resources/crate.obj
@@ -0,0 +1,396 @@
+# Blender v2.67 (sub 0) OBJ File: ''
+# www.blender.org
+o Wood_container1
+v -83.000000 -83.000015 95.999985
+v 83.000000 -83.000015 95.999985
+v 83.000000 82.999985 96.000015
+v -83.000000 82.999985 96.000015
+v -83.000000 -82.999985 -96.000015
+v -83.000000 83.000015 -95.999985
+v 83.000000 83.000015 -95.999985
+v 83.000000 -82.999985 -96.000015
+v -83.000000 -96.000015 82.999985
+v -83.000000 -95.999985 -83.000015
+v 83.000000 -95.999985 -83.000015
+v 83.000000 -96.000015 82.999985
+v 96.000000 -83.000015 82.999985
+v 96.000000 -82.999985 -83.000015
+v 96.000000 83.000015 -82.999985
+v 96.000000 82.999985 83.000015
+v 83.000000 95.999985 83.000015
+v 83.000000 96.000015 -82.999985
+v -83.000000 96.000015 -82.999985
+v -83.000000 95.999985 83.000015
+v -96.000000 82.999985 83.000015
+v -96.000000 83.000015 -82.999985
+v -96.000000 -82.999985 -83.000015
+v -96.000000 -83.000015 82.999985
+v -100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 83.000000 -83.000015 99.999985
+v -83.000000 -83.000015 99.999985
+v 100.000000 99.999985 100.000015
+v 83.000000 82.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 100.000015 -99.999985
+v -83.000000 83.000015 -99.999985
+v -83.000000 -82.999985 -100.000015
+v 100.000000 100.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 100.000000 -99.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v -83.000000 -99.999985 -83.000015
+v -83.000000 -100.000015 82.999985
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -100.000015 82.999985
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -83.000015 82.999985
+v 100.000000 83.000015 -82.999985
+v 100.000000 82.999985 83.000015
+v 83.000000 100.000015 -82.999985
+v 83.000000 99.999985 83.000015
+v -83.000000 100.000015 -82.999985
+v -83.000000 99.999985 83.000015
+v -100.000000 83.000015 -82.999985
+v -100.000000 82.999985 83.000015
+v -100.000000 -82.999985 -83.000015
+v -100.000000 -83.000015 82.999985
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -83.000000 99.999985 83.000015
+v -83.000000 99.999985 83.000015
+v -83.000000 99.999985 83.000015
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -83.000000 100.000015 -82.999985
+v -83.000000 100.000015 -82.999985
+v -83.000000 100.000015 -82.999985
+v 83.000000 100.000015 -82.999985
+v 83.000000 100.000015 -82.999985
+v 83.000000 100.000015 -82.999985
+v 83.000000 99.999985 83.000015
+v 83.000000 99.999985 83.000015
+v 83.000000 99.999985 83.000015
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -100.000015 82.999985
+v 83.000000 -100.000015 82.999985
+v 83.000000 -100.000015 82.999985
+v 83.000000 96.000015 -82.999985
+v 83.000000 96.000015 -82.999985
+v -83.000000 96.000015 -82.999985
+v -83.000000 96.000015 -82.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -83.000000 -100.000015 82.999985
+v -83.000000 -100.000015 82.999985
+v -83.000000 -100.000015 82.999985
+v -96.000000 83.000015 -82.999985
+v -96.000000 83.000015 -82.999985
+v -100.000000 83.000015 -82.999985
+v -100.000000 83.000015 -82.999985
+v -100.000000 83.000015 -82.999985
+v -83.000000 -82.999985 -96.000015
+v -83.000000 -82.999985 -96.000015
+v -83.000000 -82.999985 -100.000015
+v -83.000000 -82.999985 -100.000015
+v -83.000000 -82.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v 83.000000 82.999985 100.000015
+v 83.000000 82.999985 100.000015
+v 83.000000 82.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -96.000000 -82.999985 -83.000015
+v -96.000000 -82.999985 -83.000015
+v -83.000000 95.999985 83.000015
+v -83.000000 95.999985 83.000015
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 96.000000 82.999985 83.000015
+v 96.000000 82.999985 83.000015
+v 100.000000 82.999985 83.000015
+v 100.000000 82.999985 83.000015
+v 100.000000 82.999985 83.000015
+v 83.000000 -82.999985 -96.000015
+v 83.000000 -82.999985 -96.000015
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -83.000015 82.999985
+v 100.000000 -83.000015 82.999985
+v 100.000000 -83.000015 82.999985
+v -83.000000 -99.999985 -83.000015
+v -83.000000 -99.999985 -83.000015
+v -83.000000 -99.999985 -83.000015
+v 96.000000 -83.000015 82.999985
+v 96.000000 -83.000015 82.999985
+v 83.000000 -83.000015 99.999985
+v 83.000000 -83.000015 99.999985
+v 83.000000 -83.000015 99.999985
+v 96.000000 83.000015 -82.999985
+v 96.000000 83.000015 -82.999985
+v 100.000000 83.000015 -82.999985
+v 100.000000 83.000015 -82.999985
+v 100.000000 83.000015 -82.999985
+v -83.000000 -96.000015 82.999985
+v -83.000000 -96.000015 82.999985
+v -83.000000 83.000015 -95.999985
+v -83.000000 83.000015 -95.999985
+v -100.000000 -82.999985 -83.000015
+v -100.000000 -82.999985 -83.000015
+v -100.000000 -82.999985 -83.000015
+v -83.000000 83.000015 -99.999985
+v -83.000000 83.000015 -99.999985
+v -83.000000 83.000015 -99.999985
+v -83.000000 -95.999985 -83.000015
+v -83.000000 -95.999985 -83.000015
+v -96.000000 82.999985 83.000015
+v -96.000000 82.999985 83.000015
+v -96.000000 -83.000015 82.999985
+v -96.000000 -83.000015 82.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v 83.000000 83.000015 -95.999985
+v 83.000000 83.000015 -95.999985
+v 83.000000 82.999985 96.000015
+v 83.000000 82.999985 96.000015
+v -100.000000 82.999985 83.000015
+v -100.000000 82.999985 83.000015
+v -100.000000 82.999985 83.000015
+v -83.000000 -83.000015 99.999985
+v -83.000000 -83.000015 99.999985
+v -83.000000 -83.000015 99.999985
+v 96.000000 -82.999985 -83.000015
+v 96.000000 -82.999985 -83.000015
+v 83.000000 95.999985 83.000015
+v 83.000000 95.999985 83.000015
+v -83.000000 -83.000015 95.999985
+v -83.000000 -83.000015 95.999985
+v -83.000000 82.999985 96.000015
+v -83.000000 82.999985 96.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 83.000000 -95.999985 -83.000015
+v 83.000000 -95.999985 -83.000015
+v -100.000000 -83.000015 82.999985
+v -100.000000 -83.000015 82.999985
+v -100.000000 -83.000015 82.999985
+v 83.000000 -83.000015 95.999985
+v 83.000000 -83.000015 95.999985
+v 83.000000 -96.000015 82.999985
+v 83.000000 -96.000015 82.999985
+vt 0.056200 0.549000
+vt 0.454300 0.549000
+vt 0.454300 0.947100
+vt 0.056200 0.947100
+vt 0.947600 0.452400
+vt 0.947600 0.058200
+vt 0.553400 0.058200
+vt 0.553400 0.550900
+vt 0.947700 0.550900
+vt 0.947700 0.945200
+vt 0.058100 0.452400
+vt 0.058100 0.058200
+vt 0.452300 0.058200
+vt 0.553400 0.945200
+vt 0.013000 0.505800
+vt 0.497500 0.505800
+vt 0.456300 0.547000
+vt 0.497500 0.990300
+vt 0.456300 0.949100
+vt 0.013000 0.990300
+vt 0.054200 0.949100
+vt 0.054200 0.547000
+vt 0.992800 0.497600
+vt 0.992800 0.013100
+vt 0.951600 0.456400
+vt 0.508300 0.013100
+vt 0.549400 0.054200
+vt 0.508300 0.497600
+vt 0.508300 0.505800
+vt 0.992800 0.505800
+vt 0.951600 0.547000
+vt 0.992800 0.990300
+vt 0.951600 0.949100
+vt 0.508300 0.990300
+vt 0.549500 0.949100
+vt 0.549500 0.547000
+vt 0.012900 0.497600
+vt 0.012900 0.013100
+vt 0.054100 0.456400
+vt 0.497400 0.013100
+vt 0.456300 0.054200
+vt 0.497400 0.497600
+vt 0.489900 0.528500
+vt 0.014400 0.528500
+vt 0.014400 0.510300
+vt 0.489900 0.510300
+vt 0.489900 0.528600
+vt 0.014400 0.528600
+vt 0.014400 0.510400
+vt 0.489900 0.510400
+vt 0.553400 0.452400
+vt 0.452300 0.452400
+vt 0.951600 0.054200
+vt 0.549400 0.456400
+vt 0.054100 0.054200
+vt 0.456300 0.456400
+vn 0.000000 0.000000 0.999969
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 -0.999969
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -0.999969 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.999969 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.999969 0.000000
+vn 0.000000 1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.999969 0.000000 0.000000
+s 1
+f 1/1/1 2/2/2 187/3/1
+f 102/2/3 6/3/4 7/4/3
+f 159/5/5 169/6/6 208/7/5
+f 13/8/7 195/9/8 154/10/7
+f 17/11/9 18/12/10 19/13/9
+f 21/14/11 97/10/12 24/8/12
+f 90/15/2 175/16/2 151/17/2
+f 177/16/2 204/18/2 115/19/2
+f 205/18/2 59/20/2 32/21/2
+f 57/20/2 89/15/2 28/22/2
+f 33/16/4 65/18/4 105/17/4
+f 67/18/4 37/20/4 38/21/4
+f 125/20/4 39/15/4 131/21/4
+f 108/15/4 180/16/4 104/17/4
+f 25/23/6 181/24/6 42/25/6
+f 183/24/6 110/26/6 79/27/6
+f 109/26/6 26/28/6 43/27/6
+f 178/28/6 92/23/6 94/25/6
+f 176/29/8 107/30/8 45/31/8
+f 111/30/8 126/32/8 156/33/8
+f 128/32/8 203/34/8 135/35/8
+f 207/34/8 179/29/8 144/36/8
+f 29/37/10 127/38/10 50/39/10
+f 129/38/10 34/40/10 51/41/10
+f 66/40/10 31/42/10 71/41/10
+f 60/42/10 206/37/10 76/39/10
+f 58/34/11 68/32/11 189/35/11
+f 69/32/11 182/30/11 100/33/11
+f 184/30/11 91/29/11 164/31/11
+f 93/29/11 61/34/11 211/36/11
+f 213/43/9 199/44/10 193/45/9
+f 153/45/11 116/46/11 214/44/11
+f 117/45/5 119/46/6 201/43/5
+f 200/43/8 202/44/8 120/45/8
+f 36/47/8 167/48/8 161/49/8
+f 168/43/5 130/44/6 185/49/5
+f 132/47/11 112/48/11 186/50/11
+f 114/47/9 106/48/10 103/49/9
+f 95/47/8 146/48/8 10/49/8
+f 148/43/1 80/44/2 11/45/1
+f 81/49/11 83/50/11 209/48/11
+f 84/49/3 96/50/4 160/47/3
+f 143/43/9 140/44/10 14/45/9
+f 142/49/1 47/50/2 15/47/1
+f 158/49/5 48/50/6 16/47/5
+f 137/49/3 145/50/4 150/47/3
+f 77/43/11 73/44/11 197/46/11
+f 75/49/1 70/50/2 87/47/1
+f 72/49/8 62/50/8 20/47/8
+f 64/47/3 78/48/4 198/49/3
+f 54/47/5 53/48/6 22/49/5
+f 101/47/1 55/48/2 121/49/1
+f 165/49/9 210/50/10 173/47/9
+f 212/43/3 191/44/4 172/49/3
+f 4/4/2 1/1/1 187/3/1
+f 138/1/4 102/2/3 7/4/3
+f 12/51/6 159/5/5 208/7/5
+f 133/14/8 13/8/7 154/10/7
+f 123/52/10 17/11/9 19/13/9
+f 97/10/12 23/9/11 24/8/12
+f 192/22/2 90/15/2 151/17/2
+f 27/17/2 177/16/2 115/19/2
+f 30/19/2 205/18/2 32/21/2
+f 118/21/2 57/20/2 28/22/2
+f 65/18/4 166/19/4 105/17/4
+f 35/19/4 67/18/4 38/21/4
+f 39/15/4 40/22/4 131/21/4
+f 113/22/4 108/15/4 104/17/4
+f 181/24/6 147/53/6 42/25/6
+f 41/53/6 183/24/6 79/27/6
+f 26/28/6 44/54/6 43/27/6
+f 82/54/6 178/28/6 94/25/6
+f 46/36/8 176/29/8 45/31/8
+f 141/31/8 111/30/8 156/33/8
+f 157/33/8 128/32/8 135/35/8
+f 136/35/8 207/34/8 144/36/8
+f 127/38/10 49/55/10 50/39/10
+f 74/55/10 129/38/10 51/41/10
+f 31/42/10 52/56/10 71/41/10
+f 63/56/10 60/42/10 76/39/10
+f 68/32/11 99/33/11 189/35/11
+f 182/30/11 163/31/11 100/33/11
+f 91/29/11 56/36/11 164/31/11
+f 61/34/11 190/35/11 211/36/11
+f 152/46/10 213/43/9 193/45/9
+f 116/46/11 3/43/11 214/44/11
+f 188/44/6 117/45/5 201/43/5
+f 194/46/8 200/43/8 120/45/8
+f 5/50/8 36/47/8 161/49/8
+f 162/50/6 168/43/5 185/49/5
+f 112/48/11 8/49/11 186/50/11
+f 139/50/10 114/47/9 103/49/9
+f 9/50/8 95/47/8 10/49/8
+f 170/46/2 148/43/1 11/45/1
+f 83/50/11 215/47/11 209/48/11
+f 216/48/4 84/49/3 160/47/3
+f 149/46/10 143/43/9 14/45/9
+f 196/48/2 142/49/1 15/47/1
+f 155/48/6 158/49/5 16/47/5
+f 134/48/4 137/49/3 150/47/3
+f 73/44/11 85/45/11 197/46/11
+f 86/48/2 75/49/1 87/47/1
+f 88/48/8 72/49/8 20/47/8
+f 124/50/4 64/47/3 198/49/3
+f 171/50/6 54/47/5 22/49/5
+f 98/50/2 101/47/1 121/49/1
+f 122/48/10 165/49/9 173/47/9
+f 174/50/4 212/43/3 172/49/3
diff --git a/08-august/resources/plane3.obj b/08-august/resources/plane3.obj
new file mode 100644
index 0000000..b663241
--- /dev/null
+++ b/08-august/resources/plane3.obj
@@ -0,0 +1,55 @@
+# Blender v2.77 (sub 0) OBJ File: 'plane3.obj'
+# www.blender.org
+mtllib plane3.mtl
+o Cube.001
+v 8.045116 -0.023363 -8.045115
+v 8.045116 -0.023363 8.045116
+v -8.045117 -0.023363 8.045115
+v -8.045114 -0.023363 -8.045119
+v 8.045120 0.023363 -8.045112
+v -8.045115 0.023363 -8.045116
+v -8.045119 0.023363 8.045114
+v 8.045111 0.023363 8.045121
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 0.0000 0.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 0.0000 0.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 0.0000 0.0000
+vt 0.0000 0.0000
+vt 1.0000 1.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 1.0000 1.0000
+vt 1.0000 1.0000
+vt 1.0000 1.0000
+vt 1.0000 0.0000
+vt 1.0000 1.0000
+vn 0.0000 -1.0000 -0.0000
+vn -0.0000 1.0000 0.0000
+vn 1.0000 -0.0001 0.0000
+vn 1.0000 0.0001 0.0000
+vn -0.0000 -0.0001 1.0000
+vn -0.0000 0.0000 1.0000
+vn -1.0000 -0.0000 -0.0000
+vn -1.0000 -0.0001 -0.0000
+vn 0.0000 0.0001 -1.0000
+usemtl Material.001
+s 1
+f 2/1/1 4/2/1 1/3/1
+f 6/4/2 8/5/2 5/6/2
+f 5/7/3 2/8/4 1/3/3
+f 8/9/5 3/10/6 2/11/5
+f 3/12/7 6/13/8 4/2/8
+f 1/14/9 6/15/9 5/6/9
+f 2/1/1 3/16/1 4/2/1
+f 6/4/2 7/17/2 8/5/2
+f 5/7/3 8/18/4 2/8/4
+f 8/9/5 7/17/6 3/10/6
+f 3/12/7 7/19/7 6/13/8
+f 1/14/9 4/20/9 6/15/9
diff --git a/08-august/resources/shaders/passShader.frag b/08-august/resources/shaders/passShader.frag
new file mode 100644
index 0000000..4c8dec1
--- /dev/null
+++ b/08-august/resources/shaders/passShader.frag
@@ -0,0 +1,13 @@
+#version 420
+
+in vec4 Fragment_Color;
+in vec2 Fragment_Uv;
+
+out vec4 out_color;
+
+uniform sampler2D Texture;
+
+void main()
+{
+ out_color = Fragment_Color * texture(Texture, Fragment_Uv);
+}
diff --git a/08-august/resources/shaders/passShader.vert b/08-august/resources/shaders/passShader.vert
new file mode 100644
index 0000000..c75a347
--- /dev/null
+++ b/08-august/resources/shaders/passShader.vert
@@ -0,0 +1,15 @@
+#version 420
+
+in layout(location=0) vec2 Model_Position;
+
+uniform mat4 M_totalTransform;
+
+out vec4 Fragment_Color;
+out vec2 Fragment_Uv;
+
+void main()
+{
+ Fragment_Color = vec4(1.0, 1.0, 1.0, 1.0);
+ Fragment_Uv = vec2( (Model_Position.x + 1.0)/2.0, 1.0 - (Model_Position.y + 1.0)/2.0 );
+ gl_Position = M_totalTransform * vec4(Model_Position, 0.0, 1.0);
+}
diff --git a/08-august/resources/shaders/shader.frag b/08-august/resources/shaders/shader.frag
new file mode 100644
index 0000000..42168d5
--- /dev/null
+++ b/08-august/resources/shaders/shader.frag
@@ -0,0 +1,58 @@
+#version 420
+
+in vec2 Fragment_UV;
+in vec4 Fragment_Color;
+in vec3 toLightVector[4];
+in vec3 toEyeVector;
+in vec3 tangent0;
+
+out vec4 out_color;
+
+uniform vec4 lightColor[4];
+uniform vec3 attenuation[4];
+uniform sampler2D Texture;
+uniform sampler2D normalMap;
+
+void main()
+{
+ vec4 totalDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
+ vec4 totalSpecular = vec4(0.0, 0.0, 0.0, 1.0);
+
+ /* We get the normal from the normal map and we transform it into world space */
+ vec3 normal = normalize( (255.0 / 128.0 * texture(normalMap, Fragment_UV) - 1.0).xyz );
+
+ for(int i = 0; i < 4; i++)
+ {
+ /*Light Attenuation*/
+ float dist = length(toLightVector[i]);
+ float attFactor = attenuation[i].x + (attenuation[i].y * dist) + (attenuation[i].z * dist * dist);
+ vec3 unitToLightVector = normalize(toLightVector[i]);
+
+ /*Diffuse lighting*/
+
+ /*La intensidad es el cos entre la normal y el vector hacia la luz*/
+ float brightness = dot(unitToLightVector, normalize(normal));
+ /*No queremos luz negativa ni mayor a 1*/
+ brightness = max(brightness, 0.0);
+ totalDiffuse = totalDiffuse + (brightness * lightColor[i]) / attFactor;
+
+ /* Specular lighting */
+
+ /* Reflejamos el vector hacia la luz (su inverso) en la normal */
+ vec3 Vector_ReflectedLight = reflect(-unitToLightVector, normal);
+
+ /* La luz especular es el cos del angulo entre el vector hacia el ojo y la luz reflectada en la normal */
+ float specularity = clamp( dot(Vector_ReflectedLight, toEyeVector), 0, 1 );
+ float reflectivity = 0.5;
+ /* Que tan grande es el specular highlight */
+ specularity = pow(specularity, 10);
+ totalSpecular = totalSpecular + clamp( reflectivity * specularity * lightColor[i], 0, 1) / attFactor;
+ }
+
+ /* Ambient Light */
+ totalDiffuse = max(totalDiffuse, 0.2);
+
+ /* Juntamos todo para el color final*/
+ out_color = totalDiffuse * texture(Texture, Fragment_UV) + totalSpecular;
+ out_color = vec4(tangent0, 1.0);
+}
diff --git a/08-august/resources/shaders/shader.vert b/08-august/resources/shaders/shader.vert
new file mode 100644
index 0000000..282ac62
--- /dev/null
+++ b/08-august/resources/shaders/shader.vert
@@ -0,0 +1,50 @@
+#version 420
+
+in layout(location=0) vec3 position;
+in layout(location=1) vec2 Texture_UV;
+in layout(location=2) vec3 normal;
+in layout(location=3) vec3 tangent;
+
+uniform mat4 M_MVP; /* Total Transform matrix */
+uniform mat4 M_model; /* Model to world space transformation matrix */
+
+uniform vec3 lightPosition[4];
+uniform vec3 World_eyePosition;
+
+out vec2 Fragment_UV;
+out vec4 Fragment_Color;
+out vec3 toLightVector[4];
+out vec3 toEyeVector;
+out vec3 tangent0;
+
+void main()
+{
+ /*We add a 0 on the vec4 so we can remove the translation from the matrix
+ (WE DONT WANT THE NORMAL TO BE TRANSLATED) */
+ vec3 n = normalize( (M_model * vec4(normal, 0.0)).xyz );
+ vec3 t = normalize( (M_model * vec4(tangent, 0.0)).xyz );
+
+ /* Orthogonalization */
+ t = normalize(t - dot(t, n) * n);
+
+ vec3 biTangent = normalize( cross(t, n) );
+
+ /* Matrix use by normal mapping */
+ mat3 tbnMatrix = mat3(t, biTangent, n);
+ tbnMatrix = transpose(tbnMatrix);
+
+ vec3 World_Position = vec3(M_model * vec4(position, 1.0));
+
+ for(int i = 0; i < 4; i++)
+ {
+ /* vector que apunta hacia la luz*/
+ toLightVector[i] = tbnMatrix * (lightPosition[i] - World_Position);
+ }
+ /* Vector hacia el ojo*/
+ toEyeVector = normalize( tbnMatrix * (World_eyePosition - World_Position) );
+
+ gl_Position = M_MVP * vec4(position, 1.0);
+
+ Fragment_UV = vec2(Texture_UV.x, 1 - Texture_UV.y); /*Invert y axis*/
+ tangent0 = tangent;
+}
diff --git a/08-august/resources/shaders/skyboxShader.frag b/08-august/resources/shaders/skyboxShader.frag
new file mode 100644
index 0000000..99dcde3
--- /dev/null
+++ b/08-august/resources/shaders/skyboxShader.frag
@@ -0,0 +1,11 @@
+#version 420
+
+in vec3 Fragment_UV;
+out vec4 out_color;
+
+uniform samplerCube cubeMap;
+
+void main()
+{
+ out_color = texture(cubeMap, Fragment_UV);
+}
diff --git a/08-august/resources/shaders/skyboxShader.vert b/08-august/resources/shaders/skyboxShader.vert
new file mode 100644
index 0000000..3286875
--- /dev/null
+++ b/08-august/resources/shaders/skyboxShader.vert
@@ -0,0 +1,12 @@
+#version 420
+
+in layout(location=0) vec3 position; /* vertex position in model coordinates */
+out vec3 Fragment_UV; /* UV coordinates for the fragment */
+
+uniform mat4 M_MVP;
+
+void main()
+{
+ gl_Position = M_MVP * vec4(position, 1.0);
+ Fragment_UV = position;
+}
diff --git a/08-august/resources/shaders/terrainShader.frag b/08-august/resources/shaders/terrainShader.frag
new file mode 100644
index 0000000..21623bb
--- /dev/null
+++ b/08-august/resources/shaders/terrainShader.frag
@@ -0,0 +1,72 @@
+#version 420
+
+in vec2 Fragment_UV;
+in vec3 normal0;
+in vec3 toLightVector[4];
+in vec3 toEyeVector;
+
+out vec4 out_color;
+
+uniform vec4 lightColor[4];
+uniform vec3 attenuation[4];
+uniform vec3 World_eyePosition;
+
+uniform sampler2D Texture_Background;
+uniform sampler2D Texture_R;
+uniform sampler2D Texture_G;
+uniform sampler2D Texture_B;
+uniform sampler2D Texture_BlendMap;
+
+void main()
+{
+ vec4 totalDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
+ vec4 totalSpecular = vec4(0.0, 0.0, 0.0, 1.0);
+
+ for(int i = 0; i < 4; i++)
+ {
+ /*Light Attenuation*/
+ float dist = length(toLightVector[i]);
+ float attFactor = attenuation[i].x + (attenuation[i].y * dist) + (attenuation[i].z * dist * dist);
+ vec3 unitToLightVector = normalize(toLightVector[i]);
+ /*Diffuse lighting*/
+
+ /*La intensidad es el cos entre la normal y el vector hacia la luz*/
+ float brightness = dot(unitToLightVector, normalize(normal0));
+ /*No queremos luz negativa ni mayor a 1*/
+ brightness = max(brightness, 0.0);
+ totalDiffuse = totalDiffuse + (brightness * lightColor[i]) / attFactor;
+
+ /* Specular lighting */
+
+ /* Reflejamos el vector hacia la luz (su inverso) en la normal */
+ vec3 Vector_ReflectedLight = reflect(-unitToLightVector, normal0);
+
+ /* La luz especular es el cos del angulo entre el vector hacia el ojo y la luz reflectada en la normal */
+ float specularity = clamp( dot(Vector_ReflectedLight, toEyeVector), 0, 1 );
+ float reflectivity = 0.5;
+ /* Que tan grande es el specular highlight */
+ specularity = pow(specularity, 10);
+ totalSpecular = totalSpecular + clamp( reflectivity * specularity * lightColor[i], 0, 1) / attFactor;
+ }
+
+ /* Ambient Light */
+ totalDiffuse = max(totalDiffuse, 0.2);
+
+ /*Terrain color*/
+ /*The color of the current fragment from the blendmap*/
+ vec4 blendMapColor = texture(Texture_BlendMap, Fragment_UV);
+ /*We want the background color when we have black in the blend map*/
+ float backTextureAmount = 1 - (blendMapColor.r + blendMapColor.g + blendMapColor.b);
+ /*So we dont lose image quality from the tiles textures (Fragment_UV make the terrain look less HD)*/
+ vec2 Tiled_UV = Fragment_UV * 50.0f;
+ /*We get the color of each map tile (soil1, soil2, etc)*/
+ vec4 backgroundTextureColor = texture(Texture_Background, Tiled_UV) * backTextureAmount;
+ vec4 rTextureColor = texture(Texture_R, Tiled_UV) * blendMapColor.r;
+ vec4 gTextureColor = texture(Texture_G, Tiled_UV) * blendMapColor.g;
+ vec4 bTextureColor = texture(Texture_B, Tiled_UV) * blendMapColor.b;
+ /*We mix them corresponding with the blendmap*/
+ vec4 totalColor = backgroundTextureColor + rTextureColor + gTextureColor + bTextureColor;
+
+ /*Our final color for the fragment*/
+ out_color = totalDiffuse * totalColor + totalSpecular;
+}
diff --git a/08-august/resources/shaders/terrainShader.vert b/08-august/resources/shaders/terrainShader.vert
new file mode 100644
index 0000000..1850947
--- /dev/null
+++ b/08-august/resources/shaders/terrainShader.vert
@@ -0,0 +1,39 @@
+#version 420
+
+in layout(location=0) vec3 position; /* vertex position in model space */
+in layout(location=1) vec2 Texture_UV;
+in layout(location=2) vec3 normal; /* vertex normal in model space */
+in layout(location=3) vec3 tangent;
+
+uniform mat4 M_MVP; /* Total Transform matrix */
+uniform mat4 M_model; /* Model to world space transformation matrix */
+
+uniform vec3 lightPosition[4];
+uniform vec3 World_eyePosition;
+
+out vec2 Fragment_UV; /* UV coordinates for the fragment */
+out vec3 normal0;
+out vec4 Fragment_Color;
+out vec3 toLightVector[4];
+out vec3 toEyeVector;
+
+void main()
+{
+ vec3 World_Position = vec3(M_model * vec4(position, 1.0));
+
+ for(int i = 0; i < 4; i++)
+ {
+ /* vector que apunta hacia la luz*/
+ toLightVector[i] = lightPosition[i] - World_Position;
+ }
+ /* Vector hacia el ojo*/
+ toEyeVector = normalize(World_eyePosition - World_Position);
+
+ gl_Position = M_MVP * vec4(position, 1.0);
+
+ Fragment_UV = vec2(Texture_UV.x, 1 - Texture_UV.y); /*Invert y axis*/
+
+ /*We add a 0 on the vec4 so we can remove the translation from the matrix
+ (WE DONT WANT THE NORMAL TO BE TRANSLATED) */
+ normal0 = normalize( (M_model * vec4(normal, 0.0)).xyz );
+}
diff --git a/08-august/resources/stall.obj b/08-august/resources/stall.obj
new file mode 100644
index 0000000..210f90b
--- /dev/null
+++ b/08-august/resources/stall.obj
@@ -0,0 +1,1696 @@
+# Blender v2.67 (sub 0) OBJ File: 'stall.blend'
+# www.blender.org
+o Cube
+v 3.227124 -0.065127 -1.000000
+v 3.227124 -0.065127 1.000000
+v -3.227125 -0.065127 1.000000
+v -3.227123 -0.065127 -1.000000
+v 3.227126 1.934873 -0.999999
+v 3.227122 1.934873 1.000001
+v -3.227126 1.934873 1.000000
+v -3.227124 1.934873 -1.000000
+v 3.558682 1.924610 -1.102740
+v 3.558677 1.924610 1.511141
+v -3.558681 1.924610 1.511140
+v -3.558679 1.924610 -1.102740
+v 3.558682 2.083301 -1.102740
+v 3.558677 2.083301 1.511141
+v -3.558681 2.083301 1.511140
+v -3.558679 2.083301 -1.102740
+v 3.227124 -0.065127 -1.000000
+v 3.227126 1.934873 -0.999999
+v 3.227126 1.934873 -0.999999
+v 3.227126 1.934873 -0.999999
+v 3.227124 -0.065127 1.000000
+v 3.227122 1.934873 1.000001
+v 3.227122 1.934873 1.000001
+v 3.227122 1.934873 1.000001
+v -3.227125 -0.065127 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227123 -0.065127 -1.000000
+v -3.227124 1.934873 -1.000000
+v -3.227124 1.934873 -1.000000
+v -3.227124 1.934873 -1.000000
+v 3.558682 1.924610 -1.102740
+v 3.558677 1.924610 1.511141
+v 3.558677 1.924610 1.511141
+v 3.558677 1.924610 1.511141
+v -3.558681 1.924610 1.511140
+v -3.558681 1.924610 1.511140
+v -3.558681 1.924610 1.511140
+v -3.558679 1.924610 -1.102740
+v -3.558679 1.924610 -1.102740
+v 3.558682 2.083301 -1.102740
+v 3.558677 2.083301 1.511141
+v 3.558677 2.083301 1.511141
+v -3.558679 2.083301 -1.102740
+v -3.558679 2.083301 -1.102740
+v -3.558681 2.083301 1.511140
+v -3.558681 2.083301 1.511140
+v -3.975889 5.109764 -0.703744
+v -3.975889 -0.001038 -0.703744
+v 4.035702 -0.001038 -0.703744
+v 4.035702 5.109764 -0.703744
+v 4.136954 -0.001038 -0.645286
+v 4.136954 5.109764 -0.645286
+v 4.136954 -0.001038 -0.528370
+v 4.136954 5.109764 -0.528370
+v 4.035702 -0.001038 -0.469912
+v 4.035702 5.109764 -0.469912
+v 3.934450 -0.001038 -0.528370
+v 3.934450 5.109764 -0.528370
+v 3.934450 -0.001038 -0.645286
+v 3.934450 5.109764 -0.645286
+v -3.874637 -0.001038 -0.645286
+v -3.874637 5.109764 -0.645286
+v -3.874637 -0.001038 -0.528370
+v -3.874637 5.109764 -0.528370
+v -3.975889 -0.001038 -0.469912
+v -3.975889 5.109764 -0.469912
+v -4.077142 -0.001038 -0.528370
+v -4.077142 5.109764 -0.528370
+v -4.077142 -0.001038 -0.645286
+v -4.077142 5.109764 -0.645286
+v -4.518063 -0.025686 3.868089
+v -4.518063 -0.025686 3.580229
+v 4.401308 -0.025686 3.580229
+v 4.401308 -0.025686 3.868089
+v -4.518063 3.617208 3.868089
+v -4.518063 3.617208 3.580229
+v 4.401308 3.617208 3.580229
+v 4.401308 3.617208 3.868089
+v -4.518063 4.016335 3.710218
+v -4.518063 3.792680 3.528995
+v 4.401308 3.792680 3.528995
+v 4.401308 4.016335 3.710218
+v -4.518063 4.490533 3.232638
+v -4.518063 4.260199 3.059984
+v 4.401308 4.260199 3.059984
+v 4.401308 4.490533 3.232638
+v -4.518063 5.251897 -0.749037
+v -4.518063 5.051156 -0.716959
+v 4.401308 5.051156 -0.716959
+v 4.401308 5.251897 -0.749037
+v -4.518063 4.733114 -1.423512
+v -4.518063 4.593092 -1.289192
+v 4.401308 4.593092 -1.289192
+v 4.401308 4.733114 -1.423512
+v -3.874637 5.109764 -0.528370
+v -3.874637 -0.001038 -0.528370
+v 3.934450 5.109764 -0.528370
+v 3.934450 -0.001038 -0.528370
+v 3.077599 2.080430 -1.292466
+v 3.486084 2.080430 0.000798
+v 1.220706 2.080430 0.716330
+v 0.812221 2.080430 -0.576934
+v 3.077599 2.174018 -1.292466
+v 3.486084 2.174018 0.000798
+v 1.220706 2.174018 0.716330
+v 0.812221 2.174018 -0.576934
+v 0.866186 2.174018 -0.491315
+v 1.241163 2.174018 0.695864
+v 1.353509 2.174018 0.660380
+v 0.978532 2.174018 -0.526800
+v 0.866186 2.080430 -0.491315
+v 1.241163 2.080430 0.695864
+v 1.353509 2.080430 0.660380
+v 0.978532 2.080430 -0.526800
+v 0.866186 2.545954 -0.491315
+v 1.241163 2.545954 0.695864
+v 1.353509 2.545954 0.660380
+v 0.978532 2.545954 -0.526800
+v 0.844122 2.174018 -0.561169
+v 0.956468 2.174018 -0.596654
+v 0.844122 2.080430 -0.561169
+v 0.956468 2.080430 -0.596654
+v 0.844122 2.545954 -0.561169
+v 0.956468 2.545954 -0.596654
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.545954 -1.169330
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.545954 -1.239183
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.545954 -0.043953
+v 3.077599 2.174018 -1.292466
+v 3.077599 2.174018 -1.292466
+v 3.486084 2.174018 0.000798
+v 3.486084 2.174018 0.000798
+v 3.486084 2.080430 0.000798
+v 3.486084 2.080430 0.000798
+v 3.077599 2.080430 -1.292466
+v 3.077599 2.080430 -1.292466
+v 1.220706 2.174018 0.716330
+v 1.220706 2.174018 0.716330
+v 1.220706 2.080430 0.716330
+v 1.220706 2.080430 0.716330
+v 0.812221 2.174018 -0.576934
+v 0.812221 2.174018 -0.576934
+v 0.812221 2.080430 -0.576934
+v 0.812221 2.080430 -0.576934
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.866186 2.080430 -0.491315
+v 0.866186 2.080430 -0.491315
+v 0.866186 2.080430 -0.491315
+v 0.844122 2.080430 -0.561169
+v 0.844122 2.080430 -0.561169
+v 1.241163 2.080430 0.695864
+v 1.241163 2.080430 0.695864
+v 0.866186 2.174018 -0.491315
+v 0.866186 2.174018 -0.491315
+v 0.866186 2.174018 -0.491315
+v 1.241163 2.174018 0.695864
+v 1.241163 2.174018 0.695864
+v 1.241163 2.174018 0.695864
+v 1.353509 2.080430 0.660380
+v 1.353509 2.080430 0.660380
+v 1.353509 2.174018 0.660380
+v 1.353509 2.174018 0.660380
+v 1.353509 2.174018 0.660380
+v 0.978532 2.174018 -0.526800
+v 0.978532 2.174018 -0.526800
+v 0.978532 2.174018 -0.526800
+v 0.866186 2.545954 -0.491315
+v 0.866186 2.545954 -0.491315
+v 0.866186 2.545954 -0.491315
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 1.241163 2.545954 0.695864
+v 1.241163 2.545954 0.695864
+v 1.353509 2.545954 0.660380
+v 1.353509 2.545954 0.660380
+v 0.956468 2.080430 -0.596654
+v 0.956468 2.080430 -0.596654
+v 0.956468 2.080430 -0.596654
+v 0.844122 2.174018 -0.561169
+v 0.844122 2.174018 -0.561169
+v 0.844122 2.174018 -0.561169
+v 0.956468 2.174018 -0.596654
+v 0.956468 2.174018 -0.596654
+v 0.956468 2.174018 -0.596654
+v 0.844122 2.545954 -0.561169
+v 0.844122 2.545954 -0.561169
+v 0.956468 2.545954 -0.596654
+v 0.956468 2.545954 -0.596654
+v 0.956468 2.545954 -0.596654
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.545954 -1.239183
+v 2.990720 2.545954 -1.239183
+v 2.990720 2.545954 -1.239183
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.174018 -1.264470
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.545954 -0.043953
+v 3.456284 2.545954 -0.043953
+v 1.510815 2.137595 0.037730
+v 1.349035 2.290844 -0.140367
+v 1.591464 2.172901 -0.233612
+v 1.784266 2.190338 -0.024086
+v 1.660990 2.319058 0.198652
+v 1.392003 2.381173 0.126783
+v 1.522500 2.438301 -0.312256
+v 1.791486 2.376186 -0.240387
+v 1.834455 2.466515 0.026763
+v 1.592026 2.584458 0.120008
+v 1.399223 2.567021 -0.089519
+v 1.672674 2.619764 -0.151334
+v 2.497889 2.137595 -0.044384
+v 2.336109 2.290844 -0.222481
+v 2.578538 2.172901 -0.315726
+v 2.771340 2.190338 -0.106200
+v 2.648064 2.319058 0.116538
+v 2.379078 2.381173 0.044669
+v 2.509574 2.438301 -0.394370
+v 2.778560 2.376186 -0.322502
+v 2.821529 2.466515 -0.055351
+v 2.579100 2.584458 0.037894
+v 2.386297 2.567021 -0.171633
+v 2.659748 2.619764 -0.233449
+v 2.006507 2.137595 -0.316138
+v 1.844727 2.290844 -0.494235
+v 2.087156 2.172901 -0.587479
+v 2.279958 2.190338 -0.377954
+v 2.156682 2.319058 -0.155216
+v 1.887695 2.381173 -0.227085
+v 2.018192 2.438301 -0.666124
+v 2.287179 2.376186 -0.594255
+v 2.330147 2.466515 -0.327105
+v 2.087718 2.584458 -0.233860
+v 1.894915 2.567021 -0.443387
+v 2.168366 2.619764 -0.505202
+v 2.833736 2.426006 -0.583306
+v 2.684991 2.845636 -1.079525
+v 2.757221 2.366194 -0.574572
+v 2.608476 2.785824 -1.070790
+v 2.749703 2.246832 -0.600498
+v 2.600958 2.666462 -1.096717
+v 2.818701 2.187281 -0.635161
+v 2.669955 2.606911 -1.131379
+v 2.895216 2.247093 -0.643896
+v 2.746471 2.666724 -1.140114
+v 2.902734 2.366456 -0.617969
+v 2.753989 2.786086 -1.114187
+v 3.047219 2.426006 -0.650736
+v 2.898475 2.845636 -1.146955
+v 2.970704 2.366194 -0.642001
+v 2.821959 2.785824 -1.138220
+v 2.963186 2.246832 -0.667928
+v 2.814442 2.666462 -1.164147
+v 3.032184 2.187281 -0.702591
+v 2.883439 2.606911 -1.198809
+v 3.108700 2.247093 -0.711326
+v 2.959954 2.666724 -1.207544
+v 3.116217 2.366456 -0.685399
+v 2.967472 2.786086 -1.181617
+v -1.172064 2.145742 0.102815
+v -1.274777 2.145742 0.043514
+v -1.274777 2.075523 -0.065804
+v -1.274777 2.111542 -0.065804
+v -1.077392 2.075523 0.048156
+v -1.077392 2.111542 0.048156
+v -1.077392 2.075523 0.276076
+v -1.077392 2.111542 0.276076
+v -1.274777 2.075523 0.390036
+v -1.274777 2.111542 0.390036
+v -1.472162 2.075523 0.276076
+v -1.472162 2.111542 0.276076
+v -1.472162 2.075523 0.048156
+v -1.472162 2.111542 0.048156
+v -1.172064 2.145742 0.221418
+v -1.274777 2.145742 0.280719
+v -1.377490 2.145742 0.221418
+v -1.377490 2.145742 0.102815
+v -1.238618 2.209867 0.141240
+v -1.274777 2.209867 0.120363
+v -1.238618 2.209867 0.182993
+v -1.274777 2.209867 0.203870
+v -1.310936 2.209867 0.182993
+v -1.310936 2.209867 0.141240
+v -1.238618 2.579231 0.141240
+v -1.274777 2.579231 0.120363
+v -1.238618 2.579231 0.182993
+v -1.274777 2.579231 0.203870
+v -1.310936 2.579231 0.182993
+v -1.310936 2.579231 0.141240
+v -1.188232 2.648486 0.112150
+v -1.274777 2.648486 0.062183
+v -1.188232 2.648486 0.212083
+v -1.274777 2.648486 0.262050
+v -1.361322 2.648486 0.212083
+v -1.361322 2.648486 0.112150
+v -1.124406 2.740827 0.075299
+v -1.274777 2.740827 -0.011518
+v -1.124406 2.740827 0.248933
+v -1.274777 2.740827 0.335750
+v -1.425149 2.740827 0.248933
+v -1.425149 2.740827 0.075299
+v -1.080861 2.912683 0.050158
+v -1.274777 2.912683 -0.061799
+v -1.080861 2.912683 0.274074
+v -1.274777 2.912683 0.386032
+v -1.468694 2.912683 0.274074
+v -1.468694 2.912683 0.050158
+v -1.080861 3.117886 0.050158
+v -1.274777 3.117886 -0.061799
+v -1.080861 3.117886 0.274074
+v -1.274777 3.117886 0.386032
+v -1.468694 3.117886 0.274074
+v -1.468694 3.117886 0.050158
+v -1.099921 3.127254 0.059737
+v -1.278856 3.127254 -0.043571
+v -1.099921 3.127254 0.266354
+v -1.278856 3.127254 0.369662
+v -1.457792 3.127254 0.266354
+v -1.457792 3.127254 0.059737
+v -1.278856 2.680948 0.163046
+v -1.922013 2.145742 -0.643475
+v -2.024726 2.145742 -0.702776
+v -2.024726 2.075523 -0.812093
+v -2.024726 2.111542 -0.812093
+v -1.827342 2.075523 -0.698134
+v -1.827342 2.111542 -0.698134
+v -1.827342 2.075523 -0.470213
+v -1.827342 2.111542 -0.470213
+v -2.024726 2.075523 -0.356253
+v -2.024726 2.111542 -0.356253
+v -2.222111 2.075523 -0.470213
+v -2.222111 2.111542 -0.470213
+v -2.222111 2.075523 -0.698134
+v -2.222111 2.111542 -0.698134
+v -1.922013 2.145742 -0.524872
+v -2.024726 2.145742 -0.465571
+v -2.127439 2.145742 -0.524872
+v -2.127439 2.145742 -0.643475
+v -1.988567 2.209867 -0.605050
+v -2.024726 2.209867 -0.625927
+v -1.988567 2.209867 -0.563297
+v -2.024726 2.209867 -0.542420
+v -2.060886 2.209867 -0.563297
+v -2.060886 2.209867 -0.605050
+v -1.988567 2.579231 -0.605050
+v -2.024726 2.579231 -0.625927
+v -1.988567 2.579231 -0.563297
+v -2.024726 2.579231 -0.542420
+v -2.060886 2.579231 -0.563297
+v -2.060886 2.579231 -0.605050
+v -1.938182 2.648486 -0.634140
+v -2.024726 2.648486 -0.684107
+v -1.938182 2.648486 -0.534207
+v -2.024726 2.648486 -0.484240
+v -2.111271 2.648486 -0.534207
+v -2.111271 2.648486 -0.634140
+v -1.874355 2.740827 -0.670991
+v -2.024726 2.740827 -0.757808
+v -1.874355 2.740827 -0.497356
+v -2.024726 2.740827 -0.410539
+v -2.175098 2.740827 -0.497356
+v -2.175098 2.740827 -0.670991
+v -1.830810 2.912683 -0.696131
+v -2.024726 2.912683 -0.808089
+v -1.830810 2.912683 -0.472216
+v -2.024726 2.912683 -0.360258
+v -2.218643 2.912683 -0.472216
+v -2.218643 2.912683 -0.696131
+v -1.830810 3.117886 -0.696131
+v -2.024726 3.117886 -0.808089
+v -1.830810 3.117886 -0.472216
+v -2.024726 3.117886 -0.360258
+v -2.218643 3.117886 -0.472216
+v -2.218643 3.117886 -0.696131
+v -1.849871 3.127254 -0.686552
+v -2.028805 3.127254 -0.789860
+v -1.849871 3.127254 -0.479936
+v -2.028805 3.127254 -0.376628
+v -2.207741 3.127254 -0.479936
+v -2.207741 3.127254 -0.686552
+v -2.028805 2.680948 -0.583244
+v -3.080822 2.145742 0.848455
+v -3.183535 2.145742 0.789153
+v -3.183535 2.075523 0.679836
+v -3.183535 2.111542 0.679836
+v -2.986151 2.075523 0.793796
+v -2.986151 2.111542 0.793796
+v -2.986151 2.075523 1.021716
+v -2.986151 2.111542 1.021716
+v -3.183535 2.075523 1.135676
+v -3.183535 2.111542 1.135676
+v -3.380919 2.075523 1.021716
+v -3.380919 2.111542 1.021716
+v -3.380919 2.075523 0.793796
+v -3.380919 2.111542 0.793796
+v -3.080822 2.145742 0.967057
+v -3.183535 2.145742 1.026358
+v -3.286248 2.145742 0.967057
+v -3.286248 2.145742 0.848455
+v -3.147376 2.209867 0.886879
+v -3.183535 2.209867 0.866003
+v -3.147376 2.209867 0.928633
+v -3.183535 2.209867 0.949509
+v -3.219694 2.209867 0.928633
+v -3.219694 2.209867 0.886879
+v -3.147376 2.579231 0.886879
+v -3.183535 2.579231 0.866003
+v -3.147376 2.579231 0.928633
+v -3.183535 2.579231 0.949509
+v -3.219694 2.579231 0.928633
+v -3.219694 2.579231 0.886879
+v -3.096991 2.648486 0.857789
+v -3.183535 2.648486 0.807823
+v -3.096991 2.648486 0.957723
+v -3.183535 2.648486 1.007689
+v -3.270080 2.648486 0.957723
+v -3.270080 2.648486 0.857789
+v -3.033164 2.740827 0.820939
+v -3.183534 2.740827 0.734122
+v -3.033164 2.740827 0.994573
+v -3.183534 2.740827 1.081390
+v -3.333907 2.740827 0.994573
+v -3.333907 2.740827 0.820939
+v -2.989619 2.912683 0.795798
+v -3.183534 2.912683 0.683840
+v -2.989619 2.912683 1.019714
+v -3.183534 2.912683 1.131672
+v -3.377452 2.912683 1.019714
+v -3.377452 2.912683 0.795798
+v -2.989619 3.117886 0.795798
+v -3.183534 3.117886 0.683840
+v -2.989619 3.117886 1.019714
+v -3.183534 3.117886 1.131672
+v -3.377452 3.117886 1.019714
+v -3.377452 3.117886 0.795798
+v -3.008679 3.127254 0.805377
+v -3.187614 3.127254 0.702069
+v -3.008679 3.127254 1.011994
+v -3.187614 3.127254 1.115302
+v -3.366550 3.127254 1.011994
+v -3.366550 3.127254 0.805377
+v -3.187614 2.680948 0.908685
+v 4.401308 3.617208 3.580229
+v 4.401308 -0.025686 3.580229
+v 4.401308 3.792680 3.528995
+v 4.401308 4.260199 3.059984
+v 4.401308 5.051156 -0.716959
+v 4.401308 4.593092 -1.289192
+vt 0.905299 0.942320
+vt 0.533523 0.942320
+vt 0.905299 0.919749
+vt 0.890688 0.972537
+vt 0.606224 0.972537
+vt 0.905301 0.957852
+vt 0.863038 0.512341
+vt 0.863038 0.667779
+vt 0.707599 0.667779
+vt 0.915821 0.578064
+vt 0.915821 0.985620
+vt 0.508265 0.985620
+vt 0.707599 0.979117
+vt 0.707599 0.823679
+vt 0.863038 0.979117
+vt 0.863038 0.668010
+vt 0.863038 0.823448
+vt 0.707599 0.823448
+vt 0.606226 0.942743
+vt 0.890679 0.942743
+vt 0.533523 0.957429
+vt 0.700713 0.854870
+vt 0.985176 0.854869
+vt 0.905300 0.896755
+vt 0.636824 0.703297
+vt 0.921287 0.703296
+vt 0.935900 0.776011
+vt 0.535960 0.512341
+vt 0.707368 0.512341
+vt 0.535960 0.715489
+vt 0.533523 0.896755
+vt 0.905300 0.919326
+vt 0.999789 0.869555
+vt 0.999789 0.892126
+vt 0.599209 0.831876
+vt 0.912899 0.831876
+vt 0.599209 0.854446
+vt 0.710700 0.504901
+vt 0.710700 0.981434
+vt 0.702383 0.504933
+vt 0.699950 0.504898
+vt 0.699800 0.981445
+vt 0.691482 0.981475
+vt 0.691633 0.504928
+vt 0.680581 0.981472
+vt 0.702383 0.981467
+vt 0.691482 0.504933
+vt 0.674847 0.504998
+vt 0.674847 0.981532
+vt 0.663946 0.981532
+vt 0.680731 0.504924
+vt 0.672263 0.981502
+vt 0.691482 0.981467
+vt 0.683164 0.504966
+vt 0.683164 0.981499
+vt 0.672414 0.504954
+vt 0.664096 0.504984
+vt 0.708268 0.504868
+vt 0.708118 0.981416
+vt 0.719169 0.504872
+vt 0.719019 0.981419
+vt 0.719017 0.504868
+vt 0.719018 0.981402
+vt 0.657579 0.583164
+vt 0.894968 0.583164
+vt 0.894968 0.599545
+vt 0.746642 0.950201
+vt 0.875496 0.950201
+vt 0.875496 0.966582
+vt 0.894968 0.624058
+vt 0.657579 0.624058
+vt 0.894968 0.607677
+vt 0.875496 0.983360
+vt 0.746642 0.983360
+vt 0.875496 0.966979
+vt 0.528328 0.755451
+vt 0.765717 0.755451
+vt 0.765717 0.884305
+vt 0.528328 0.755055
+vt 0.528328 0.517666
+vt 0.657182 0.517666
+vt 0.875496 0.755055
+vt 0.657579 0.755055
+vt 0.657579 0.689953
+vt 0.746642 0.983757
+vt 0.964561 0.983757
+vt 0.964561 0.990147
+vt 0.888717 0.600889
+vt 0.888718 0.607280
+vt 0.875895 0.600889
+vt 0.957855 0.949804
+vt 0.739939 0.949804
+vt 0.957855 0.933423
+vt 0.895502 0.534047
+vt 0.889111 0.534047
+vt 0.889111 0.517666
+vt 0.528328 0.950201
+vt 0.746245 0.950201
+vt 0.746245 0.966582
+vt 0.657579 0.600889
+vt 0.875499 0.600890
+vt 0.875499 0.607280
+vt 0.765717 0.884702
+vt 0.765717 0.891093
+vt 0.752895 0.891092
+vt 0.889006 0.755451
+vt 0.895396 0.755451
+vt 0.895396 0.820553
+vt 0.657579 0.517666
+vt 0.875496 0.517666
+vt 0.657579 0.582767
+vt 0.895502 0.582767
+vt 0.889112 0.582767
+vt 0.895502 0.566386
+vt 0.882219 0.755451
+vt 0.888609 0.755451
+vt 0.882219 0.820553
+vt 0.881822 0.886448
+vt 0.881822 0.899271
+vt 0.766114 0.899271
+vt 0.888715 0.517666
+vt 0.888715 0.582767
+vt 0.875892 0.517666
+vt 0.881822 0.820950
+vt 0.881822 0.886052
+vt 0.766114 0.886052
+vt 0.895231 0.641232
+vt 0.895231 0.657614
+vt 0.882409 0.641232
+vt 0.901828 0.891002
+vt 0.889006 0.891002
+vt 0.889006 0.886449
+vt 0.893665 0.738673
+vt 0.893665 0.755055
+vt 0.889112 0.738673
+vt 0.984897 0.624454
+vt 0.984897 0.640836
+vt 0.869190 0.624454
+vt 0.984897 0.673175
+vt 0.984897 0.689556
+vt 0.869190 0.689556
+vt 0.881822 0.755451
+vt 0.881822 0.820553
+vt 0.766114 0.755451
+vt 0.984897 0.659956
+vt 0.984897 0.672778
+vt 0.869190 0.672778
+vt 0.875892 0.755055
+vt 0.875893 0.689953
+vt 0.888715 0.689953
+vt 0.869190 0.657614
+vt 0.869190 0.641232
+vt 0.882012 0.641232
+vt 0.657579 0.689556
+vt 0.657579 0.624454
+vt 0.868793 0.624454
+vt 0.893559 0.820950
+vt 0.893559 0.886052
+vt 0.889006 0.820950
+vt 0.889111 0.544658
+vt 0.901934 0.544658
+vt 0.889111 0.549212
+vt 0.528328 0.949804
+vt 0.528328 0.884702
+vt 0.739542 0.949804
+vt 0.882219 0.886051
+vt 0.882219 0.820950
+vt 0.886772 0.820950
+vt 0.889111 0.565989
+vt 0.889112 0.549608
+vt 0.893665 0.549608
+vt 0.528328 0.976483
+vt 0.528328 0.971929
+vt 0.739540 0.971929
+vt 0.528328 0.971533
+vt 0.528328 0.966979
+vt 0.739540 0.966979
+vt 0.739939 0.916248
+vt 0.739939 0.899867
+vt 0.951152 0.916248
+vt 0.739939 0.933026
+vt 0.739939 0.916645
+vt 0.951152 0.916645
+vt 0.288599 0.586905
+vt 0.263686 0.622200
+vt 0.255994 0.605150
+vt 0.308778 0.621073
+vt 0.416738 0.556495
+vt 0.402006 0.581949
+vt 0.401971 0.548587
+vt 0.410397 0.513377
+vt 0.328955 0.603326
+vt 0.288644 0.660434
+vt 0.256022 0.650593
+vt 0.361632 0.586905
+vt 0.401971 0.598571
+vt 0.381766 0.626266
+vt 0.329010 0.596747
+vt 0.336674 0.625139
+vt 0.328982 0.648769
+vt 0.401943 0.644014
+vt 0.328982 0.642190
+vt 0.423079 0.513377
+vt 0.431506 0.548587
+vt 0.361587 0.660434
+vt 0.431470 0.581949
+vt 0.058872 0.514455
+vt 0.033648 0.579711
+vt 0.060007 0.526490
+vt 0.057959 0.590632
+vt 0.101326 0.507643
+vt 0.098280 0.547934
+vt 0.058446 0.652807
+vt 0.059718 0.615219
+vt 0.102501 0.569863
+vt 0.125087 0.582568
+vt 0.097551 0.631974
+vt 0.100043 0.648601
+vt 0.288599 0.513377
+vt 0.263686 0.548671
+vt 0.255994 0.531621
+vt 0.308778 0.547544
+vt 0.431506 0.630024
+vt 0.416774 0.655477
+vt 0.416738 0.622116
+vt 0.425165 0.586905
+vt 0.328955 0.529797
+vt 0.288644 0.586905
+vt 0.256022 0.577064
+vt 0.361632 0.513377
+vt 0.401971 0.525042
+vt 0.381766 0.552738
+vt 0.329010 0.523218
+vt 0.336674 0.551611
+vt 0.328982 0.575240
+vt 0.401943 0.570485
+vt 0.328982 0.568661
+vt 0.408312 0.586905
+vt 0.416738 0.622115
+vt 0.401971 0.630023
+vt 0.361588 0.586905
+vt 0.416703 0.655477
+vt 0.373139 0.405595
+vt 0.266846 0.405755
+vt 0.372364 0.382592
+vt 0.265891 0.382261
+vt 0.380766 0.365849
+vt 0.274024 0.364779
+vt 0.390004 0.372272
+vt 0.283166 0.370938
+vt 0.390970 0.395797
+vt 0.284319 0.394978
+vt 0.382504 0.412368
+vt 0.276129 0.412304
+vt 0.387980 0.449935
+vt 0.281849 0.450540
+vt 0.387016 0.426417
+vt 0.280686 0.426474
+vt 0.395511 0.409928
+vt 0.288902 0.409221
+vt 0.405043 0.417158
+vt 0.298351 0.416223
+vt 0.406207 0.441227
+vt 0.299725 0.440869
+vt 0.397635 0.457505
+vt 0.291436 0.457923
+vt 0.125099 0.179064
+vt 0.140481 0.179064
+vt 0.135498 0.187381
+vt 0.147570 0.174628
+vt 0.118010 0.174628
+vt 0.162351 0.169957
+vt 0.162351 0.174628
+vt 0.148172 0.179064
+vt 0.138205 0.187381
+vt 0.110516 0.153916
+vt 0.102583 0.168696
+vt 0.102583 0.154518
+vt 0.147570 0.169957
+vt 0.127375 0.187381
+vt 0.130082 0.187381
+vt 0.130082 0.235286
+vt 0.118010 0.169957
+vt 0.103229 0.174628
+vt 0.094650 0.124355
+vt 0.102583 0.109575
+vt 0.098455 0.131444
+vt 0.103229 0.169957
+vt 0.110516 0.124355
+vt 0.106711 0.131444
+vt 0.117408 0.179064
+vt 0.094650 0.153916
+vt 0.098455 0.146827
+vt 0.127375 0.235286
+vt 0.126310 0.244268
+vt 0.138205 0.235286
+vt 0.135498 0.235286
+vt 0.119829 0.244268
+vt 0.110270 0.256245
+vt 0.139270 0.244268
+vt 0.144050 0.256245
+vt 0.121530 0.256245
+vt 0.147311 0.278534
+vt 0.145751 0.244268
+vt 0.155310 0.256245
+vt 0.118269 0.278534
+vt 0.147311 0.305148
+vt 0.101543 0.235066
+vt 0.072502 0.235066
+vt 0.073503 0.236281
+vt 0.103749 0.278534
+vt 0.118269 0.305148
+vt 0.161831 0.278534
+vt 0.161831 0.305148
+vt 0.102583 0.110094
+vt 0.110377 0.124615
+vt 0.109611 0.125616
+vt 0.110377 0.153656
+vt 0.102583 0.168177
+vt 0.109611 0.152414
+vt 0.116063 0.235066
+vt 0.100301 0.236281
+vt 0.057981 0.235066
+vt 0.086902 0.178396
+vt 0.060104 0.236281
+vt 0.113699 0.236281
+vt 0.102583 0.123753
+vt 0.533523 0.919749
+vt 0.533523 0.957852
+vt 0.707599 0.512341
+vt 0.508265 0.578064
+vt 0.863038 0.823679
+vt 0.707599 0.668010
+vt 0.905292 0.957429
+vt 0.622211 0.776012
+vt 0.707368 0.715489
+vt 0.533523 0.919326
+vt 0.912899 0.854447
+vt 0.663946 0.504998
+vt 0.657579 0.599545
+vt 0.746642 0.966582
+vt 0.657579 0.607677
+vt 0.746642 0.966979
+vt 0.528328 0.884305
+vt 0.657182 0.755055
+vt 0.875496 0.689953
+vt 0.746642 0.990146
+vt 0.875896 0.607280
+vt 0.739939 0.933423
+vt 0.895502 0.517666
+vt 0.528328 0.966582
+vt 0.657579 0.607279
+vt 0.752895 0.884702
+vt 0.889006 0.820553
+vt 0.875496 0.582767
+vt 0.889111 0.566386
+vt 0.888609 0.820553
+vt 0.766114 0.886448
+vt 0.875892 0.582767
+vt 0.766114 0.820950
+vt 0.882409 0.657614
+vt 0.901828 0.886449
+vt 0.889112 0.755055
+vt 0.869190 0.640836
+vt 0.869190 0.673175
+vt 0.766114 0.820553
+vt 0.869190 0.659956
+vt 0.888715 0.755055
+vt 0.882012 0.657614
+vt 0.868793 0.689556
+vt 0.889006 0.886052
+vt 0.901934 0.549212
+vt 0.739542 0.884702
+vt 0.886772 0.886051
+vt 0.893665 0.565989
+vt 0.739540 0.976483
+vt 0.739540 0.971533
+vt 0.951152 0.899867
+vt 0.951152 0.933026
+vt 0.106711 0.146827
+vt 0.103749 0.305148
+vt 0.102419 0.112218
+vt 0.102419 0.165813
+vt 0.176655 0.902678
+vt 0.177195 0.893095
+vt 0.017048 0.894869
+vt 0.175049 0.789769
+vt 0.175642 0.911615
+vt 0.019454 0.789409
+vt 0.172299 0.777935
+vt 0.019488 0.777616
+vt 0.194225 0.892858
+vt 0.188367 0.779011
+vt 0.220229 0.892814
+vt 0.185989 0.902579
+vt 0.183371 0.911603
+vt 0.212963 0.780571
+vt 0.379965 0.900404
+vt 0.183492 0.789933
+vt 0.210776 0.911687
+vt 0.218479 0.901319
+vt 0.367145 0.793339
+vt 0.391357 0.794319
+vt 0.213720 0.792797
+vt 0.370492 0.908704
+vt 0.367608 0.800840
+vt 0.406722 0.906137
+vt 0.410730 0.918007
+vt 0.394868 0.799588
+vt 0.378842 0.909853
+vt 0.013364 0.906932
+vt 0.017669 0.909263
+vt 0.396496 0.908115
+vn -1.000000 0.000000 0.000000
+vn 0.030915 -0.999512 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn -0.999969 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.030915 -0.999512 0.000000
+vn 0.000000 -0.995025 0.099399
+vn 0.707327 -0.135258 -0.693808
+vn 0.000000 -0.999786 -0.020051
+vn 0.000000 0.999969 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.707083 0.000000 -0.707083
+vn 0.000000 -0.191351 -0.981506
+vn 0.000000 0.000000 -0.999969
+vn -0.866024 0.000000 0.499985
+vn 0.866024 0.000000 -0.499985
+vn 0.866024 0.000000 0.499985
+vn -0.866024 0.000000 -0.499985
+vn -0.499985 0.000000 0.866024
+vn 0.499985 0.000000 0.866024
+vn 0.953551 0.000000 -0.301187
+vn 0.301187 0.000000 0.953551
+vn -0.953551 0.000000 0.301187
+vn -0.301187 0.000000 -0.953551
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -0.999969 0.000000
+vn 0.301157 0.000000 0.953551
+vn -0.953551 0.000000 0.301157
+vn 0.953551 0.000000 -0.301157
+vn -0.298288 -0.888577 0.348430
+vn -0.894589 -0.323740 -0.307993
+vn -0.001007 -0.758446 -0.651692
+vn -0.736198 0.009186 0.676656
+vn 0.709586 -0.694174 0.120579
+vn 0.255226 -0.219733 0.941557
+vn -0.709586 0.694174 -0.120579
+vn -0.255226 0.219733 -0.941557
+vn 0.736198 -0.009186 -0.676656
+vn 0.894589 0.323740 0.307993
+vn 0.001007 0.758446 0.651692
+vn 0.298288 0.888577 -0.348430
+vn 0.251289 0.471114 0.845485
+vn -0.060549 0.978484 -0.197150
+vn -0.463698 0.077792 0.882565
+vn -0.814905 0.548326 -0.187719
+vn -0.577136 -0.550829 0.602893
+vn -0.871090 -0.080203 -0.484451
+vn 0.060549 -0.978484 0.197150
+vn -0.251289 -0.471114 -0.845485
+vn 0.814905 -0.548326 0.187719
+vn 0.463698 -0.077792 -0.882565
+vn 0.871090 0.080203 0.484451
+vn 0.577136 0.550829 -0.602893
+vn 0.369091 0.904630 0.213080
+vn 0.369091 0.904630 -0.213080
+vn 0.756615 0.486465 -0.436842
+vn -0.741844 0.515915 -0.428297
+vn -0.741844 0.515915 0.428297
+vn -0.369091 0.904630 -0.213080
+vn 0.000000 -0.609973 -0.792383
+vn 0.000000 0.515915 -0.856624
+vn 0.741844 0.515915 -0.428297
+vn 0.000000 0.904630 -0.426191
+vn 0.000000 0.486465 -0.873653
+vn 0.686239 -0.609973 -0.396191
+vn 0.741844 0.515915 0.428297
+vn 0.000000 0.486465 0.873653
+vn 0.756615 0.486465 0.436842
+vn 0.799799 -0.383435 0.461776
+vn 0.686239 -0.609973 0.396191
+vn 0.000000 0.515915 0.856624
+vn -0.369091 0.904630 0.213080
+vn 0.000000 -0.609973 0.792383
+vn -0.686239 -0.609973 0.396191
+vn -0.686239 -0.609973 -0.396191
+vn 0.000000 0.904630 0.426191
+vn -0.756615 0.486465 -0.436842
+vn 0.000000 -0.383435 0.923551
+vn 0.671407 -0.631581 0.387646
+vn 0.000000 -0.383435 -0.923551
+vn -0.756615 0.486465 0.436842
+vn -0.799799 -0.383435 0.461776
+vn 0.799799 -0.383435 -0.461776
+vn -0.799799 -0.383435 -0.461776
+vn 0.000000 -0.631581 0.775292
+vn 0.000000 -0.437361 0.899258
+vn 0.671407 -0.631581 -0.387646
+vn -0.671407 -0.631581 -0.387646
+vn -0.671407 -0.631581 0.387646
+vn -0.778771 -0.437361 -0.449629
+vn -0.778771 -0.437361 0.449629
+vn -0.857967 -0.135868 -0.495346
+vn 0.000000 -0.631581 -0.775292
+vn 0.000000 -0.437361 -0.899258
+vn 0.778771 -0.437361 -0.449629
+vn -0.857967 -0.135868 0.495346
+vn -0.779931 0.421735 -0.462386
+vn 0.778771 -0.437361 0.449629
+vn 0.857967 -0.135868 0.495346
+vn 0.857967 -0.135868 -0.495346
+vn -0.787530 0.409497 0.460494
+vn -0.009552 0.999756 -0.018677
+vn 0.000000 -0.135868 0.990722
+vn 0.765709 0.473769 0.434980
+vn 0.000000 -0.135868 -0.990722
+vn 0.010376 0.459670 -0.887997
+vn 0.761406 0.479019 -0.436720
+vn 0.012177 0.444380 0.895718
+vn -0.108676 0.993500 -0.033326
+vn -0.111728 0.992309 0.052675
+vn -0.008026 0.998871 0.046297
+vn -0.051759 0.997345 -0.051119
+vn -0.043825 0.995819 0.080111
+vn 0.000000 0.486465 -0.873684
+vn 0.671438 -0.631581 0.387646
+vn 0.756615 0.486496 -0.436842
+vn 0.756615 0.486496 0.436842
+vn -0.051790 0.997345 -0.051088
+vn 0.667287 0.139409 0.731620
+vn 0.707083 0.000000 0.707083
+vn -0.740379 -0.095126 -0.665365
+vn 0.000000 -0.141545 -0.989929
+vn -0.707083 0.000000 -0.707083
+vn -0.667287 0.139409 0.731620
+vn -0.707083 0.000000 0.707083
+vn 0.663778 0.411603 0.624439
+vn -0.663778 0.411603 0.624439
+vn 0.646870 0.674490 0.355785
+vn 0.000000 -0.510300 -0.859981
+vn -0.646870 0.674490 0.355785
+vn 0.625416 0.759117 -0.180425
+vn -0.767602 -0.327036 -0.551164
+vn 0.000000 -0.879910 -0.475112
+vn 0.999969 0.000000 0.000000
+vn -0.625416 0.759117 -0.180425
+vn -0.571825 0.061678 -0.818018
+vn -0.777123 -0.553728 -0.298990
+vn 0.000000 -0.972655 0.232154
+vn -0.816797 -0.561113 0.133915
+vn 0.571825 0.061678 -0.818018
+vn 0.726402 -0.475723 -0.495926
+vn -0.582202 -0.811274 -0.053255
+vn 0.000000 -0.780663 0.624897
+s 1
+f 41/1/1 38/2/1 45/3/1
+f 31/4/2 27/5/2 40/6/2
+f 1/7/3 5/8/3 6/9/3
+f 21/10/4 22/11/4 7/12/4
+f 25/13/1 26/14/5 29/15/1
+f 18/16/6 17/17/6 4/18/6
+f 23/19/7 19/20/7 10/21/7
+f 20/22/8 32/23/8 33/24/9
+f 28/25/10 24/26/10 34/27/10
+f 13/28/11 16/29/12 14/30/12
+f 35/31/3 33/24/9 42/32/13
+f 33/24/9 12/33/14 46/34/15
+f 39/35/4 36/36/4 48/37/4
+f 67/38/4 68/39/4 69/40/16
+f 51/41/6 52/42/6 54/43/17
+f 53/44/17 54/43/17 56/45/18
+f 69/40/16 70/46/16 71/47/19
+f 63/48/17 64/49/17 66/50/3
+f 55/51/18 56/45/18 58/52/4
+f 71/47/19 72/53/19 50/54/6
+f 50/54/6 49/55/6 64/49/17
+f 57/56/4 58/52/4 59/57/20
+f 61/58/19 62/59/19 51/41/6
+f 100/60/1 99/61/1 61/58/19
+f 98/62/21 97/63/21 68/39/4
+f 105/64/22 106/65/22 102/66/22
+f 147/67/23 107/68/23 103/69/23
+f 153/70/24 108/71/24 155/72/24
+f 157/73/25 145/74/25 159/75/25
+f 152/76/26 150/77/26 156/78/27
+f 158/79/12 154/80/12 148/81/12
+f 180/82/22 183/83/22 189/84/22
+f 116/85/27 115/86/27 114/87/26
+f 117/88/12 120/89/12 125/90/11
+f 110/91/24 109/92/24 170/93/24
+f 111/94/28 175/95/28 171/96/28
+f 112/97/22 182/98/22 179/99/22
+f 186/100/12 118/101/12 119/102/12
+f 162/103/26 165/104/26 123/105/27
+f 176/106/28 181/107/28 196/108/28
+f 172/109/24 177/110/24 187/111/24
+f 121/112/25 122/113/25 168/114/25
+f 203/115/25 200/116/25 208/117/25
+f 209/118/12 190/119/12 218/120/12
+f 173/121/29 188/122/29 201/123/29
+f 192/124/23 184/125/23 127/126/23
+f 167/127/29 174/128/29 169/129/29
+f 214/130/26 222/131/26 243/132/26
+f 131/133/25 130/134/25 137/135/25
+f 198/136/25 204/137/25 223/138/25
+f 185/139/23 163/140/23 128/141/23
+f 205/142/25 210/143/25 225/144/25
+f 164/145/26 199/146/26 224/147/27
+f 135/148/30 237/149/30 231/150/30
+f 133/151/30 134/152/30 244/153/30
+f 238/154/22 241/155/22 144/156/22
+f 227/157/25 229/158/25 232/159/25
+f 230/160/12 219/161/12 246/162/12
+f 220/163/24 212/164/24 141/165/24
+f 252/166/23 248/167/23 257/168/23
+f 247/169/23 140/170/23 143/171/23
+f 215/172/26 235/173/27 254/174/26
+f 242/175/12 221/176/12 253/177/11
+f 213/178/24 216/179/24 249/180/24
+f 236/181/22 239/182/22 258/183/22
+f 261/184/31 262/185/32 263/186/33
+f 262/185/32 261/184/31 266/187/34
+f 261/188/31 263/189/33 264/190/35
+f 261/188/31 264/190/35 265/191/36
+f 261/184/31 265/192/36 266/187/34
+f 262/185/32 266/187/34 271/193/37
+f 263/186/33 262/185/32 267/194/38
+f 264/195/35 263/196/33 268/197/39
+f 265/198/36 264/195/35 269/199/40
+f 266/187/34 265/192/36 270/200/41
+f 262/185/32 271/193/37 267/194/38
+f 263/196/33 267/201/38 268/197/39
+f 264/195/35 268/197/39 269/199/40
+f 265/198/36 269/199/40 270/202/41
+f 266/187/34 270/200/41 271/193/37
+f 267/203/38 271/204/37 272/188/42
+f 268/197/39 267/201/38 272/205/42
+f 269/199/40 268/197/39 272/205/42
+f 270/202/41 269/199/40 272/205/42
+f 271/204/37 270/206/41 272/188/42
+f 273/207/31 274/208/32 275/209/33
+f 274/208/32 273/207/31 278/210/34
+f 273/207/31 275/209/33 276/211/35
+f 273/207/31 276/211/35 277/212/36
+f 273/207/31 277/212/36 278/210/34
+f 274/208/32 278/210/34 283/213/37
+f 275/209/33 274/208/32 279/214/38
+f 276/211/35 275/209/33 280/215/39
+f 277/212/36 276/211/35 281/216/40
+f 278/210/34 277/212/36 282/217/41
+f 274/208/32 283/213/37 279/214/38
+f 275/209/33 279/214/38 280/215/39
+f 276/211/35 280/215/39 281/216/40
+f 277/212/36 281/216/40 282/217/41
+f 278/210/34 282/217/41 283/213/37
+f 279/214/38 283/213/37 284/218/42
+f 280/215/39 279/214/38 284/218/42
+f 281/216/40 280/215/39 284/218/42
+f 282/217/41 281/216/40 284/218/42
+f 283/213/37 282/217/41 284/218/42
+f 285/219/31 286/220/32 287/221/33
+f 286/220/32 285/219/31 290/222/34
+f 285/223/31 287/224/33 288/225/35
+f 285/223/31 288/225/35 289/226/36
+f 285/219/31 289/227/36 290/222/34
+f 286/220/32 290/222/34 295/228/37
+f 287/221/33 286/220/32 291/229/38
+f 288/230/35 287/231/33 292/232/39
+f 289/233/36 288/230/35 293/234/40
+f 290/222/34 289/227/36 294/235/41
+f 286/220/32 295/228/37 291/229/38
+f 287/231/33 291/236/38 292/232/39
+f 288/230/35 292/232/39 293/234/40
+f 289/233/36 293/234/40 294/237/41
+f 290/222/34 294/235/41 295/228/37
+f 291/238/38 295/239/37 296/240/42
+f 292/232/39 291/236/38 296/241/42
+f 293/234/40 292/232/39 296/241/42
+f 294/237/41 293/234/40 296/241/42
+f 295/239/37 294/242/41 296/240/42
+f 297/243/43 298/244/44 299/245/45
+f 299/245/45 300/246/46 301/247/47
+f 301/247/47 302/248/48 303/249/49
+f 303/249/49 304/250/50 305/251/51
+f 302/248/48 306/252/52 304/250/50
+f 307/253/53 308/254/54 297/243/43
+f 305/251/51 306/252/52 307/253/53
+f 297/243/43 299/245/45 307/253/53
+f 309/255/43 310/256/44 311/257/45
+f 311/257/45 312/258/46 313/259/47
+f 313/259/47 314/260/48 315/261/49
+f 315/261/49 316/262/50 317/263/51
+f 314/260/48 318/264/52 316/262/50
+f 319/265/53 320/266/54 309/255/43
+f 317/263/51 318/264/52 319/265/53
+f 309/255/43 311/257/45 319/265/53
+f 335/267/55 321/268/56 339/269/57
+f 334/270/58 332/271/59 338/268/60
+f 323/272/61 324/273/62 326/270/63
+f 322/274/64 338/268/60 340/275/65
+f 326/276/63 324/277/62 322/278/64
+f 325/279/66 326/270/63 328/271/67
+f 342/280/68 341/281/69 347/282/70
+f 328/271/67 326/270/63 321/268/56
+f 327/283/71 328/271/67 330/284/72
+f 332/285/59 330/286/72 337/287/73
+f 321/268/56 322/274/64 339/269/57
+f 329/288/74 330/284/72 331/283/75
+f 330/286/72 328/289/67 335/290/55
+f 333/279/76 334/270/58 323/272/61
+f 331/283/75 332/271/59 333/279/76
+f 336/291/77 335/267/55 341/281/69
+f 324/277/62 334/292/58 338/293/60
+f 323/277/61 325/276/66 333/292/76
+f 337/267/73 336/291/77 342/280/68
+f 338/268/60 337/267/73 344/269/78
+f 348/294/79 347/282/70 353/295/80
+f 339/269/57 340/275/65 346/296/81
+f 340/275/65 344/269/78 346/296/81
+f 343/281/82 342/280/68 349/282/83
+f 341/281/69 339/269/57 345/297/84
+f 344/269/78 343/281/82 350/297/85
+f 354/298/86 353/295/80 360/299/87
+f 345/297/84 346/296/81 351/300/88
+f 346/296/81 350/297/85 356/300/89
+f 349/282/83 348/294/79 355/295/90
+f 347/282/70 345/297/84 351/300/88
+f 350/297/85 349/282/83 356/300/89
+f 362/301/91 361/302/92 368/303/93
+f 351/300/88 352/304/94 358/305/95
+f 352/304/94 356/300/89 358/305/95
+f 355/295/90 354/298/86 361/302/92
+f 353/295/80 351/300/88 357/301/96
+f 356/300/89 355/295/90 362/301/91
+f 368/303/93 367/306/97 374/307/98
+f 360/299/87 359/302/99 365/306/100
+f 357/301/96 358/305/95 363/303/101
+f 358/305/95 362/301/91 368/303/93
+f 361/302/92 360/299/87 367/306/97
+f 359/302/99 357/301/96 363/303/101
+f 374/308/98 373/309/102 379/310/103
+f 366/311/104 365/306/100 371/312/105
+f 363/303/101 364/313/106 370/314/107
+f 364/313/106 368/303/93 370/314/107
+f 367/306/97 366/311/104 373/312/102
+f 365/306/100 363/303/101 369/307/108
+f 372/315/109 371/316/105 377/317/110
+f 369/318/108 370/319/107 375/320/111
+f 370/321/107 374/308/98 380/322/112
+f 373/309/102 372/323/109 379/310/103
+f 371/309/105 369/308/108 375/322/111
+f 380/322/112 379/310/103 381/324/12
+f 378/325/113 377/310/110 381/324/12
+f 375/322/111 376/326/114 381/324/12
+f 376/326/114 380/322/112 381/324/12
+f 379/310/103 378/325/113 381/324/12
+f 377/310/110 375/322/111 381/324/12
+f 396/267/55 382/268/56 400/269/57
+f 395/270/58 393/271/59 399/268/60
+f 384/272/61 385/273/62 387/270/63
+f 383/274/64 399/268/60 401/275/115
+f 387/276/63 385/277/62 383/278/64
+f 386/279/66 387/270/63 389/271/67
+f 403/280/68 402/281/69 408/282/70
+f 389/271/67 387/270/63 382/268/56
+f 388/283/71 389/271/67 391/284/72
+f 393/285/59 391/286/72 398/287/73
+f 382/268/56 383/274/64 400/269/57
+f 390/288/74 391/284/72 392/283/75
+f 391/286/72 389/289/67 397/327/77
+f 394/279/76 395/270/58 384/272/61
+f 392/283/75 393/271/59 394/279/76
+f 397/291/77 396/267/55 402/281/69
+f 385/277/62 395/292/58 383/278/64
+f 384/277/61 386/276/66 394/292/76
+f 398/267/73 397/291/77 404/281/82
+f 399/268/60 398/267/73 405/269/78
+f 409/294/79 408/282/70 414/295/116
+f 400/269/57 401/275/115 407/296/81
+f 401/275/115 405/269/78 407/296/81
+f 404/281/82 403/280/68 410/282/83
+f 402/281/69 400/269/57 406/297/84
+f 405/269/78 404/281/82 411/297/85
+f 415/298/86 414/295/116 420/302/99
+f 406/297/84 407/296/81 412/300/88
+f 407/296/81 411/297/85 417/300/89
+f 410/282/83 409/294/79 416/295/90
+f 408/282/70 406/297/84 412/300/88
+f 411/297/85 410/282/83 417/300/89
+f 423/301/91 422/302/92 429/303/93
+f 412/300/88 413/304/94 419/305/95
+f 413/304/94 417/300/89 423/301/91
+f 416/295/90 415/298/86 422/302/92
+f 414/295/116 412/300/88 418/301/96
+f 417/300/89 416/295/90 423/301/91
+f 429/303/93 428/306/97 435/307/98
+f 421/299/87 420/302/99 426/306/100
+f 418/301/96 419/305/95 425/313/106
+f 419/305/95 423/301/91 425/313/106
+f 422/302/92 421/299/87 428/306/97
+f 420/302/99 418/301/96 424/303/101
+f 435/308/98 434/309/102 440/310/103
+f 427/311/104 426/306/100 432/312/105
+f 424/303/101 425/313/106 431/314/107
+f 425/313/106 429/303/93 431/314/107
+f 428/306/97 427/311/104 434/312/102
+f 426/306/100 424/303/101 430/307/108
+f 433/315/109 432/316/105 438/317/110
+f 430/318/108 431/319/107 436/320/111
+f 431/321/107 435/308/98 441/322/112
+f 434/309/102 433/323/109 440/310/103
+f 432/309/105 430/308/108 436/322/111
+f 441/322/112 440/310/103 442/324/12
+f 439/325/113 438/310/110 442/324/12
+f 436/322/111 437/326/114 442/324/12
+f 437/326/114 441/322/112 442/324/12
+f 440/310/103 439/325/113 442/324/12
+f 438/310/110 436/322/111 442/324/12
+f 457/267/55 443/268/56 461/269/117
+f 456/270/58 454/271/59 460/268/60
+f 445/272/61 446/273/62 448/270/63
+f 444/274/64 460/268/60 462/275/65
+f 448/276/63 446/277/62 444/278/64
+f 447/279/66 448/270/63 450/271/67
+f 464/280/68 463/281/118 469/282/70
+f 450/271/67 448/270/63 443/268/56
+f 449/283/71 450/271/67 452/284/72
+f 454/285/59 452/286/72 459/287/73
+f 443/268/56 444/274/64 461/269/117
+f 451/288/74 452/284/72 453/283/75
+f 452/286/72 450/289/67 458/327/77
+f 455/279/76 456/270/58 445/272/61
+f 453/283/75 454/271/59 455/279/76
+f 458/291/77 457/267/55 463/281/118
+f 446/277/62 456/292/58 444/278/64
+f 445/277/61 447/276/66 455/292/76
+f 459/267/73 458/291/77 464/280/68
+f 460/268/60 459/267/73 466/269/78
+f 470/294/79 469/282/70 475/295/80
+f 461/269/117 462/275/65 468/296/81
+f 462/275/65 466/269/78 468/296/81
+f 465/281/82 464/280/68 471/282/83
+f 463/281/118 461/269/117 467/297/84
+f 466/269/78 465/281/82 472/297/85
+f 476/298/86 475/295/80 482/299/87
+f 467/297/84 468/296/81 473/300/88
+f 468/296/81 472/297/85 478/300/89
+f 471/282/83 470/294/79 477/295/90
+f 469/282/70 467/297/84 473/300/88
+f 472/297/85 471/282/83 478/300/89
+f 484/301/91 483/302/92 490/303/93
+f 473/300/88 474/304/94 480/305/95
+f 474/304/94 478/300/89 480/305/95
+f 477/295/90 476/298/86 483/302/92
+f 475/295/80 473/300/88 479/301/96
+f 478/300/89 477/295/90 484/301/91
+f 490/303/93 489/306/97 496/307/98
+f 482/299/87 481/302/99 487/306/100
+f 479/301/96 480/305/95 485/303/101
+f 480/305/95 484/301/91 486/313/106
+f 483/302/92 482/299/87 489/306/97
+f 481/302/99 479/301/96 485/303/101
+f 496/308/98 495/309/102 501/310/103
+f 488/311/104 487/306/100 493/312/105
+f 485/303/101 486/313/106 492/314/107
+f 486/313/106 490/303/93 492/314/107
+f 489/306/97 488/311/104 495/312/102
+f 487/306/100 485/303/101 491/307/108
+f 494/315/109 493/316/105 499/317/110
+f 491/318/108 492/319/107 497/320/111
+f 492/321/107 496/308/98 502/322/112
+f 495/309/102 494/323/109 501/310/103
+f 493/309/105 491/308/108 497/322/111
+f 502/322/112 501/310/103 503/324/11
+f 500/325/119 499/310/110 503/324/11
+f 497/322/111 498/326/114 503/324/11
+f 498/326/114 502/322/112 503/324/11
+f 501/310/103 500/325/119 503/324/11
+f 499/310/110 497/322/111 503/324/11
+f 38/2/1 47/328/1 45/3/1
+f 27/5/2 37/329/2 40/6/2
+f 2/330/3 1/7/3 6/9/3
+f 3/331/4 21/10/4 7/12/4
+f 26/14/5 8/332/5 29/15/1
+f 30/333/6 18/16/6 4/18/6
+f 19/20/7 9/334/7 10/21/7
+f 32/23/8 12/33/14 33/24/9
+f 11/335/10 28/25/10 34/27/10
+f 16/29/12 15/336/12 14/30/12
+f 43/337/3 35/31/3 42/32/13
+f 42/32/13 33/24/9 46/34/15
+f 36/36/4 44/338/4 48/37/4
+f 68/39/4 70/46/16 69/40/16
+f 53/44/17 51/41/6 54/43/17
+f 55/51/18 53/44/17 56/45/18
+f 70/46/16 72/53/19 71/47/19
+f 65/339/3 63/48/17 66/50/3
+f 57/56/4 55/51/18 58/52/4
+f 72/53/19 49/55/6 50/54/6
+f 63/48/17 50/54/6 64/49/17
+f 58/52/4 60/50/20 59/57/20
+f 62/59/19 52/42/6 51/41/6
+f 99/61/1 62/59/19 61/58/19
+f 67/38/4 98/62/21 68/39/4
+f 101/340/22 105/64/22 102/66/22
+f 149/341/23 147/67/23 103/69/23
+f 108/71/24 104/342/24 155/72/24
+f 145/74/25 151/343/25 159/75/25
+f 160/344/26 152/76/26 156/78/27
+f 146/345/12 158/79/12 148/81/12
+f 195/346/22 180/82/22 189/84/22
+f 113/347/26 116/85/27 114/87/26
+f 120/89/12 126/348/12 125/90/11
+f 109/92/24 166/349/24 170/93/24
+f 178/350/28 111/94/28 171/96/28
+f 161/351/22 112/97/22 179/99/22
+f 191/352/12 186/100/12 119/102/12
+f 124/353/26 162/103/26 123/105/27
+f 193/354/28 176/106/28 196/108/28
+f 177/110/24 194/355/24 187/111/24
+f 122/113/25 197/356/25 168/114/25
+f 200/116/25 206/357/25 208/117/25
+f 228/358/11 209/118/12 218/120/12
+f 188/122/29 207/359/29 201/123/29
+f 129/360/23 192/124/23 127/126/23
+f 174/128/29 202/361/29 169/129/29
+f 234/362/26 214/130/26 243/132/26
+f 130/134/25 136/363/25 137/135/25
+f 204/137/25 226/364/25 223/138/25
+f 211/365/23 185/139/23 128/141/23
+f 210/143/25 132/366/25 225/144/25
+f 217/367/26 164/145/26 224/147/27
+f 138/368/30 135/148/30 231/150/30
+f 233/369/30 133/151/30 244/153/30
+f 256/370/22 238/154/22 144/156/22
+f 229/158/25 245/371/25 232/159/25
+f 219/161/12 240/372/12 246/162/12
+f 212/164/24 139/373/24 141/165/24
+f 259/374/23 252/166/23 257/168/23
+f 142/375/23 247/169/23 143/171/23
+f 250/376/26 215/172/26 254/174/26
+f 260/377/11 242/175/12 253/177/11
+f 216/179/24 251/378/24 249/180/24
+f 255/379/22 236/181/22 258/183/22
+f 298/244/44 300/246/46 299/245/45
+f 300/246/46 302/248/48 301/247/47
+f 302/248/48 304/250/50 303/249/49
+f 304/250/50 306/252/52 305/251/51
+f 302/248/48 300/246/46 306/252/52
+f 300/246/46 298/244/44 306/252/52
+f 298/244/44 308/254/54 306/252/52
+f 308/254/54 298/244/44 297/243/43
+f 306/252/52 308/254/54 307/253/53
+f 299/245/45 301/247/47 307/253/53
+f 301/247/47 303/249/49 305/251/51
+f 307/253/53 301/247/47 305/251/51
+f 310/256/44 312/258/46 311/257/45
+f 312/258/46 314/260/48 313/259/47
+f 314/260/48 316/262/50 315/261/49
+f 316/262/50 318/264/52 317/263/51
+f 314/260/48 320/266/54 318/264/52
+f 312/258/46 310/256/44 314/260/48
+f 310/256/44 320/266/54 314/260/48
+f 320/266/54 310/256/44 309/255/43
+f 318/264/52 320/266/54 319/265/53
+f 311/257/45 313/259/47 319/265/53
+f 313/259/47 315/261/49 317/263/51
+f 319/265/53 313/259/47 317/263/51
+f 341/281/69 335/267/55 339/269/57
+f 332/271/59 337/267/73 338/268/60
+f 325/279/66 323/272/61 326/270/63
+f 338/268/60 344/269/78 340/275/65
+f 321/380/56 326/276/63 322/278/64
+f 327/283/71 325/279/66 328/271/67
+f 348/294/79 342/280/68 347/282/70
+f 335/267/55 328/271/67 321/268/56
+f 329/288/74 327/283/71 330/284/72
+f 330/286/72 336/327/77 337/287/73
+f 322/274/64 340/275/65 339/269/57
+f 330/284/72 332/271/59 331/283/75
+f 336/327/77 330/286/72 335/290/55
+f 334/270/58 324/273/62 323/272/61
+f 332/271/59 334/270/58 333/279/76
+f 342/280/68 336/291/77 341/281/69
+f 322/278/64 324/277/62 338/293/60
+f 325/276/66 327/289/71 333/292/76
+f 327/289/71 329/286/74 331/285/75
+f 333/292/76 327/289/71 331/285/75
+f 343/281/82 337/267/73 342/280/68
+f 337/267/73 343/281/82 344/269/78
+f 354/298/86 348/294/79 353/295/80
+f 345/297/84 339/269/57 346/296/81
+f 344/269/78 350/297/85 346/296/81
+f 342/280/68 348/294/79 349/282/83
+f 347/282/70 341/281/69 345/297/84
+f 343/281/82 349/282/83 350/297/85
+f 353/295/80 359/302/99 360/299/87
+f 346/296/81 352/304/94 351/300/88
+f 352/304/94 346/296/81 356/300/89
+f 348/294/79 354/298/86 355/295/90
+f 353/295/80 347/282/70 351/300/88
+f 349/282/83 355/295/90 356/300/89
+f 361/302/92 367/306/97 368/303/93
+f 357/301/96 351/300/88 358/305/95
+f 356/300/89 362/301/91 358/305/95
+f 354/298/86 360/299/87 361/302/92
+f 359/302/99 353/295/80 357/301/96
+f 355/295/90 361/302/92 362/301/91
+f 367/306/97 373/312/102 374/307/98
+f 366/311/104 360/299/87 365/306/100
+f 358/305/95 364/313/106 363/303/101
+f 364/313/106 358/305/95 368/303/93
+f 360/299/87 366/311/104 367/306/97
+f 365/306/100 359/302/99 363/303/101
+f 380/322/112 374/308/98 379/310/103
+f 372/381/109 366/311/104 371/312/105
+f 369/307/108 363/303/101 370/314/107
+f 368/303/93 374/307/98 370/314/107
+f 366/311/104 372/381/109 373/312/102
+f 371/312/105 365/306/100 369/307/108
+f 378/382/113 372/315/109 377/317/110
+f 370/319/107 376/383/114 375/320/111
+f 376/326/114 370/321/107 380/322/112
+f 372/323/109 378/325/113 379/310/103
+f 377/310/110 371/309/105 375/322/111
+f 402/281/69 396/267/55 400/269/57
+f 393/271/59 398/267/73 399/268/60
+f 386/279/66 384/272/61 387/270/63
+f 399/268/60 405/269/78 401/275/115
+f 382/380/56 387/276/63 383/278/64
+f 388/283/71 386/279/66 389/271/67
+f 409/294/79 403/280/68 408/282/70
+f 396/267/55 389/271/67 382/268/56
+f 390/288/74 388/283/71 391/284/72
+f 391/286/72 397/327/77 398/287/73
+f 383/274/64 401/275/115 400/269/57
+f 391/284/72 393/271/59 392/283/75
+f 389/289/67 396/290/55 397/327/77
+f 395/270/58 385/273/62 384/272/61
+f 393/271/59 395/270/58 394/279/76
+f 403/280/68 397/291/77 402/281/69
+f 395/292/58 399/293/60 383/278/64
+f 386/276/66 388/289/71 394/292/76
+f 388/289/71 390/286/74 392/285/75
+f 394/292/76 388/289/71 392/285/75
+f 397/291/77 403/280/68 404/281/82
+f 398/267/73 404/281/82 405/269/78
+f 415/298/86 409/294/79 414/295/116
+f 406/297/84 400/269/57 407/296/81
+f 405/269/78 411/297/85 407/296/81
+f 403/280/68 409/294/79 410/282/83
+f 408/282/70 402/281/69 406/297/84
+f 404/281/82 410/282/83 411/297/85
+f 421/299/87 415/298/86 420/302/99
+f 407/296/81 413/304/94 412/300/88
+f 413/304/94 407/296/81 417/300/89
+f 409/294/79 415/298/86 416/295/90
+f 414/295/116 408/282/70 412/300/88
+f 410/282/83 416/295/90 417/300/89
+f 422/302/92 428/306/97 429/303/93
+f 418/301/96 412/300/88 419/305/95
+f 419/305/95 413/304/94 423/301/91
+f 415/298/86 421/299/87 422/302/92
+f 420/302/99 414/295/116 418/301/96
+f 416/295/90 422/302/92 423/301/91
+f 428/306/97 434/312/102 435/307/98
+f 427/311/104 421/299/87 426/306/100
+f 424/303/101 418/301/96 425/313/106
+f 423/301/91 429/303/93 425/313/106
+f 421/299/87 427/311/104 428/306/97
+f 426/306/100 420/302/99 424/303/101
+f 441/322/112 435/308/98 440/310/103
+f 433/381/109 427/311/104 432/312/105
+f 430/307/108 424/303/101 431/314/107
+f 429/303/93 435/307/98 431/314/107
+f 427/311/104 433/381/109 434/312/102
+f 432/312/105 426/306/100 430/307/108
+f 439/382/113 433/315/109 438/317/110
+f 431/319/107 437/383/114 436/320/111
+f 437/326/114 431/321/107 441/322/112
+f 433/323/109 439/325/113 440/310/103
+f 438/310/110 432/309/105 436/322/111
+f 463/281/118 457/267/55 461/269/117
+f 454/271/59 459/267/73 460/268/60
+f 447/279/66 445/272/61 448/270/63
+f 460/268/60 466/269/78 462/275/65
+f 443/380/56 448/276/63 444/278/64
+f 449/283/71 447/279/66 450/271/67
+f 470/294/79 464/280/68 469/282/70
+f 457/267/55 450/271/67 443/268/56
+f 451/288/74 449/283/71 452/284/72
+f 452/286/72 458/327/77 459/287/73
+f 444/274/64 462/275/65 461/269/117
+f 452/284/72 454/271/59 453/283/75
+f 450/289/67 457/290/55 458/327/77
+f 456/270/58 446/273/62 445/272/61
+f 454/271/59 456/270/58 455/279/76
+f 464/280/68 458/291/77 463/281/118
+f 456/292/58 460/293/60 444/278/64
+f 447/276/66 449/289/71 455/292/76
+f 449/289/71 451/286/74 453/285/75
+f 455/292/76 449/289/71 453/285/75
+f 465/281/82 459/267/73 464/280/68
+f 459/267/73 465/281/82 466/269/78
+f 476/298/86 470/294/79 475/295/80
+f 467/297/84 461/269/117 468/296/81
+f 466/269/78 472/297/85 468/296/81
+f 464/280/68 470/294/79 471/282/83
+f 469/282/70 463/281/118 467/297/84
+f 465/281/82 471/282/83 472/297/85
+f 475/295/80 481/302/99 482/299/87
+f 468/296/81 474/304/94 473/300/88
+f 474/304/94 468/296/81 478/300/89
+f 470/294/79 476/298/86 477/295/90
+f 475/295/80 469/282/70 473/300/88
+f 471/282/83 477/295/90 478/300/89
+f 483/302/92 489/306/97 490/303/93
+f 479/301/96 473/300/88 480/305/95
+f 478/300/89 484/301/91 480/305/95
+f 476/298/86 482/299/87 483/302/92
+f 481/302/99 475/295/80 479/301/96
+f 477/295/90 483/302/92 484/301/91
+f 489/306/97 495/312/102 496/307/98
+f 488/311/104 482/299/87 487/306/100
+f 480/305/95 486/313/106 485/303/101
+f 484/301/91 490/303/93 486/313/106
+f 482/299/87 488/311/104 489/306/97
+f 487/306/100 481/302/99 485/303/101
+f 502/322/112 496/308/98 501/310/103
+f 494/381/109 488/311/104 493/312/105
+f 491/307/108 485/303/101 492/314/107
+f 490/303/93 496/307/98 492/314/107
+f 488/311/104 494/381/109 495/312/102
+f 493/312/105 487/306/100 491/307/108
+f 500/382/119 494/315/109 499/317/110
+f 492/319/107 498/383/114 497/320/111
+f 498/326/114 492/321/107 502/322/112
+f 494/323/109 500/325/119 501/310/103
+f 499/310/110 493/309/105 497/322/111
+f 504/384/3 80/385/120 76/386/121
+f 78/387/122 79/388/123 74/389/124
+f 80/385/120 77/390/125 73/391/126
+f 77/390/125 78/387/122 73/391/126
+f 77/390/125 80/385/120 84/392/127
+f 81/393/128 84/392/127 88/394/129
+f 80/385/120 504/384/3 506/395/3
+f 79/388/123 78/387/122 83/396/130
+f 78/387/122 77/390/125 81/393/128
+f 85/397/131 88/394/129 92/398/132
+f 82/399/133 81/393/128 85/397/131
+f 83/396/130 82/399/133 87/400/134
+f 84/392/127 506/395/3 507/401/135
+f 89/402/136 92/398/132 93/403/137
+f 87/400/134 86/404/138 91/405/139
+f 88/394/129 507/401/135 92/398/132
+f 86/404/138 85/397/131 90/406/140
+f 96/407/141 95/408/142 93/403/137
+f 90/406/140 89/402/136 94/409/143
+f 91/405/139 90/406/140 94/409/143
+f 92/398/132 508/410/3 96/407/141
+f 75/411/3 504/384/3 76/386/121
+f 79/388/123 505/412/6 74/389/124
+f 76/386/121 80/385/120 73/391/126
+f 78/387/122 74/389/124 73/391/126
+f 81/393/128 77/390/125 84/392/127
+f 85/397/131 81/393/128 88/394/129
+f 84/392/127 80/385/120 506/395/3
+f 78/387/122 82/399/133 83/396/130
+f 82/399/133 78/387/122 81/393/128
+f 89/402/136 85/397/131 92/398/132
+f 86/404/138 82/399/133 85/397/131
+f 82/399/133 86/404/138 87/400/134
+f 88/394/129 84/392/127 507/401/135
+f 92/398/132 96/407/141 93/403/137
+f 86/404/138 90/406/140 91/405/139
+f 507/401/135 508/410/3 92/398/132
+f 85/397/131 89/402/136 90/406/140
+f 95/408/142 94/409/143 93/403/137
+f 89/402/136 93/403/137 94/409/143
+f 509/413/144 91/405/139 94/409/143
+f 508/410/3 95/408/142 96/407/141
diff --git a/08-august/resources/textures/back.png b/08-august/resources/textures/back.png
new file mode 100644
index 0000000..3fd0158
--- /dev/null
+++ b/08-august/resources/textures/back.png
Binary files differ
diff --git a/08-august/resources/textures/barrel.png b/08-august/resources/textures/barrel.png
new file mode 100644
index 0000000..baf502b
--- /dev/null
+++ b/08-august/resources/textures/barrel.png
Binary files differ
diff --git a/08-august/resources/textures/blendmap.png b/08-august/resources/textures/blendmap.png
new file mode 100644
index 0000000..4789845
--- /dev/null
+++ b/08-august/resources/textures/blendmap.png
Binary files differ
diff --git a/08-august/resources/textures/bottom.png b/08-august/resources/textures/bottom.png
new file mode 100644
index 0000000..8f9c0f2
--- /dev/null
+++ b/08-august/resources/textures/bottom.png
Binary files differ
diff --git a/08-august/resources/textures/boulder.png b/08-august/resources/textures/boulder.png
new file mode 100644
index 0000000..e2cb9d1
--- /dev/null
+++ b/08-august/resources/textures/boulder.png
Binary files differ
diff --git a/08-august/resources/textures/boulderNormal.png b/08-august/resources/textures/boulderNormal.png
new file mode 100644
index 0000000..cc6069a
--- /dev/null
+++ b/08-august/resources/textures/boulderNormal.png
Binary files differ
diff --git a/08-august/resources/textures/bricks2.png b/08-august/resources/textures/bricks2.png
new file mode 100644
index 0000000..cf44650
--- /dev/null
+++ b/08-august/resources/textures/bricks2.png
Binary files differ
diff --git a/08-august/resources/textures/bricks2_normal.png b/08-august/resources/textures/bricks2_normal.png
new file mode 100644
index 0000000..72b6a2d
--- /dev/null
+++ b/08-august/resources/textures/bricks2_normal.png
Binary files differ
diff --git a/08-august/resources/textures/default_normal_map.png b/08-august/resources/textures/default_normal_map.png
new file mode 100644
index 0000000..9dfd3a4
--- /dev/null
+++ b/08-august/resources/textures/default_normal_map.png
Binary files differ
diff --git a/08-august/resources/textures/front.png b/08-august/resources/textures/front.png
new file mode 100644
index 0000000..fbff722
--- /dev/null
+++ b/08-august/resources/textures/front.png
Binary files differ
diff --git a/08-august/resources/textures/heightmap.png b/08-august/resources/textures/heightmap.png
new file mode 100644
index 0000000..12741e5
--- /dev/null
+++ b/08-august/resources/textures/heightmap.png
Binary files differ
diff --git a/08-august/resources/textures/left.png b/08-august/resources/textures/left.png
new file mode 100644
index 0000000..374322a
--- /dev/null
+++ b/08-august/resources/textures/left.png
Binary files differ
diff --git a/08-august/resources/textures/normal_map.png b/08-august/resources/textures/normal_map.png
new file mode 100644
index 0000000..d96a41c
--- /dev/null
+++ b/08-august/resources/textures/normal_map.png
Binary files differ
diff --git a/08-august/resources/textures/right.png b/08-august/resources/textures/right.png
new file mode 100644
index 0000000..89fbb5f
--- /dev/null
+++ b/08-august/resources/textures/right.png
Binary files differ
diff --git a/08-august/resources/textures/soil1.png b/08-august/resources/textures/soil1.png
new file mode 100644
index 0000000..227e96c
--- /dev/null
+++ b/08-august/resources/textures/soil1.png
Binary files differ
diff --git a/08-august/resources/textures/soil2.png b/08-august/resources/textures/soil2.png
new file mode 100644
index 0000000..5fc40e2
--- /dev/null
+++ b/08-august/resources/textures/soil2.png
Binary files differ
diff --git a/08-august/resources/textures/soil3.png b/08-august/resources/textures/soil3.png
new file mode 100644
index 0000000..2c1c431
--- /dev/null
+++ b/08-august/resources/textures/soil3.png
Binary files differ
diff --git a/08-august/resources/textures/soil4.png b/08-august/resources/textures/soil4.png
new file mode 100644
index 0000000..8d3a4d3
--- /dev/null
+++ b/08-august/resources/textures/soil4.png
Binary files differ
diff --git a/08-august/resources/textures/stall.png b/08-august/resources/textures/stall.png
new file mode 100644
index 0000000..d4d6f6e
--- /dev/null
+++ b/08-august/resources/textures/stall.png
Binary files differ
diff --git a/08-august/resources/textures/top.png b/08-august/resources/textures/top.png
new file mode 100644
index 0000000..f92e8f7
--- /dev/null
+++ b/08-august/resources/textures/top.png
Binary files differ
diff --git a/08-august/src/camera.c b/08-august/src/camera.c
new file mode 100644
index 0000000..545ac85
--- /dev/null
+++ b/08-august/src/camera.c
@@ -0,0 +1,85 @@
+#include "camera.h"
+
+#include "util/util_time.h"
+
+static const float movementSpeed = 40.0f;
+
+void Camera_Init(camera_t* camera)
+{
+ camera->position = (vec3_t){ 4.0f, 40.0f, 4.0f };
+ camera->viewDirection = (vec3_t){ -1.0f, -1.0f, 0.0f };
+ camera->needsUpdate = true;
+ camera->up = (vec3_t){ 0.0f, 1.0f, 0.0f };
+}
+
+void Camera_Move_Up(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->up, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_Move_Down(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->up, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_Move_Left(camera_t* camera)
+{
+ vec3_t strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
+ strafeDirection = vec3_scalar_mul(&strafeDirection, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &strafeDirection);
+}
+
+void Camera_Move_Right(camera_t* camera)
+{
+ vec3_t strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
+ strafeDirection = vec3_scalar_mul(&strafeDirection, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &strafeDirection);
+}
+
+void Camera_Move_Foward(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->viewDirection, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_Move_Backward(camera_t* camera)
+{
+ vec3_t temp = vec3_scalar_mul(&camera->viewDirection, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void Camera_MouseUpdate(camera_t* camera, const vec2_t* newMousePosition)
+{
+ vec2_t mouseDelta = vec2_sub(newMousePosition, &camera->mousePosition);
+
+ /* El if evita que el mouse se teletrasporte al cambiar de posicion muy rapido */
+ if(vec2_length(&mouseDelta) > 50.0f){
+ camera->mousePosition = *newMousePosition;
+ return;
+ }
+
+ vec3_t verticalRotation = vec3_cross_mul(&camera->viewDirection, &camera->up);
+
+ mat4_t temp = mat4_rotate(mouseDelta.x * -0.5f, &camera->up);
+
+ camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);
+
+ temp = mat4_rotate(mouseDelta.y * -0.5f, &verticalRotation);
+ camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);
+
+ camera->mousePosition = *newMousePosition;
+
+ camera->needsUpdate = true;
+}
+
+mat4_t Camera_GetModelToViewMatrix(camera_t* camera)
+{
+ if(camera->needsUpdate)
+ {
+ vec3_t temp = vec3_add(&camera->position, &camera->viewDirection);
+ camera->viewMatrix = mat4_lookAt(&camera->position, &temp, &camera->up);
+ }
+ return camera->viewMatrix;
+}
diff --git a/08-august/src/camera.h b/08-august/src/camera.h
new file mode 100644
index 0000000..384bee8
--- /dev/null
+++ b/08-august/src/camera.h
@@ -0,0 +1,32 @@
+#ifndef CAMERA_H
+#define CAMERA_H
+
+#include "math/matrix4x4.h"
+#include "math/vector3f.h"
+#include "math/vector2f.h"
+#include <stdbool.h>
+
+typedef struct
+{
+ vec3_t position;
+ vec3_t viewDirection;
+ vec3_t up;
+ mat4_t projectionMatrix;
+ mat4_t viewMatrix;
+ vec2_t mousePosition;
+ bool needsUpdate;
+} camera_t;
+
+extern void Camera_Init(camera_t* camera);
+extern void Camera_Move_Up(camera_t* camera);
+extern void Camera_Move_Down(camera_t* camera);
+extern void Camera_Move_Left(camera_t* camera);
+extern void Camera_Move_Right(camera_t* camera);
+extern void Camera_Move_Foward(camera_t* camera);
+extern void Camera_Move_Backward(camera_t* camera);
+extern void Camera_MouseUpdate(camera_t* camera, const vec2_t* newMousePosition);
+
+/* Consigue la viewMatrix */
+extern mat4_t Camera_GetModelToViewMatrix(camera_t* camera);
+
+#endif // CAMERA_H
diff --git a/08-august/src/game.h b/08-august/src/game.h
new file mode 100644
index 0000000..611bd07
--- /dev/null
+++ b/08-august/src/game.h
@@ -0,0 +1,46 @@
+#ifndef GAME_H
+#define GAME_H
+
+#include "camera.h"
+#include "graphics/window.h"
+#include "renderer/entity.h"
+#include "player.h"
+#include "terrain.h"
+#include "texture.h"
+#include "renderer/shape.h"
+#include "graphics/shaders.h"
+#include "renderer/skybox.h"
+
+typedef enum
+{
+ MENU,
+ RUNNING,
+ EXIT
+}GameState_t;
+
+#define NUM_ENTITIES 1
+
+#define WINDOW_WIDTH 1024
+#define WINDOW_HEIGHT 768
+#define WINDOW_ASPECT_RATIO ( (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT )
+
+typedef struct
+{
+ GameState_t gameState;
+ Shader_Layout shaderProgram, terrainProgram, skyboxProgram;
+
+ entity_t ents[NUM_ENTITIES];
+ shape_t *entsShape;
+ GLuint entsTexture;
+ GLuint normalMap;
+ GLuint defaultNormalMap;
+ terrain_t *terrain;
+ skybox_t sky;
+
+ player_t player;
+
+ camera_t camera;
+ window_t *window;
+} game_t;
+
+#endif // GAME_H
diff --git a/08-august/src/graphics/shaders.c b/08-august/src/graphics/shaders.c
new file mode 100644
index 0000000..c0796e1
--- /dev/null
+++ b/08-august/src/graphics/shaders.c
@@ -0,0 +1,135 @@
+#include "shaders.h"
+#include "../util/util.h"
+
+#include <stdlib.h>
+#include <stdbool.h>
+
+static void CompileShader(const char *source, GLuint shaderID)
+{
+ glShaderSource(shaderID, 1, &source, 0);
+ glCompileShader(shaderID);
+ GLint error;
+ glGetShaderiv(shaderID, GL_COMPILE_STATUS, &error);
+ if(error != GL_TRUE)
+ {
+ GLint logLenth;
+ glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLenth);
+ GLchar buffer[logLenth];
+ glGetShaderInfoLog(shaderID, logLenth, &logLenth, buffer);
+ glDeleteShader(shaderID);
+ Util_FatalError("Some shader failed to compile:\n%s", buffer);
+ }
+}
+
+
+GLuint Shader_CompileShaders(const char* vertexShader, const char* fragmentShader)
+{
+ char* vertexShaderSource = Util_LoadFile(vertexShader);
+ char* fragmentShaderSource = Util_LoadFile(fragmentShader);
+
+ GLuint vs = 0, fs = 0, program;
+ vs = glCreateShader(GL_VERTEX_SHADER);
+ fs = glCreateShader(GL_FRAGMENT_SHADER);
+
+ if(vs == 0 || fs == 0)
+ Util_FatalError("Shaders could not be created\n");
+
+ program = glCreateProgram();
+
+ CompileShader(vertexShaderSource, vs);
+ CompileShader(fragmentShaderSource, fs);
+
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+
+ glLinkProgram(program);
+
+ GLint error;
+ glGetProgramiv(program, GL_LINK_STATUS, &error);
+
+ if(error != GL_TRUE)
+ {
+ GLint logLength;
+ glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
+
+ GLchar buffer[logLength];
+ glGetProgramInfoLog(program, logLength, &logLength, buffer);
+
+ glDeleteProgram(program);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ Util_FatalError("Shader program failed to link!:\n%s", buffer);
+ }
+
+ glDetachShader(program, vs);
+ glDetachShader(program, fs);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ free(vertexShaderSource);
+ free(fragmentShaderSource);
+
+ return program;
+}
+
+GLint Shader_GetUniformLocation( GLuint programID, const char* uniformName )
+{
+ GLint u = glGetUniformLocation(programID, uniformName);
+ if(u == GL_INVALID_INDEX);
+ //Util_FatalError("Uniform \"%s\" could not be found!", uniformName);
+ else
+ return u;
+
+ return 0;
+}
+
+GLint Shader_GetAttribLocation ( GLuint programID, const char* attributeName )
+{
+ GLint attrLocation = glGetAttribLocation(programID, attributeName);
+ if(attrLocation < 0)
+ Util_FatalError("Attribute \"%s\" could not be found!\n", attributeName);
+ return attrLocation;
+}
+
+void Shader_Destroy(GLuint programID)
+{
+ glUseProgram(0);
+ glDeleteProgram(programID);
+}
+
+void Shader_SetUniformMat4( GLuint programID, const char* name, const float *matrix )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniformMatrix4fv(location, 1, GL_FALSE, matrix);
+}
+
+void Shader_SetUniformFloat( GLuint programID, const char* name, const float val )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform1f(location, val);
+}
+
+void Shader_SetUniformVec2( GLuint programID, const char* name, const float vec[2] )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform2fv(location, 1, vec);
+}
+
+void Shader_SetUniformVec3( GLuint programID, const char* name, const float vec[3] )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform3fv(location, 1, vec);
+}
+
+void Shader_SetUniformVec4( GLuint programID, const char* name, const float vec[4] )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform4fv(location, 1, vec);
+}
+
+void Shader_SetUniformInt( GLuint programID, const char* name, const int val )
+{
+ GLint location = Shader_GetUniformLocation(programID, name);
+ glUniform1i(location, val);
+}
diff --git a/08-august/src/graphics/shaders.h b/08-august/src/graphics/shaders.h
new file mode 100644
index 0000000..db090fd
--- /dev/null
+++ b/08-august/src/graphics/shaders.h
@@ -0,0 +1,51 @@
+#ifndef SHADERS_H
+#define SHADERS_H
+
+#include <GL/glew.h>
+
+#include "../math/matrix4x4.h"
+
+typedef struct
+{
+ /* Program ID */
+ GLuint ID;
+
+ /* Program Attributes */
+ GLint position;
+ GLint color;
+ GLint uv;
+ GLint normal;
+
+ /* Program Uniforms */
+ GLint totalTransform;
+ GLint modelToWorld;
+ GLint lightPosition;
+ GLint ambientLight;
+ GLint lightColor;
+ GLint lightAttenuation;
+ GLint World_eyePosition;
+ GLint Texture;
+ GLint Normal_Map;
+
+ /* Program Multi Purpose Uniforms */
+ GLint extra0;
+ GLint extra1;
+ GLint extra2;
+ GLint extra3;
+ GLint extra4;
+ GLint extra5;
+} Shader_Layout;
+
+extern GLuint Shader_CompileShaders(const char* vertexShader, const char* fragmentShader);
+extern GLint Shader_GetUniformLocation( GLuint programID, const char* uniformName );
+extern GLint Shader_GetAttribLocation ( GLuint programID, const char* attributeName );
+extern void Shader_Destroy(GLuint programID);
+
+extern void Shader_SetUniformMat4( GLuint programID, const char* name, const float *matrix );
+extern void Shader_SetUniformFloat( GLuint programID, const char* name, const float val );
+extern void Shader_SetUniformVec2( GLuint programID, const char* name, const float vec[2] );
+extern void Shader_SetUniformVec3( GLuint programID, const char* name, const float vec[3] );
+extern void Shader_SetUniformVec4( GLuint programID, const char* name, const float vec[4] );
+extern void Shader_SetUniformInt( GLuint programID, const char* name, const int val );
+
+#endif // SHADERS_H
diff --git a/08-august/src/graphics/window.c b/08-august/src/graphics/window.c
new file mode 100644
index 0000000..1a942ca
--- /dev/null
+++ b/08-august/src/graphics/window.c
@@ -0,0 +1,44 @@
+#include "window.h"
+#include "../util/util.h"
+#include <stdlib.h>
+
+window_t* Window_Create(const char* title, Uint32 width, Uint32 height)
+{
+ window_t* window = (window_t*) malloc(sizeof(window_t));
+ window->title = title;
+ window->Width = width;
+ window->Height = height;
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ window->window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
+ width, height, SDL_WINDOW_OPENGL);
+ if(window->window == NULL)
+ Util_FatalError( "The window could not be created:\n%s", SDL_GetError() );
+
+ window->context = SDL_GL_CreateContext(window->window);
+
+ if(window->context == NULL)
+ Util_FatalError( "Context could not be created:\n%s", SDL_GetError() );
+
+ glViewport(0, 0, width, height);
+ return window;
+}
+
+void Window_Resize(window_t* window, Uint32 width, Uint32 height)
+{
+ window->Width = width;
+ window->Height = height;
+ SDL_SetWindowSize(window->window, width, height);
+ glViewport(0, 0, width, height);
+}
+
+void Window_Update(window_t* window)
+{
+ SDL_GL_SwapWindow(window->window);
+}
+
+void Window_Destroy(window_t* window)
+{
+ SDL_GL_DeleteContext(window->context);
+ SDL_DestroyWindow(window->window);
+ free(window);
+}
diff --git a/08-august/src/graphics/window.h b/08-august/src/graphics/window.h
new file mode 100644
index 0000000..1e71a83
--- /dev/null
+++ b/08-august/src/graphics/window.h
@@ -0,0 +1,20 @@
+#ifndef WINDOW_H
+#define WINDOW_H
+
+#include <SDL2/SDL.h>
+#include <GL/glew.h>
+
+typedef struct
+{
+ SDL_Window* window;
+ SDL_GLContext context;
+ Uint32 Width, Height;
+ const char* title;
+} window_t;
+
+extern window_t* Window_Create(const char* title, Uint32 width, Uint32 height);
+extern void Window_Resize(window_t* window, Uint32 width, Uint32 height);
+extern void Window_Update(window_t* window);
+extern void Window_Destroy(window_t* window);
+
+#endif // WINDOW_H
diff --git a/08-august/src/gui/gui_renderer.c b/08-august/src/gui/gui_renderer.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/08-august/src/gui/gui_renderer.c
diff --git a/08-august/src/gui/gui_renderer.h b/08-august/src/gui/gui_renderer.h
new file mode 100644
index 0000000..2c1b57f
--- /dev/null
+++ b/08-august/src/gui/gui_renderer.h
@@ -0,0 +1,9 @@
+#ifndef GUI_RENDERER_H
+#define GUI_RENDERER_H
+
+extern void gui_renderer_init();
+extern void gui_renderer_submit(widget *widget);
+extern void gui_renderer_quit();
+
+
+#endif // GUI_RENDERER_H
diff --git a/08-august/src/gui/widget.c b/08-august/src/gui/widget.c
new file mode 100644
index 0000000..9ed00f7
--- /dev/null
+++ b/08-august/src/gui/widget.c
@@ -0,0 +1,17 @@
+#include "widget.h"
+#include <stdlib.h>
+
+widget_t *Widget_CreateImage(texture_t *texture, int x, int y, int w, int h)
+{
+ widget_t *widget = (widget_t *) malloc( sizeof(widget_t) );
+ *widget = (widget_t){ x, y, w, h, 0, texture };
+
+ glGenBuffers(1, &widget->vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, widget->vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4, NULL, GL_DYNAMIC_DRAW);
+}
+
+void Widget_Destroy(widget_t *widget)
+{
+ free(widget);
+}
diff --git a/08-august/src/gui/widget.h b/08-august/src/gui/widget.h
new file mode 100644
index 0000000..91fc4c4
--- /dev/null
+++ b/08-august/src/gui/widget.h
@@ -0,0 +1,13 @@
+#ifndef WIDGET_H
+#define WIDGET_H
+
+#include "GL/glew.h"
+#include "../texture.h"
+
+typedef struct
+{
+ int x, y, w, h;
+ texture_t *texture;
+} widget_t;
+
+#endif // WIDGET_H
diff --git a/08-august/src/input.c b/08-august/src/input.c
new file mode 100644
index 0000000..8384ceb
--- /dev/null
+++ b/08-august/src/input.c
@@ -0,0 +1,21 @@
+#include "input.h"
+
+static bool key_buffer[MAX_KEY_BUFFER_SIZE] = { false };
+
+void Input_PressKey(unsigned int key)
+{
+ if(key > 256 || key < 0) return;
+ key_buffer[key] = true;
+}
+
+void Input_ReleaseKey(unsigned int key)
+{
+ if(key > 256 || key < 0) return;
+ key_buffer[key] = false;
+}
+
+bool Input_isKeyPressed(unsigned int key)
+{
+ if(key > 256 || key < 0) return false;
+ return key_buffer[key];
+}
diff --git a/08-august/src/input.h b/08-august/src/input.h
new file mode 100644
index 0000000..92876ca
--- /dev/null
+++ b/08-august/src/input.h
@@ -0,0 +1,11 @@
+#ifndef INPUT_H
+#define INPUT_H
+
+#include <stdbool.h>
+#define MAX_KEY_BUFFER_SIZE 256
+
+void Input_PressKey(unsigned int key);
+void Input_ReleaseKey(unsigned int key);
+bool Input_isKeyPressed(unsigned int key);
+
+#endif // INPUT_H
diff --git a/08-august/src/light.c b/08-august/src/light.c
new file mode 100644
index 0000000..decd182
--- /dev/null
+++ b/08-august/src/light.c
@@ -0,0 +1 @@
+#include "light.h"
diff --git a/08-august/src/light.h b/08-august/src/light.h
new file mode 100644
index 0000000..afc8eda
--- /dev/null
+++ b/08-august/src/light.h
@@ -0,0 +1,13 @@
+#ifndef LIGHT_H
+#define LIGHT_H
+
+#include "vertex.h"
+
+typedef struct
+{
+ vec3_t position;
+ vec4_t color;
+ vec3_t attenuation;
+} light_t;
+
+#endif // LIGHT_H
diff --git a/08-august/src/main.c b/08-august/src/main.c
new file mode 100644
index 0000000..41fc253
--- /dev/null
+++ b/08-august/src/main.c
@@ -0,0 +1,290 @@
+#include "game.h"
+#include "math/vector3f.h"
+#include "math/vector2f.h"
+#include "math/matrix4x4.h"
+#include "input.h"
+#include "util/util.h"
+#include "util/util_time.h"
+#include "light.h"
+#include "renderer/renderer.h"
+#include <SDL2/SDL.h>
+
+/**
+ TODO: Shadows
+ Texture Atlases
+ Memory management
+
+ +improve skybox
+ |
+ +->fog
+ +->day/night
+
+ +mouse picking (is it working perfectly?)
+
+ +add cell shading?
+
+ improve math package
+ repair gui on renderer.c
+ improve shape loading (tangent generation) (normal generation)
+ improve normal mapping
+**/
+
+void LoadResources(game_t *game);
+void Draw(game_t *game);
+void ProcessInput(game_t *game);
+void CleanUp(game_t *game);
+
+int main(int argc, char *argv[])
+{
+ SDL_Init(SDL_INIT_EVERYTHING);
+
+ game_t game;
+ game.gameState = RUNNING;
+ game.window = Window_Create("Test", WINDOW_WIDTH, WINDOW_HEIGHT);
+
+ GLenum err = glewInit();
+ if(err != GLEW_OK) {
+ fputs(glewGetErrorString(err), stderr);
+ Util_FatalError("Glew could no be started!");
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ SDL_GL_SetSwapInterval(1);
+ // glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+
+ game.shaderProgram.ID = Shader_CompileShaders("resources/shaders/shader.vert",
+ "resources/shaders/shader.frag");
+
+ game.terrainProgram.ID = Shader_CompileShaders("resources/shaders/terrainShader.vert",
+ "resources/shaders/terrainShader.frag");
+
+ game.skyboxProgram.ID = Shader_CompileShaders("resources/shaders/skyboxShader.vert",
+ "resources/shaders/skyboxShader.frag");
+ glUseProgram(game.shaderProgram.ID);
+
+ Camera_Init(&game.camera);
+ game.camera.projectionMatrix = mat4_perspective(60.0f, WINDOW_ASPECT_RATIO, 0.1f, 900.0f);
+
+ LoadResources(&game);
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+ Time_Init();
+ Time_SetMaxFramesPerSecond(60);
+ while(game.gameState != EXIT)
+ {
+ Time_Begin();
+ ProcessInput(&game);
+ Player_Update(&game.player, game.terrain);
+ Draw(&game);
+
+ float FPS = Time_End();
+
+ if( !( Time_GetCountedFrames() % (int)FPS ) )
+ fprintf(stderr, "FPS: %.4f\n", FPS);
+ }
+
+ Window_Destroy(game.window);
+ CleanUp(&game);
+ SDL_Quit();
+ return 0;
+}
+
+void CleanUp(game_t *game)
+{
+ Shape_Free(game->entsShape);
+ Shape_Free(game->sky.cube);
+
+ Texture_Destroy(game->entsTexture);
+ Texture_Destroy(game->sky.texture);
+
+ Texture_Destroy(game->normalMap);
+ Texture_Destroy(game->defaultNormalMap);
+
+ Terrain_Destroy(game->terrain);
+
+ Shader_Destroy(game->shaderProgram.ID);
+ Shader_Destroy(game->terrainProgram.ID);
+ Shader_Destroy(game->skyboxProgram.ID);
+
+ Render_Quit();
+}
+
+void LoadResources(game_t *game)
+{
+ Render_Init();
+ Uint32 start = SDL_GetTicks();
+
+ game->entsShape = Shape_LoadOBJ("resources/barrel.obj");
+ game->entsTexture = Texture_Create2D("resources/textures/barrel.png");
+
+ Player_Init(&game->player);
+ game->player.entity.texture = game->entsTexture;
+ game->player.entity.shape = game->entsShape;
+
+ {
+ vec3_t position = { 0.0f, 3.0f, 0.0f };
+ float rotation[3] = { 0.0f, 0.0f, 0.0f };
+ game->ents[0].position = position;
+ game->ents[0].rotX = rotation[0];
+ game->ents[0].rotY = rotation[1];
+ game->ents[0].rotZ = rotation[2];
+ game->ents[0].shape = game->entsShape;
+ game->ents[0].texture = game->entsTexture;
+ }
+
+ {
+ vec3_t position = { -400.0f, 0.0f, -400.0f };
+ GLuint blendmap = Texture_Create2D("resources/textures/blendmap.png");
+ TerrainTexturePack pack =
+ {
+ {
+ Texture_Create2D("resources/textures/soil1.png"),
+ Texture_Create2D("resources/textures/soil2.png"),
+ Texture_Create2D("resources/textures/soil4.png"),
+ Texture_Create2D("resources/textures/soil3.png"),
+ }
+ };
+ game->terrain = Terrain_Create(800, 800, "resources/textures/heightmap.png", blendmap, &pack);
+ game->terrain->position = position;
+ }
+
+ {
+ game->sky.rotation = 0.0f;
+ game->sky.cube = Shape_MakeSkyBox(500.0f);
+ const char *paths[6] =
+ {
+ "resources/textures/right.png",
+ "resources/textures/left.png",
+ "resources/textures/top.png",
+ "resources/textures/bottom.png",
+ "resources/textures/back.png",
+ "resources/textures/front.png"
+ };
+ game->sky.texture = Texture_CreateCubeMap(paths);
+ }
+
+ /* Shader Layouts */
+
+ Shader_Layout *layout = &game->shaderProgram;
+ layout->Texture = Shader_GetUniformLocation(layout->ID, "Texture");
+ layout->modelToWorld = Shader_GetUniformLocation(layout->ID, "M_model");
+ layout->totalTransform = Shader_GetUniformLocation(layout->ID, "M_MVP");
+ layout->lightPosition = Shader_GetUniformLocation(layout->ID, "lightPosition");
+ layout->lightColor = Shader_GetUniformLocation(layout->ID, "lightColor");
+ layout->lightAttenuation = Shader_GetUniformLocation(layout->ID, "attenuation");
+ layout->Normal_Map = Shader_GetUniformLocation(layout->ID, "normalMap");
+
+ layout = &game->terrainProgram;
+ layout->modelToWorld = Shader_GetUniformLocation(layout->ID, "M_model");
+ layout->totalTransform = Shader_GetUniformLocation(layout->ID, "M_MVP");
+ layout->lightPosition = Shader_GetUniformLocation(layout->ID, "lightPosition");
+ layout->lightColor = Shader_GetUniformLocation(layout->ID, "lightColor");
+ layout->lightAttenuation = Shader_GetUniformLocation(layout->ID, "attenuation");
+
+ layout->extra0 = Shader_GetUniformLocation(layout->ID, "Texture_Background");
+ layout->extra1 = Shader_GetUniformLocation(layout->ID, "Texture_R");
+ layout->extra2 = Shader_GetUniformLocation(layout->ID, "Texture_G");
+ layout->extra3 = Shader_GetUniformLocation(layout->ID, "Texture_B");
+ layout->extra4 = Shader_GetUniformLocation(layout->ID, "Texture_BlendMap");
+
+ layout = &game->skyboxProgram;
+ layout->totalTransform = Shader_GetUniformLocation(layout->ID, "M_MVP");
+ layout->Texture = Shader_GetUniformLocation(layout->ID, "cubeMap");
+
+ game->normalMap = Texture_Create2D("resources/textures/normal_map.png");
+ game->defaultNormalMap = Texture_Create2D("resources/textures/default_normal_map.png");
+
+ fprintf(stderr, "Loading time: %u (ms)\n", SDL_GetTicks() - start);
+}
+
+void Draw(game_t *game)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /*We upload all the light vectors*/
+ static const light_t diffuseLight[1] =
+ {
+ /* Sun Light */
+ { {5.0f, 40.0f, 2.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 0.0f, 0.0f} },
+ /* Other lights
+ { {10.0f, 20.0f, 0.0f}, {1.0f, 0.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ { {20.0f, 20.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ { {30.0f, 20.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },*/
+ };
+
+ Shader_SetUniformVec3(game->shaderProgram.ID, "World_eyePosition", (float*)&game->camera.position);
+ Render_LoadLights(&game->shaderProgram, diffuseLight, 1);
+
+ glActiveTexture(GL_TEXTURE13);
+ glBindTexture(GL_TEXTURE_2D, game->normalMap);
+
+ glUniform1i(game->shaderProgram.Normal_Map, 13);
+
+ mat4_t viewMatrix, projectedViewMatrix;
+
+ viewMatrix = Camera_GetModelToViewMatrix(&game->camera);
+ projectedViewMatrix = mat4_mul(&game->camera.projectionMatrix, &viewMatrix);
+
+ Render_DrawEntity(&game->shaderProgram, &projectedViewMatrix, &game->player.entity);
+ Render_DrawEntity(&game->shaderProgram, &projectedViewMatrix, &game->ents[0]);
+
+ glUseProgram(game->terrainProgram.ID);
+
+ Shader_SetUniformVec3(game->terrainProgram.ID, "World_eyePosition", (float*)&game->camera.position);
+ Render_LoadLights(&game->terrainProgram, diffuseLight, 1);
+
+ Render_DrawTerrain(&game->terrainProgram, &projectedViewMatrix, game->terrain);
+
+ glUseProgram(game->skyboxProgram.ID);
+ Render_DrawSky(&game->skyboxProgram, &viewMatrix, &game->camera.projectionMatrix, &game->sky);
+
+ glUseProgram(game->shaderProgram.ID);
+
+ Window_Update(game->window);
+}
+
+void ProcessInput(game_t *game)
+{
+ static vec2_t mousePosition;
+ SDL_Event e;
+ while(SDL_PollEvent(&e))
+ {
+ switch(e.type)
+ {
+ case SDL_QUIT:
+ game->gameState = EXIT;
+ break;
+
+ case SDL_MOUSEMOTION:
+ mousePosition.x = (GLfloat) e.motion.x;
+ mousePosition.y = (GLfloat) e.motion.y;
+ Camera_MouseUpdate(&game->camera, &mousePosition);
+ break;
+
+ case SDL_KEYDOWN:
+ Input_PressKey(e.key.keysym.scancode);
+ break;
+
+ case SDL_KEYUP:
+ Input_ReleaseKey(e.key.keysym.scancode);
+ break;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_UP))
+ Camera_Move_Foward(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_DOWN))
+ Camera_Move_Backward(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_LEFT))
+ Camera_Move_Left(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_RIGHT))
+ Camera_Move_Right(&game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_ESCAPE))
+ game->gameState = EXIT;
+ }
+}
diff --git a/08-august/src/math/math_util.c b/08-august/src/math/math_util.c
new file mode 100644
index 0000000..f58e447
--- /dev/null
+++ b/08-august/src/math/math_util.c
@@ -0,0 +1,10 @@
+#include "math_util.h"
+
+float baryCentric(vec3_t *p1, vec3_t *p2, vec3_t *p3, vec2_t *pos)
+{
+ float det = (p2->z - p3->z) * (p1->x - p3->x) + (p3->x - p2->x) * (p1->z - p3->z);
+ float l1 = ((p2->z - p3->z) * (pos->x - p3->x) + (p3->x - p2->x) * (pos->y - p3->z)) / det;
+ float l2 = ((p3->z - p1->z) * (pos->x - p3->x) + (p1->x - p3->x) * (pos->y - p3->z)) / det;
+ float l3 = 1.0f - l1 - l2;
+ return l1 * p1->y + l2 * p2->y + l3 * p3->y;
+}
diff --git a/08-august/src/math/math_util.h b/08-august/src/math/math_util.h
new file mode 100644
index 0000000..28a5464
--- /dev/null
+++ b/08-august/src/math/math_util.h
@@ -0,0 +1,9 @@
+#ifndef MATH_UTIL_H
+#define MATH_UTIL_H
+
+#include "vector3f.h"
+#include "vector2f.h"
+
+extern float baryCentric(vec3_t *p1, vec3_t *p2, vec3_t *p3, vec2_t *pos);
+
+#endif // MATH_UTIL_H
diff --git a/08-august/src/math/matrix4x4.c b/08-august/src/math/matrix4x4.c
new file mode 100644
index 0000000..1888727
--- /dev/null
+++ b/08-august/src/math/matrix4x4.c
@@ -0,0 +1,325 @@
+#include "matrix4x4.h"
+#include "../util/util.h"
+#include <SDL2/SDL.h>
+
+void mat4_identity(mat4_t *a)
+{
+ int i;
+ for(i = 0; i < 4*4; i++)
+ {
+ a->data[i] = 0.0f;
+ }
+ a->data[0 + 0 * 4] = 1.0f;
+ a->data[1 + 1 * 4] = 1.0f;
+ a->data[2 + 2 * 4] = 1.0f;
+ a->data[3 + 3 * 4] = 1.0f;
+}
+
+/** TODO: Preprocess these operation (1 + 1 * 4) -> 5 **/
+mat4_t mat4_inverse(const mat4_t *a)
+{
+ mat4_t inv;
+ int i;
+
+ /** Remember that inverted matrix is (1/det) * cofactor(transposed) **/
+ inv.data[0 + 0 * 4] = (a->data[1 + 1 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 1 * 4] * a->data[3 + 2 * 4] * a->data[1 + 3 * 4] +
+ a->data[3 + 1 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 1 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[1 + 1 * 4] -
+ a->data[3 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 1 * 4]);
+
+ inv.data[0 + 1 * 4] = -(a->data[0 + 1 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 1 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 1 * 4] * a->data[0 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 1 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 1 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[2 + 1 * 4]);
+
+ inv.data[0 + 2 * 4] = (a->data[0 + 1 * 4] * a->data[1 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[1 + 1 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 1 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[3 + 1 * 4] -
+ a->data[1 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 1 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 1 * 4]);
+
+ inv.data[0 + 3 * 4] = -(a->data[0 + 1 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] +
+ a->data[1 + 1 * 4] * a->data[2 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[2 + 1 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 1 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[0 + 1 * 4] -
+ a->data[2 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 1 * 4]);
+
+ inv.data[1 + 0 * 4] = -(a->data[1 + 0 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 2 * 4] * a->data[1 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[1 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[1 + 1 * 4] = (a->data[0 + 0 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[1 + 2 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[3 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 + 4] * a->data[0 + 2 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[1 + 3 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[2 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[0 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[2 + 0 * 4] = (a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[1 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 3 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 1 * 4] * a->data[1 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[2 + 1 * 4] = -(a->data[0 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[2 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[2 + 2 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[3 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[2 + 3 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[0 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[3 + 0 * 4] = -(a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 2 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[1 + 2 * 4] +
+ a->data[3 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 2 * 4] -
+ a->data[1 + 2 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 2 * 4] * a->data[3 + 1 * 4] * a->data[1 + 0 * 4] -
+ a->data[3 + 2 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[3 + 1 * 4] = (a->data[0 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 2 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 2 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[2 + 2 * 4] -
+ a->data[0 + 2 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 2 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 2 * 4] * a->data[0 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[3 + 2 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[3 + 2 * 4] +
+ a->data[1 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 2 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 2 * 4] -
+ a->data[0 + 2 * 4] * a->data[1 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[1 + 2 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 2 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[3 + 3 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 2 * 4] +
+ a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[0 + 2 * 4] +
+ a->data[2 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 2 * 4] -
+ a->data[0 + 2 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4] -
+ a->data[1 + 2 * 4] * a->data[2 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[2 + 2 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ /** Remember that our matrix is already transposed and we also got the minors(inside each "inv" entry),
+ so we just use them. We use a->data[0 + 1 * 4] * inv.data[1 + 0 * 4] becouse inv.data is transposed **/
+ float det = a->data[0 + 0 * 4] * inv.data[0 + 0 * 4] + a->data[0 + 1 * 4] * inv.data[1 + 0 * 4] +
+ a->data[0 + 2 * 4] * inv.data[2 + 0 * 4] + a->data[0 + 3 * 4] * inv.data[3 + 0 * 4];
+
+ if(det == 0.0f)
+ return *a;
+
+ det = 1.0f / det;
+
+ for(i = 0; i < 16; i++)
+ inv.data[i] *= det;
+
+ return inv;
+}
+
+mat4_t mat4_mul(const mat4_t* a, const mat4_t* b)
+{
+ int i, j, k;
+ GLfloat sum = 0.0f;
+ mat4_t c;
+ mat4_identity(&c);
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 4; j++){
+ for(k = 0; k < 4; k++){
+ sum += a->data[i + k * 4] * b->data[k + j * 4];
+ }
+ c.data[i + j * 4] = sum;
+ sum = 0.0f;
+ }
+
+ return c;
+}
+
+mat4_t mat4_translate(const vec3_t *a)
+{
+ mat4_t b;
+ mat4_identity(&b);
+ b.data[0 + 3 * 4] = a->x;
+ b.data[1 + 3 * 4] = a->y;
+ b.data[2 + 3 * 4] = a->z;
+ return b;
+}
+
+mat4_t mat4_scale(GLfloat x, GLfloat y, GLfloat z)
+{
+ mat4_t b;
+ mat4_identity(&b);
+ b.data[0 + 0 * 4] = x;
+ b.data[1 + 1 * 4] = y;
+ b.data[2 + 2 * 4] = z;
+ return b;
+}
+
+mat4_t mat4_rotate(GLfloat degrees, const vec3_t* a)
+{
+ mat4_t b;
+ mat4_identity(&b);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees)), o = 1-c;
+ b.data[0 + 0 * 4] = a->x * a->x * o + c;
+ b.data[0 + 1 * 4] = a->x * a->y * o - a->z * s;
+ b.data[0 + 2 * 4] = a->x * a->z * o + a->y * s;
+
+ b.data[1 + 0 * 4] = a->x * a->y * o + a->z * s;
+ b.data[1 + 1 * 4] = a->y * a->y * o + c;
+ b.data[1 + 2 * 4] = a->y * a->z * o - a->x * s;
+
+ b.data[2 + 0 * 4] = a->x * a->z * o - a->y * s;
+ b.data[2 + 1 * 4] = a->y * a->z * o + a->x * s;
+ b.data[2 + 2 * 4] = a->z * a->z * o + c;
+ return b;
+}
+
+mat4_t mat4_rotate_x(GLfloat degrees)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[1 + 1 * 4] = c;
+ a.data[2 + 1 * 4] = s;
+ a.data[1 + 2 * 4] = -s;
+ a.data[2 + 2 * 4] = c;
+ return a;
+}
+
+mat4_t mat4_rotate_y(GLfloat degrees)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[0 + 0 * 4] = c;
+ a.data[2 + 0 * 4] = -s;
+ a.data[0 + 2 * 4] = s;
+ a.data[2 + 2 * 4] = c;
+ return a;
+}
+
+mat4_t mat4_rotate_z(GLfloat degrees)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[0 + 0 * 4] = c;
+ a.data[1 + 0 * 4] = s;
+ a.data[0 + 1 * 4] = -s;
+ a.data[1 + 1 * 4] = c;
+ return a;
+}
+
+mat4_t mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar)
+{
+ mat4_t a;
+ GLubyte i, j;
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 4; j++)
+ a.data[i + j * 4] = 0.0f;
+ fov = toRadians(fov); // To radians
+
+ a.data[0 + 0 * 4] = ( (1.0f / SDL_tanf( fov/2.0f )) / aspect);
+ a.data[1 + 1 * 4] = (1.0f / SDL_tanf( fov/2.0f ));
+ a.data[2 + 2 * 4] = -( (zFar + zNear) / (zFar - zNear) );
+ a.data[2 + 3 * 4] = -( ( 2.0f * zFar * zNear) / (zFar - zNear) );
+ a.data[3 + 2 * 4] = -1.0f;
+
+ return a;
+}
+
+mat4_t
+mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
+{
+ mat4_t a;
+ mat4_identity(&a);
+ a.data[0 + 0 * 4] = 2.0f / (right - left);
+ a.data[1 + 1 * 4] = 2.0f / (top - bottom);
+ a.data[2 + 2 * 4] = -1.0f;
+
+ a.data[0 + 3 * 4] = (left + right) / (left - right);
+ a.data[1 + 3 * 4] = (bottom + top) / (bottom - top);
+
+ return a;
+}
+
+mat4_t mat4_lookAt(vec3_t* eye, vec3_t* center, vec3_t* up)
+{
+ vec3_t temp = vec3_sub(center, eye);
+
+ vec3_t f = vec3_normalize(&temp);
+ vec3_t u = vec3_normalize(up);
+ temp = vec3_cross_mul(&f, &u);
+ vec3_t s = vec3_normalize(&temp);
+ u = vec3_cross_mul(&s, &f);
+
+ mat4_t a;
+ mat4_identity(&a);
+
+ a.data[0 + 0 * 4] = s.x;
+ a.data[0 + 1 * 4] = s.y;
+ a.data[0 + 2 * 4] = s.z;
+ a.data[1 + 0 * 4] = u.x;
+ a.data[1 + 1 * 4] = u.y;
+ a.data[1 + 2 * 4] = u.z;
+ a.data[2 + 0 * 4] =-f.x;
+ a.data[2 + 1 * 4] =-f.y;
+ a.data[2 + 2 * 4] =-f.z;
+ a.data[0 + 3 * 4] =-vec3_dot_mul(&s, eye);
+ a.data[1 + 3 * 4] =-vec3_dot_mul(&u, eye);
+ a.data[2 + 3 * 4] = vec3_dot_mul(&f, eye);
+
+ return a;
+}
+
+vec3_t mat4_mul_vec3(const mat4_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = a->data[0 + 0 * 4] * b->x + a->data[0 + 1 * 4] * b->y + a->data[0 + 2 * 4] * b->z + a->data[0 + 3 * 4];
+ c.y = a->data[1 + 0 * 4] * b->x + a->data[1 + 1 * 4] * b->y + a->data[1 + 2 * 4] * b->z + a->data[1 + 3 * 4];
+ c.z = a->data[2 + 0 * 4] * b->x + a->data[2 + 1 * 4] * b->y + a->data[2 + 2 * 4] * b->z + a->data[2 + 3 * 4];
+ return c;
+}
+
+vec4_t mat4_mul_vec4(const mat4_t *a, const vec4_t *b)
+{
+ vec4_t c;
+ c.x = a->data[0 + 0 * 4] * b->x + a->data[0 + 1 * 4] * b->y + a->data[0 + 2 * 4] * b->z + a->data[0 + 3 * 4] * b->w;
+ c.y = a->data[1 + 0 * 4] * b->x + a->data[1 + 1 * 4] * b->y + a->data[1 + 2 * 4] * b->z + a->data[1 + 3 * 4] * b->w;
+ c.z = a->data[2 + 0 * 4] * b->x + a->data[2 + 1 * 4] * b->y + a->data[2 + 2 * 4] * b->z + a->data[2 + 3 * 4] * b->w;
+ c.w = a->data[3 + 0 * 4] * b->x + a->data[3 + 1 * 4] * b->y + a->data[3 + 2 * 4] * b->z + a->data[3 + 3 * 4] * b->w;
+ return c;
+}
diff --git a/08-august/src/math/matrix4x4.h b/08-august/src/math/matrix4x4.h
new file mode 100644
index 0000000..b7d54aa
--- /dev/null
+++ b/08-august/src/math/matrix4x4.h
@@ -0,0 +1,40 @@
+#ifndef MATRIX4X4_H
+#define MATRIX4X4_H
+
+#include <GL/glew.h>
+#include "vector3f.h"
+#include "vector4f.h"
+
+/* accesing data: row + column * width */
+typedef struct
+{
+ GLfloat data[16];
+} mat4_t;
+
+extern void mat4_identity(mat4_t *a);
+extern mat4_t mat4_inverse(const mat4_t *a);
+extern mat4_t mat4_mul(const mat4_t *a, const mat4_t *b);
+
+extern mat4_t mat4_translate(const vec3_t *a);
+extern mat4_t mat4_scale(GLfloat x, GLfloat y, GLfloat z);
+extern mat4_t mat4_rotate_x(GLfloat degrees);
+extern mat4_t mat4_rotate_y(GLfloat degrees);
+extern mat4_t mat4_rotate_z(GLfloat degrees);
+extern mat4_t mat4_rotate(GLfloat degrees, const vec3_t *a);
+
+extern mat4_t
+mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar);
+
+extern mat4_t
+mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top);
+
+extern mat4_t
+mat4_lookAt(vec3_t *eye, vec3_t *center, vec3_t *up);
+
+extern vec3_t
+mat4_mul_vec3(const mat4_t *a, const vec3_t *b);
+
+extern vec4_t
+mat4_mul_vec4(const mat4_t *a, const vec4_t *b);
+
+#endif // MATRIX4X4_H
diff --git a/08-august/src/math/vector2f.c b/08-august/src/math/vector2f.c
new file mode 100644
index 0000000..37ffa9c
--- /dev/null
+++ b/08-august/src/math/vector2f.c
@@ -0,0 +1,54 @@
+#include "vector2f.h"
+#include <SDL2/SDL.h>
+
+vec2_t vec2_add(const vec2_t* a, const vec2_t* b)
+{
+ vec2_t c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ return c;
+}
+
+vec2_t vec2_sub(const vec2_t* a, const vec2_t* b)
+{
+ vec2_t c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ return c;
+}
+
+vec2_t vec2_scalar_mul(const vec2_t* a, GLfloat scalar)
+{
+ vec2_t c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ return c;
+}
+
+GLfloat vec2_dot_mul(const vec2_t* a, const vec2_t* b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) );
+}
+
+
+vec2_t vec2_cross_mul(const vec2_t* a, const vec2_t* b)
+{
+ vec2_t c;
+ c.x = (a->x * b->y) - (a->y * b->x);
+ c.y = (a->y * b->x) - (a->x * b->y);
+ return c;
+}
+
+GLfloat vec2_length(vec2_t* a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) );
+}
+
+vec2_t vec2_normalize(vec2_t* a)
+{
+ vec2_t b;
+ GLfloat length = vec2_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ return b;
+}
diff --git a/08-august/src/math/vector2f.h b/08-august/src/math/vector2f.h
new file mode 100644
index 0000000..bc1d0bc
--- /dev/null
+++ b/08-august/src/math/vector2f.h
@@ -0,0 +1,19 @@
+#ifndef VECTOR2F_H
+#define VECTOR2F_H
+
+#include <GL/glew.h>
+
+typedef struct
+{
+ GLfloat x, y;
+} vec2_t;
+
+extern vec2_t vec2_add(const vec2_t* a, const vec2_t* b);
+extern vec2_t vec2_sub(const vec2_t* a, const vec2_t* b);
+extern vec2_t vec2_scalar_mul(const vec2_t* a, GLfloat scalar);
+extern GLfloat vec2_dot_mul(const vec2_t* a, const vec2_t* b);
+extern vec2_t vec2_cross_mul(const vec2_t* a, const vec2_t* b);
+extern GLfloat vec2_length(vec2_t* a);
+extern vec2_t vec2_normalize(vec2_t* a);
+
+#endif // VECTOR2F_H
diff --git a/08-august/src/math/vector3f.c b/08-august/src/math/vector3f.c
new file mode 100644
index 0000000..2c2878c
--- /dev/null
+++ b/08-august/src/math/vector3f.c
@@ -0,0 +1,59 @@
+#include "vector3f.h"
+#include <SDL2/SDL.h>
+
+vec3_t vec3_add(const vec3_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ c.z = a->z + b->z;
+ return c;
+}
+
+vec3_t vec3_sub(const vec3_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ c.z = a->z - b->z;
+ return c;
+}
+
+vec3_t vec3_scalar_mul(const vec3_t* a, GLfloat scalar)
+{
+ vec3_t c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ c.z = a->z * scalar;
+ return c;
+}
+
+GLfloat vec3_dot_mul(const vec3_t* a, const vec3_t* b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) );
+}
+
+
+vec3_t vec3_cross_mul(const vec3_t* a, const vec3_t* b)
+{
+ vec3_t c;
+ c.x = (a->y * b->z) - (a->z * b->y);
+ c.y = (a->z * b->x) - (a->x * b->z);
+ c.z = (a->x * b->y) - (a->y * b->x);
+ return c;
+}
+
+GLfloat vec3_length(vec3_t* a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f));
+}
+
+vec3_t vec3_normalize(vec3_t* a)
+{
+ vec3_t b;
+ GLfloat length = vec3_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ b.z = a->z / length;
+ return b;
+}
diff --git a/08-august/src/math/vector3f.h b/08-august/src/math/vector3f.h
new file mode 100644
index 0000000..ab89cb8
--- /dev/null
+++ b/08-august/src/math/vector3f.h
@@ -0,0 +1,19 @@
+#ifndef VECTOR3F_H
+#define VECTOR3F_H
+
+#include <GL/glew.h>
+
+typedef struct
+{
+ GLfloat x, y, z;
+} vec3_t;
+
+extern vec3_t vec3_add(const vec3_t* a, const vec3_t* b);
+extern vec3_t vec3_sub(const vec3_t* a, const vec3_t* b);
+extern vec3_t vec3_scalar_mul(const vec3_t* a, GLfloat scalar);
+extern GLfloat vec3_dot_mul(const vec3_t* a, const vec3_t* b);
+extern vec3_t vec3_cross_mul(const vec3_t* a, const vec3_t* b);
+extern GLfloat vec3_length(vec3_t* a);
+extern vec3_t vec3_normalize(vec3_t* a);
+
+#endif // VECTOR3F_H
diff --git a/08-august/src/math/vector4f.c b/08-august/src/math/vector4f.c
new file mode 100644
index 0000000..57e4925
--- /dev/null
+++ b/08-august/src/math/vector4f.c
@@ -0,0 +1,53 @@
+#include "vector4f.h"
+#include <SDL2/SDL.h>
+
+vec4_t vec4_add(const vec4_t* a, const vec4_t* b)
+{
+ vec4_t c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ c.z = a->z + b->z;
+ c.w = a->w + b->w;
+ return c;
+}
+
+vec4_t vec4_sub(const vec4_t* a, const vec4_t* b)
+{
+ vec4_t c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ c.z = a->z - b->z;
+ c.w = a->w - b->w;
+ return c;
+}
+
+vec4_t vec4_scalar_mul(const vec4_t* a, GLfloat scalar)
+{
+ vec4_t c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ c.z = a->z * scalar;
+ c.w = a->w * scalar;
+ return c;
+}
+
+GLfloat vec4_dot_mul(const vec4_t* a, const vec4_t* b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) + (a->w * b->w) );
+}
+
+GLfloat vec4_length(vec4_t* a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f) + SDL_pow(a->w, 2.0f) );
+}
+
+vec4_t vec4_normalize(vec4_t* a)
+{
+ vec4_t b;
+ GLfloat length = vec4_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ b.z = a->z / length;
+ b.w = a->w / length;
+ return b;
+}
diff --git a/08-august/src/math/vector4f.h b/08-august/src/math/vector4f.h
new file mode 100644
index 0000000..9a2f149
--- /dev/null
+++ b/08-august/src/math/vector4f.h
@@ -0,0 +1,18 @@
+#ifndef VECTOR4F_H
+#define VECTOR4F_H
+
+#include <GL/glew.h>
+
+typedef struct
+{
+ GLfloat x, y, z, w;
+} vec4_t;
+
+extern vec4_t vec4_add(const vec4_t *a, const vec4_t *b);
+extern vec4_t vec4_sub(const vec4_t *a, const vec4_t *b);
+extern vec4_t vec4_scalar_mul(const vec4_t *a, GLfloat scalar);
+extern GLfloat vec4_dot_mul(const vec4_t *a, const vec4_t *b);
+extern GLfloat vec4_length(vec4_t *a);
+extern vec4_t vec4_normalize(vec4_t *a);
+
+#endif // VECTOR4F_H
diff --git a/08-august/src/player.c b/08-august/src/player.c
new file mode 100644
index 0000000..47f285b
--- /dev/null
+++ b/08-august/src/player.c
@@ -0,0 +1,62 @@
+#include "player.h"
+#include "util/util_time.h"
+#include "input.h"
+#include "util/util.h"
+
+#define MAX_MOVEMENT_SPEED 10
+#define MAX_ROTATION_SPEED 100
+#define GRAVITY -15
+#define JUMP_POWER 7
+
+static void jump(player_t* player)
+{
+ player->verticalSpeed = JUMP_POWER;
+}
+
+static void check_input(player_t* player)
+{
+ if(Input_isKeyPressed(SDL_SCANCODE_W)) {
+ player->speed = MAX_MOVEMENT_SPEED;
+ } else if(Input_isKeyPressed(SDL_SCANCODE_S)) {
+ player->speed = -MAX_MOVEMENT_SPEED;
+ } else {
+ player->speed = 0.0f;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_A)) {
+ player->turnSpeed = MAX_ROTATION_SPEED;
+ } else if(Input_isKeyPressed(SDL_SCANCODE_D)) {
+ player->turnSpeed = -MAX_ROTATION_SPEED;
+ } else {
+ player->turnSpeed = 0.0f;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_SPACE)) {
+ jump(player);
+ }
+}
+
+void Player_Init(player_t* player)
+{
+ player->entity.position = (vec3_t){ 0.0f, 35.0f, 0.0f };
+ player->entity.rotX = player->entity.rotY = player->entity.rotZ = 0;
+ player->speed = player->turnSpeed = player->verticalSpeed = 0;
+}
+
+void Player_Update(player_t *player, terrain_t *terrain)
+{
+ check_input(player);
+ player->entity.rotY += player->turnSpeed * Time_GetFrameTime();
+ player->entity.position.x += SDL_sinf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime();
+ player->entity.position.z += SDL_cosf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime();
+
+ //player->verticalSpeed += GRAVITY * Time_GetFrameTime();
+
+ //player->entity.position.y += player->verticalSpeed * Time_GetFrameTime();
+
+ GLfloat terrainHeight = Terrain_GetHeightOfTerrain(terrain, player->entity.position.x, player->entity.position.z);
+ if(player->entity.position.y - 1.0f < terrainHeight) {
+ //player->entity.position.y = terrainHeight + 1.0f;
+ //player->verticalSpeed = 0.0f;
+ }
+}
diff --git a/08-august/src/player.h b/08-august/src/player.h
new file mode 100644
index 0000000..654dc17
--- /dev/null
+++ b/08-august/src/player.h
@@ -0,0 +1,17 @@
+#ifndef PLAYER_H
+#define PLAYER_H
+
+#include "renderer/entity.h"
+#include "math/vector3f.h"
+#include "terrain.h"
+
+typedef struct
+{
+ entity_t entity;
+ float speed, turnSpeed, verticalSpeed;
+} player_t;
+
+extern void Player_Init(player_t* player);
+extern void Player_Update(player_t* player, terrain_t *terrain);
+
+#endif // PLAYER_H
diff --git a/08-august/src/renderer/entity.c b/08-august/src/renderer/entity.c
new file mode 100644
index 0000000..b96491d
--- /dev/null
+++ b/08-august/src/renderer/entity.c
@@ -0,0 +1,18 @@
+#include "entity.h"
+
+mat4_t Entity_GetModelTransform(entity_t* entity)
+{
+ mat4_t temp;
+ mat4_t rotation = mat4_rotate_x(entity->rotX);
+ temp = mat4_rotate_y(entity->rotY);
+ rotation = mat4_mul(&rotation, &temp);
+ temp = mat4_rotate_z(entity->rotZ);
+ rotation = mat4_mul(&rotation, &temp);
+
+ temp = mat4_translate(&entity->position);
+
+ mat4_t modelTransform = mat4_mul(&temp, &rotation);
+
+ return modelTransform;
+}
+
diff --git a/08-august/src/renderer/entity.h b/08-august/src/renderer/entity.h
new file mode 100644
index 0000000..ba33004
--- /dev/null
+++ b/08-august/src/renderer/entity.h
@@ -0,0 +1,20 @@
+#ifndef ENTITY_H
+#define ENTITY_H
+
+#include "../math/vector3f.h"
+#include "../math/matrix4x4.h"
+
+#include "shape.h"
+#include "../texture.h"
+
+typedef struct
+{
+ shape_t *shape;
+ GLuint texture;
+ vec3_t position;
+ float rotX, rotY, rotZ;
+} entity_t;
+
+extern mat4_t Entity_GetModelTransform(entity_t* entity);
+
+#endif // ENTITY_H
diff --git a/08-august/src/renderer/renderer.c b/08-august/src/renderer/renderer.c
new file mode 100644
index 0000000..2ea4426
--- /dev/null
+++ b/08-august/src/renderer/renderer.c
@@ -0,0 +1,147 @@
+#include "renderer.h"
+#include "../util/util_time.h"
+
+#include <string.h>
+
+#define MAX_LIGHTS 4
+
+void Render_Init()
+{
+
+}
+
+void Render_LoadLights(Shader_Layout *layout, const light_t *lights, int n)
+{
+ vec3_t light_positions[MAX_LIGHTS];
+ vec4_t light_colors[MAX_LIGHTS];
+ vec3_t attenuation[MAX_LIGHTS];
+
+ /* Default light in case we are not given enough lights (n < 4) */
+ const light_t defaultLight = { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f} };
+
+ int i;
+ for(i = 0; i < MAX_LIGHTS; i++)
+ {
+ if(i < MAX_LIGHTS)
+ {
+ light_positions[i] = lights[i].position;
+ light_colors[i] = lights[i].color;
+ attenuation[i] = lights[i].attenuation;
+ }
+ else
+ {
+ light_positions[i] = defaultLight.position;
+ light_colors[i] = defaultLight.color;
+ attenuation[i] = defaultLight.attenuation;
+ }
+
+ }
+
+ glUniform3fv(layout->lightPosition, MAX_LIGHTS, (float*)light_positions);
+ glUniform4fv(layout->lightColor, MAX_LIGHTS, (float*)light_colors);
+ glUniform3fv(layout->lightAttenuation, MAX_LIGHTS, (float*)attenuation);
+
+}
+
+void Render_DrawEntity(Shader_Layout *layout, mat4_t *projectedViewMatrix, entity_t *entity)
+{
+ glBindVertexArray(entity->shape->vao);
+
+ /*We need the model to world matrix in our shader in order to rotate the normals*/
+ mat4_t modelTransform = Entity_GetModelTransform(entity);
+ glUniformMatrix4fv(layout->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ mat4_t totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(layout->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ glActiveTexture(GL_TEXTURE0);
+ glUniform1i(layout->Texture, 0);
+ glBindTexture(GL_TEXTURE_2D, entity->texture);
+
+ glDrawElements(GL_TRIANGLES, entity->shape->num_indices, GL_UNSIGNED_SHORT, NULL);
+ glBindVertexArray(0);
+}
+
+/******************************************************************************
+* *
+* Function Name: Render_DrawTerrain *
+* *
+* Specific shader layout *
+* -> extra0 Texture_Background *
+* -> extra1 Texture_R *
+* -> extra2 Texture_G *
+* -> extra3 Texture_B *
+* -> extra4 Texture_BlendMap *
+* *
+*******************************************************************************/
+
+void Render_DrawTerrain(Shader_Layout *layout, mat4_t *projectedViewMatrix, terrain_t *terrain)
+{
+ glBindVertexArray(terrain->shape->vao);
+
+ /* We need the model to world matrix in our shader in order to rotate the normals */
+ mat4_t modelTransform = mat4_translate(&terrain->position);
+ glUniformMatrix4fv(layout->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ mat4_t totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(layout->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ /** Set textures for the terrain **/
+
+ glUniform1i(layout->extra0, 0);
+ glUniform1i(layout->extra1, 1);
+ glUniform1i(layout->extra2, 2);
+ glUniform1i(layout->extra3, 3);
+ glUniform1i(layout->extra4, 4);
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, terrain->textures.texture[0]);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, terrain->textures.texture[1]);
+ glActiveTexture(GL_TEXTURE2);
+ glBindTexture(GL_TEXTURE_2D, terrain->textures.texture[2]);
+ glActiveTexture(GL_TEXTURE3);
+ glBindTexture(GL_TEXTURE_2D, terrain->textures.texture[3]);
+ glActiveTexture(GL_TEXTURE4);
+ glBindTexture(GL_TEXTURE_2D, terrain->blendmap);
+
+ /************************************************************/
+
+ glDrawElements(GL_TRIANGLES, terrain->shape->num_indices, GL_UNSIGNED_SHORT, NULL);
+
+ glBindVertexArray(0);
+}
+
+void Render_DrawSky(Shader_Layout *layout, mat4_t *viewMatrix, mat4_t *projectionMatrix, skybox_t *sky)
+{
+ glBindVertexArray(sky->cube->vao);
+
+ mat4_t myViewMatrix = *viewMatrix;
+ sky->rotation += SKYBOX_ROTATION_SPEED * Time_GetFrameTime();
+ mat4_t rotateMatrix = mat4_rotate_y(sky->rotation);
+
+ /* We don't want to move the skybox around (We want it to stay with the camera in the midle),
+ just rotate it with the camera so we remove the translations components of the matrix */
+
+ myViewMatrix.data[0 + 3 * 4] = 0.0f;
+ myViewMatrix.data[1 + 3 * 4] = 0.0f;
+ myViewMatrix.data[2 + 3 * 4] = 0.0f;
+
+ myViewMatrix = mat4_mul(&myViewMatrix, &rotateMatrix);
+ mat4_t totalTransform = mat4_mul(projectionMatrix, &myViewMatrix);
+
+ glUniformMatrix4fv(layout->totalTransform, 1, GL_FALSE, totalTransform.data );
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, sky->texture);
+ glUniform1i(layout->Texture, 0);
+
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+
+ glBindVertexArray(0);
+}
+
+void Render_Quit()
+{
+
+}
diff --git a/08-august/src/renderer/renderer.h b/08-august/src/renderer/renderer.h
new file mode 100644
index 0000000..b6f4f76
--- /dev/null
+++ b/08-august/src/renderer/renderer.h
@@ -0,0 +1,18 @@
+#ifndef RENDERER_H
+#define RENDERER_H
+
+#include "../graphics/shaders.h"
+#include "entity.h"
+#include "skybox.h"
+#include "../terrain.h"
+#include "../light.h"
+
+extern void Render_Init();
+/* Load lights into the shader program */
+extern void Render_LoadLights(Shader_Layout *layout, const light_t *lights, int n);
+extern void Render_DrawEntity(Shader_Layout *layout, mat4_t *projectedViewMatrix, entity_t *entity);
+extern void Render_DrawTerrain(Shader_Layout *layout, mat4_t *projectedViewMatrix, terrain_t *terrain);
+extern void Render_DrawSky(Shader_Layout *layout, mat4_t *viewMatrix, mat4_t *projectionMatrix, skybox_t *sky);
+extern void Render_Quit();
+
+#endif // RENDERER_H
diff --git a/08-august/src/renderer/shape.c b/08-august/src/renderer/shape.c
new file mode 100644
index 0000000..7f274df
--- /dev/null
+++ b/08-august/src/renderer/shape.c
@@ -0,0 +1,335 @@
+#include "shape.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "../util/util.h"
+
+#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)
+
+shape_t *Shape_CreateFromRawData(vertex_t* vertices, GLsizeiptr vertexBuffersize,
+ GLushort* indices, GLsizeiptr indexBuffersize)
+{
+ shape_t *shape = malloc( sizeof(shape_t) );
+
+ shape->num_indices = ( indexBuffersize / sizeof(GLushort) );
+
+ glGenVertexArrays(1, &shape->vao);
+ glGenBuffers(1, &shape->vbo);
+ glGenBuffers(1, &shape->ebo);
+
+ glBindVertexArray(shape->vao);
+
+ glBindBuffer(GL_ARRAY_BUFFER, shape->vbo);
+ glBufferData(GL_ARRAY_BUFFER, vertexBuffersize, vertices, GL_STATIC_DRAW);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, shape->ebo);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffersize, indices, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+ glEnableVertexAttribArray(1);
+ glEnableVertexAttribArray(2);
+ glEnableVertexAttribArray(3);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, position) );
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, texCoord) );
+ glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, normal) );
+ glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, tangent) );
+
+ glBindVertexArray(0);
+
+ return shape;
+}
+
+shape_t* Shape_MakeSkyBox(float size)
+{
+ vec3_t positions[] =
+ {
+ {-size, size, -size}, {-size, -size, -size}, {+size, -size, -size},
+ {+size, -size, -size}, {+size, +size, -size}, {-size, +size, -size},
+
+ {-size, -size, +size}, {-size, -size, -size}, {-size, +size, -size},
+ {-size, +size, -size}, {-size, +size, +size}, {-size, -size, +size},
+
+ {+size, -size, -size}, {+size, -size, +size}, {+size, +size, +size},
+ {+size, +size, +size}, {+size, +size, -size}, {+size, -size, -size},
+
+ {-size, -size, +size}, {-size, +size, +size}, {+size, +size, +size},
+ {+size, +size, +size}, {+size, -size, +size}, {-size, -size, +size},
+
+ {-size, +size, -size}, {+size, +size, -size}, {+size, +size, +size},
+ {+size, +size, +size}, {-size, +size, +size}, {-size, +size, -size},
+
+ {-size, -size, -size}, {-size, -size, +size}, {+size, -size, -size},
+ {+size, -size, -size}, {-size, -size, +size}, {+size, -size, +size}
+ };
+
+ shape_t *shape = malloc( sizeof(shape_t) );
+
+ shape->num_indices = 0;
+
+ glGenVertexArrays(1, &shape->vao);
+ glGenBuffers(1, &shape->vbo);
+ shape->ebo = 0;
+
+ glBindVertexArray(shape->vao);
+
+ glBindBuffer(GL_ARRAY_BUFFER, shape->vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
+
+ glBindVertexArray(0);
+
+ return shape;
+}
+
+static const int BUFFER_size = 128;
+
+typedef struct
+{
+ vertex_t *data;
+ GLushort *indices;
+
+ vec3_t *positions;
+ vec2_t *textures;
+ vec3_t *normals;
+ vec3_t *tangents;
+
+ unsigned int vertex_count, index_count;
+ unsigned int index_pointer;
+
+ GLubyte hasTextCoords, hasNormals;
+} OBJ_Mesh;
+
+static vertex_t *search_index(vertex_t *pkey, vertex_t *pelem, unsigned int vertex_count)
+{
+ int i;
+ for(i = 0; i < vertex_count; i++)
+ {
+ if(pelem[i].position.x == pkey->position.x &&
+ pelem[i].position.y == pkey->position.y &&
+ pelem[i].position.z == pkey->position.z &&
+ pelem[i].texCoord.x == pkey->texCoord.x &&
+ pelem[i].texCoord.y == pkey->texCoord.y &&
+ pelem[i].normal.x == pkey->normal.x &&
+ pelem[i].normal.y == pkey->normal.y &&
+ pelem[i].normal.z == pkey->normal.z)
+ {
+ return &pelem[i];
+ }
+ }
+ return NULL;
+}
+
+static void calculate_tangents(OBJ_Mesh *mesh)
+{
+ int i;
+ for(i = 0; i < mesh->index_count; i += 3)
+ {
+ int i0 = i;
+ int i1 = i + 1;
+ int i2 = i + 2;
+
+ vec3_t *v0 = &mesh->positions[i0];
+ vec3_t *v1 = &mesh->positions[i1];
+ vec3_t *v2 = &mesh->positions[i2];
+
+ vec2_t *uv0 = &mesh->textures[i0];
+ vec2_t *uv1 = &mesh->textures[i1];
+ vec2_t *uv2 = &mesh->textures[i2];
+
+ vec3_t deltaPos1 = vec3_sub(v1, v0);
+ vec3_t deltaPos2 = vec3_sub(v2, v0);
+
+ vec2_t deltaUV1 = vec2_sub(uv1, uv0);
+ vec2_t deltaUV2 = vec2_sub(uv2, uv0);
+
+ GLfloat r = 1.0f / (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x);
+
+ deltaPos1 = vec3_scalar_mul(&deltaPos1, deltaUV2.y);
+ deltaPos2 = vec3_scalar_mul(&deltaPos2, deltaUV1.y);
+
+ vec3_t tangent = vec3_sub(&deltaPos1, &deltaPos2);
+ tangent = vec3_scalar_mul(&tangent, r);
+
+ mesh->tangents[i2] = tangent;
+ mesh->tangents[i1] = tangent;
+ mesh->tangents[i0] = tangent;
+ }
+ /*
+ We normalize the tangents at the end of the parse_obj_index loop
+ for(i = 0; i < mesh.index_count; i++)
+ {
+ mesh.tangents[i] = vec3_normalize(&mesh.tangents[i]);
+ }
+ */
+}
+
+static void parse_obj_index(OBJ_Mesh *mesh, vertex_t *current_vertex)
+{
+ vertex_t *indexOnArray = search_index(current_vertex, mesh->data, mesh->vertex_count);
+
+ /* We check if the vertex was already loaded, so the index points to the created vertex instead of repeating data*/
+ if(indexOnArray == NULL)
+ {
+ mesh->data = (vertex_t*) realloc( mesh->data, sizeof(vertex_t) * (++mesh->vertex_count) );
+
+ /* We make the index point to the last vertex added */
+ mesh->indices[mesh->index_pointer] = mesh->vertex_count - 1;
+
+ mesh->data[mesh->vertex_count - 1] = *current_vertex;
+ }
+ else
+ {
+ GLushort index = (GLushort)(indexOnArray - mesh->data);
+ mesh->data[index].tangent = vec3_add( &mesh->data[index].tangent,
+ &current_vertex->tangent );
+
+ /* We make the index point to the previus vertex added instead of creating a new one */
+ mesh->indices[mesh->index_pointer] = index;
+ }
+
+ mesh->index_pointer += 1;
+}
+
+shape_t* Shape_LoadOBJ(const char* path)
+{
+ OBJ_Mesh mesh;
+ memset( &mesh, 0, sizeof(OBJ_Mesh) );
+
+ vec3_t *positions = NULL;
+ vec3_t *normals = NULL;
+ vec2_t *textures = NULL;
+
+ vertex_t current_vertex;
+
+ unsigned int positions_count = 0, normals_count = 0, textures_count = 0;
+
+ int count = 0, i;
+ int texture[3], normal[3], verts[3];
+
+ FILE *file = fopen(path, "r");
+ if(file == NULL)
+ Util_FatalError("%s file could not be loaded!", path);
+
+ char buffer[BUFFER_size];
+ while( !feof(file) )
+ {
+ fgets(buffer, BUFFER_size, file);
+ switch(buffer[0])
+ {
+ case 'v':
+ if(buffer[1] == 't')
+ {
+ textures = (vec2_t*) realloc(textures, sizeof(vec2_t) * (++textures_count) );
+ count = sscanf(buffer, "vt %f %f\n", &textures[textures_count - 1].x,
+ &textures[textures_count - 1].y);
+
+ if(count != 2)
+ Util_FatalError("Bad texture coordinates on .obj file");
+ }
+ else if(buffer[1] == 'n')
+ {
+ normals = (vec3_t*) realloc(normals, sizeof(vec3_t) * (++normals_count) );
+ count = sscanf(buffer, "vn %f %f %f\n", &normals[normals_count - 1].x,
+ &normals[normals_count - 1].y, &normals[normals_count - 1].z);
+
+ if(count != 3)
+ Util_FatalError("Bad normals data on .obj file");
+ }
+ else
+ {
+ positions = (vec3_t*) realloc(positions, sizeof(vec3_t) * (++positions_count) );
+ count = sscanf(buffer, "v %f %f %f\n", &positions[positions_count - 1].x,
+ &positions[positions_count - 1].y, &positions[positions_count - 1].z);
+
+ if(count != 3)
+ Util_FatalError("Bad vertices data on .obj file");
+ }
+ break;
+ case 'f':
+ mesh.index_count += 3;
+
+ mesh.positions = realloc(mesh.positions, mesh.index_count * sizeof(vec3_t) );
+ mesh.textures = realloc(mesh.textures, mesh.index_count * sizeof(vec2_t) );
+ mesh.normals = realloc(mesh.normals, mesh.index_count * sizeof(vec3_t) );
+
+ count = sscanf(buffer, "f %d/%d/%d %d/%d/%d %d/%d/%d\n",
+ &verts[0], &texture[0], &normal[0],
+ &verts[1], &texture[1], &normal[1],
+ &verts[2], &texture[2], &normal[2]);
+
+ if(count != 9)
+ Util_FatalError("Bad face data on .obj file");
+
+ mesh.positions[mesh.index_count - 3] = positions[ verts[0] - 1 ];
+ mesh.textures[mesh.index_count - 3] = textures[ texture[0] - 1 ];
+ mesh.normals[mesh.index_count - 3] = normals[ normal[0] - 1 ];
+
+ mesh.positions[mesh.index_count - 2] = positions[ verts[1] - 1 ];
+ mesh.textures[mesh.index_count - 2] = textures[ texture[1] - 1 ];
+ mesh.normals[mesh.index_count - 2] = normals[ normal[1] - 1 ];
+
+ mesh.positions[mesh.index_count - 1] = positions[ verts[2] - 1 ];
+ mesh.textures[mesh.index_count - 1] = textures[ texture[2] - 1 ];
+ mesh.normals[mesh.index_count - 1] = normals[ normal[2] - 1 ];
+
+ break;
+ default:
+ break;
+ }
+ }
+
+ mesh.indices = malloc( mesh.index_count * sizeof(GLushort) );
+ mesh.tangents = malloc( mesh.index_count * sizeof(vec3_t) );
+ calculate_tangents(&mesh);
+
+ for(i = 0; i < mesh.index_count; i++)
+ {
+ current_vertex = (vertex_t){.position = mesh.positions[i], .texCoord = mesh.textures[i],
+ .normal = mesh.normals[i], .tangent = mesh.tangents[i] };
+ parse_obj_index(&mesh, &current_vertex);
+ }
+
+ for(i = 0; i < mesh.vertex_count; i++)
+ {
+ mesh.data[i].tangent = vec3_normalize(&mesh.data[i].tangent);
+ }
+
+ free(mesh.positions);
+ free(mesh.normals);
+ free(mesh.textures);
+ free(mesh.tangents);
+
+ free(positions);
+ free(textures);
+ free(normals);
+
+ fclose(file);
+
+ GLsizeiptr vertexBuffersize = mesh.vertex_count * sizeof(vertex_t);
+ GLsizeiptr indexBuffersize = mesh.index_count * sizeof(GLushort);
+
+ shape_t* shape = Shape_CreateFromRawData(mesh.data, vertexBuffersize, mesh.indices, indexBuffersize);
+
+ free(mesh.data);
+ free(mesh.indices);
+
+ return shape;
+}
+
+void Shape_Free(shape_t* shape)
+{
+ if(shape)
+ {
+ if(shape->vbo)
+ glDeleteBuffers(1, &shape->vbo);
+ if(shape->ebo)
+ glDeleteBuffers(1, &shape->ebo);
+ if(shape->vao)
+ glDeleteVertexArrays(1, &shape->vao);
+ free(shape);
+ }
+}
diff --git a/08-august/src/renderer/shape.h b/08-august/src/renderer/shape.h
new file mode 100644
index 0000000..8942548
--- /dev/null
+++ b/08-august/src/renderer/shape.h
@@ -0,0 +1,26 @@
+#ifndef SHAPE_H
+#define SHAPE_H
+
+#include "../vertex.h"
+
+typedef struct
+{
+ GLuint num_indices;
+ GLuint vbo, ebo, vao;
+} shape_t;
+
+extern shape_t* Shape_MakeCube();
+extern shape_t* Shape_MakeArrow();
+extern shape_t* Shape_MakeQuad();
+extern shape_t* Shape_MakeSkyBox(float size);
+
+extern shape_t* Shape_LoadOBJ(const char* path);
+
+extern shape_t* Shape_CreateFromRawData(vertex_t* vertices, GLsizeiptr vertexBufferSize,
+ GLushort* indices, GLsizeiptr indexBufferSize);
+
+extern void Shape_Free(shape_t* shape);
+
+
+
+#endif // SHAPE_H
diff --git a/08-august/src/renderer/skybox.h b/08-august/src/renderer/skybox.h
new file mode 100644
index 0000000..235ee1a
--- /dev/null
+++ b/08-august/src/renderer/skybox.h
@@ -0,0 +1,16 @@
+#ifndef SKYBOX_H
+#define SKYBOX_H
+
+#include <GL/glew.h>
+#include "shape.h"
+
+#define SKYBOX_ROTATION_SPEED 1.0f
+
+typedef struct
+{
+ GLuint texture;
+ shape_t *cube;
+ GLfloat rotation;
+} skybox_t;
+
+#endif // SKYBOX_H
diff --git a/08-august/src/terrain.c b/08-august/src/terrain.c
new file mode 100644
index 0000000..c3e972a
--- /dev/null
+++ b/08-august/src/terrain.c
@@ -0,0 +1,163 @@
+#include "terrain.h"
+#include "math/math_util.h"
+#include "math/vector3f.h"
+#include "util/util.h"
+
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+#include <math.h>
+
+#define PLANE_SIZE 128
+#define PLANE_MAX_HEIGHT 10
+
+#include <stdlib.h>
+
+#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)
+
+static float GetHeight(int x, int y, SDL_Surface* surface)
+{
+ if(x < 0 || x >= surface->w || y < 0 || y >= surface->h)
+ return 0.0f;
+
+ Uint32 pixel = ( (Uint32*)surface->pixels )[y * surface->w + x];
+ Uint8 r, g, b;
+ SDL_GetRGB(pixel, surface->format, &r, &g, &b);
+
+ float height = (float)r / 255.0f;
+
+ return height * 40.0f;
+}
+
+static vec3_t GenerateNomal(int x, int y, SDL_Surface* surface)
+{
+ float hLeft = GetHeight(x-1, y, surface);
+ float hRight = GetHeight(x+1, y, surface);
+ float hUp = GetHeight(x, y+1, surface);
+ float hDown = GetHeight(x, y-1, surface);
+
+ vec3_t normal = { hLeft - hRight, 2.0f, hDown - hUp};
+ return vec3_normalize(&normal);
+}
+
+GLfloat Terrain_GetHeightOfTerrain(terrain_t* terrain, GLfloat x, GLfloat z)
+{
+ GLfloat terrainX = x - terrain->position.x;
+ GLfloat terrainZ = z - terrain->position.z;
+
+ GLfloat gridSquareSize = (float)terrain->l / ( (float)PLANE_SIZE - 1 );
+
+ GLint gridX = (GLint) floor(terrainX / gridSquareSize);
+ GLint gridZ = (GLint) floor(terrainZ / gridSquareSize);
+
+ if(gridX >= PLANE_SIZE - 1 || gridX < 0 || gridZ >= PLANE_SIZE - 1 || gridZ < 0)
+ {
+ printf("called\n");
+ return 0;
+ }
+
+ GLfloat xCoord = fmod(terrainX, gridSquareSize) / gridSquareSize;
+ GLfloat zCoord = fmod(terrainZ, gridSquareSize) / gridSquareSize;
+ GLfloat answer;
+
+ /* Determine in which triangle of the square are we. "Bary Centric Interpolation"*/
+ if(xCoord <= (1 - zCoord)){
+ /* 0, heights[gridX][gridZ], 0) */
+ vec3_t p1 = { 0, terrain->height[ gridX * PLANE_SIZE + gridZ ], 0 };
+ /* 1, heights[gridX + 1][gridZ], 0) */
+ vec3_t p2 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + gridZ ], 0};
+ /* 0, heights[gridX][gridZ + 1], 1) */
+ vec3_t p3 = { 0, terrain->height[ gridX * PLANE_SIZE + (gridZ + 1) ], 1};
+
+ vec2_t pos = {xCoord, zCoord};
+
+ answer = baryCentric(&p1, &p2, &p3, &pos);
+ } else {
+ /* (1, heights[gridX + 1][gridZ], 0) */
+ vec3_t p1 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + gridZ ], 0 };
+ /* (1, heights[gridX + 1][gridZ + 1], 1) */
+ vec3_t p2 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + (gridZ + 1) ], 1};
+ /* (0, heights[gridX][gridZ + 1], 1) */
+ vec3_t p3 = { 0, terrain->height[ gridX * PLANE_SIZE + (gridZ + 1) ], 1};
+ vec2_t pos = {xCoord, zCoord};
+
+ answer = baryCentric(&p1, &p2, &p3, &pos);
+ }
+
+ return answer;
+}
+
+terrain_t *Terrain_Create( int w, int l, const char* heightmap_path, GLuint blendmap, TerrainTexturePack *textures )
+{
+ terrain_t *terrain = (terrain_t*) malloc( sizeof(terrain_t) );
+ terrain->height = (GLfloat*) malloc( sizeof(GLfloat) * PLANE_SIZE * PLANE_SIZE);
+
+ terrain->blendmap = blendmap;
+ terrain->w = w; terrain->l = l;
+ terrain->textures = *textures;
+
+ SDL_Surface* surface = IMG_Load(heightmap_path);
+ if(surface == NULL)
+ Util_FatalError("Heightmap file could not be loaded\n");
+
+ vertex_t data[PLANE_SIZE * PLANE_SIZE];
+ int x, y;
+ for(x = 0; x < PLANE_SIZE; x++)
+ {
+ for(y = 0; y < PLANE_SIZE; y++)
+ {
+ vertex_t* v = &data[y + x * PLANE_SIZE];
+ v->position = (vec3_t){ (float)x / (float)PLANE_SIZE, 0.0f, (float)y / (float)PLANE_SIZE };
+ /* Heightmap cordinates */
+ int image_x = v->position.x * surface->w, image_y = v->position.z * surface->h;
+
+ v->texCoord = (vec2_t){ v->position.x, v->position.z };
+ GLfloat height = GetHeight(image_x, image_y, surface);
+ terrain->height[y + x * PLANE_SIZE] = height;
+ v->position.y = height;
+ v->position.x *= w;
+ v->position.z *= l;
+
+ v->normal = GenerateNomal(image_x, image_y, surface);
+ }
+ }
+
+ int runner = 0;
+ GLushort indices[ (PLANE_SIZE-1) * (PLANE_SIZE-1) * 6 ];
+ for(x = 0; x < PLANE_SIZE-1; x++)
+ {
+ for(y = 0; y < PLANE_SIZE-1; y++)
+ {
+ indices[runner++] = PLANE_SIZE * x + y;
+ indices[runner++] = PLANE_SIZE * x + y + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE;
+
+ indices[runner++] = PLANE_SIZE * x + y + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE;
+ }
+ }
+
+ GLsizeiptr vertexBufferSize = NUM_ARRAY_ELEMENTS(data) * sizeof(vertex_t);
+ GLsizeiptr indexBufferSize = NUM_ARRAY_ELEMENTS(indices) * sizeof(GLushort);
+
+ SDL_FreeSurface(surface);
+
+ terrain->shape = Shape_CreateFromRawData(data, vertexBufferSize, indices, indexBufferSize);
+ return terrain;
+}
+
+void Terrain_Destroy( terrain_t* terrain )
+{
+ if(terrain->height)
+ free(terrain->height);
+
+ Shape_Free(terrain->shape);
+
+ int i;
+ for(i = 0; i < 4; i++)
+ Texture_Destroy(terrain->textures.texture[i]);
+
+ Texture_Destroy(terrain->blendmap);
+ free(terrain);
+}
+
diff --git a/08-august/src/terrain.h b/08-august/src/terrain.h
new file mode 100644
index 0000000..da9828b
--- /dev/null
+++ b/08-august/src/terrain.h
@@ -0,0 +1,27 @@
+#ifndef TERRAIN_H
+#define TERRAIN_H
+
+#include "renderer/shape.h"
+#include "texture.h"
+
+typedef struct
+{
+ GLuint texture[4];
+} TerrainTexturePack;
+
+typedef struct
+{
+ shape_t *shape;
+ GLuint blendmap;
+ TerrainTexturePack textures;
+
+ GLfloat *height;
+ int w, l;
+ vec3_t position;
+} terrain_t;
+
+extern terrain_t *Terrain_Create( int w, int l, const char* heightmap_path, GLuint blendmap, TerrainTexturePack *textures);
+extern GLfloat Terrain_GetHeightOfTerrain(terrain_t* terrain, GLfloat x, GLfloat z);
+extern void Terrain_Destroy( terrain_t *terrain );
+
+#endif // TERRAIN_H
diff --git a/08-august/src/texture.c b/08-august/src/texture.c
new file mode 100644
index 0000000..d1b70d9
--- /dev/null
+++ b/08-august/src/texture.c
@@ -0,0 +1,71 @@
+#include "texture.h"
+#include "util/util.h"
+
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+
+GLuint Texture_Create2D( const char *path )
+{
+ GLuint ID;
+ SDL_Surface *data = IMG_Load(path);
+ if(data == NULL)
+ Util_FatalError("Texture %s could not be found!\n", path);
+
+ glGenTextures(1, &ID);
+ glBindTexture(GL_TEXTURE_2D, ID);
+
+ SDL_LockSurface(data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
+ SDL_UnlockSurface(data);
+
+ glGenerateMipmap(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -2.4);
+
+ SDL_FreeSurface(data);
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ return ID;
+}
+
+GLuint Texture_CreateCubeMap( const char *paths[6] )
+{
+ GLuint ID;
+ glGenTextures(1, &ID);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, ID);
+
+ SDL_Surface *data;
+
+ int i;
+ for(i = 0; i < 6; i++)
+ {
+ data = IMG_Load(paths[i]);
+
+ if(data == NULL)
+ Util_FatalError("Texture %s could not be found!\n", paths[i]);
+
+ SDL_LockSurface(data);
+
+ /* All the textures sides are linearly stored so we just add "i" */
+ glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA,
+ data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
+
+ SDL_UnlockSurface(data);
+
+ SDL_FreeSurface(data);
+ }
+
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ return ID;
+}
+
+void Texture_Destroy(GLuint ID)
+{
+ glDeleteTextures(1, &ID);
+}
diff --git a/08-august/src/texture.h b/08-august/src/texture.h
new file mode 100644
index 0000000..ea19124
--- /dev/null
+++ b/08-august/src/texture.h
@@ -0,0 +1,10 @@
+#ifndef TEXTURE_H
+#define TEXTURE_H
+
+#include <GL/glew.h>
+
+extern GLuint Texture_Create2D( const char *path );
+extern GLuint Texture_CreateCubeMap( const char *paths[6] );
+extern void Texture_Destroy( GLuint ID );
+
+#endif // TEXTURE_H
diff --git a/08-august/src/util/util.c b/08-august/src/util/util.c
new file mode 100644
index 0000000..ad0f1ce
--- /dev/null
+++ b/08-august/src/util/util.c
@@ -0,0 +1,87 @@
+#include "util.h"
+
+#include <SDL2/SDL.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+void Util_FatalError( const char *error, ... )
+{
+ fprintf(stderr, "Fatal Error:\n");
+
+ va_list args;
+ va_start(args, error);
+ vfprintf(stderr, error, args);
+ va_end(args);
+
+ SDL_Quit();
+ exit(1);
+}
+
+char *Util_LoadFile( const char *path )
+{
+ FILE* file = fopen( path, "r" );
+
+ if(file == NULL)
+ {
+ Util_FatalError("File %s could not be found!\n", path);
+ }
+
+ fseek( file, 0, SEEK_END );
+ size_t sizeOfFile = ftell( file );
+ fseek( file, 0, SEEK_SET );
+ char* file_data = (char *) malloc( sizeof(char) * sizeOfFile + 1 );
+ fread( file_data, sizeof(char), sizeOfFile, file );
+ file_data[sizeOfFile] = '\0';
+ fclose(file);
+ return file_data;
+}
+
+float Util_RandomF(float min, float max)
+{
+ return ( min + (float)rand() ) / ( (float)RAND_MAX / (max-min) );
+}
+
+int Util_RandomI(int min, int max)
+{
+ return ( rand() % (max-min) ) + min;
+}
+
+vec3_t
+Util_GetMouseRay(int screenWidth, int screenHeigth, mat4_t *viewMatrix, mat4_t *projectionMatrix,
+ int mouseX, int mouseY)
+{
+ vec4_t eyeCoords;
+ vec3_t mouseRay;
+ /* Normalized device coords NOTE: -y becouse for SDL y = 0 is the top of the screen */
+ GLfloat normalX = ( 2.0f * (GLfloat)mouseX ) / (GLfloat) screenWidth - 1.0f;
+ GLfloat normalY = 1.0f - (2.0f * (GLfloat)mouseY) / (GLfloat) screenHeigth;
+
+ /* clipCoords include 4th component */
+ vec4_t clipCoords = { normalX, normalY, -1.0f, 1.0f };
+
+ /* Remove perpective */
+ {
+ mat4_t invertedProjection = mat4_inverse(projectionMatrix);
+ eyeCoords = mat4_mul_vec4(&invertedProjection, &clipCoords);
+ eyeCoords.z = -1.0f;
+ eyeCoords.w = 0.0f;
+ }
+
+ /* Remove view matrix*/
+ {
+ mat4_t invertedViewMatrix = mat4_inverse(viewMatrix);
+ vec4_t temp = mat4_mul_vec4(&invertedViewMatrix, &eyeCoords);
+
+ mouseRay.x = temp.x;
+ mouseRay.y = temp.y;
+ mouseRay.z = temp.z;
+
+ mouseRay = vec3_normalize(&mouseRay);
+ }
+
+ /* Return the ray in world coordinates */
+ return mouseRay;
+}
diff --git a/08-august/src/util/util.h b/08-august/src/util/util.h
new file mode 100644
index 0000000..7227547
--- /dev/null
+++ b/08-august/src/util/util.h
@@ -0,0 +1,25 @@
+#ifndef UTIL_H
+#define UTIL_H
+
+#include "../math/matrix4x4.h"
+
+#define toRadians(degrees) (degrees * 3.1415926 / 180.0f)
+#define toDegrees(radians) (radians * 180.0f / 3.1415926)
+
+#ifdef DEBUG
+#include <stdio.h>
+#define myAssert(expr) expr ? 1==1 : fprintf(stderr, "The expresion was not true\n")
+#else
+#define myAssert(expr)
+#endif // DEBUG
+
+extern void Util_FatalError( const char* error, ... );
+extern char* Util_LoadFile( const char* path );
+extern float Util_RandomF(float min, float max);
+extern int Util_RandomI(int min, int max);
+
+extern vec3_t
+Util_GetMouseRay(int screenWidth, int screenHeigth, mat4_t *viewMatrix, mat4_t *projectionMatrix,
+ int mouseX, int mouseY);
+
+#endif // UTIL_H
diff --git a/08-august/src/util/util_time.c b/08-august/src/util/util_time.c
new file mode 100644
index 0000000..b601379
--- /dev/null
+++ b/08-august/src/util/util_time.c
@@ -0,0 +1,52 @@
+#include "util_time.h"
+
+static struct
+{
+ float max_ticks_per_frame; //< cuantos ticks (tiempo demora) un frame
+ Uint32 counted_frames; //< cuantos frames han pasado
+ Uint32 start_ticks; //< ticks al iniciar la iteracion del loop
+ Uint32 beg_ticks; //< ticks desde el inicio del juego
+ Uint32 time_per_frame;
+} TIME = {
+ 1000.0f / 60.0f,
+ 0, 0, 0, 0
+};
+
+void Time_Init()
+{
+ TIME.beg_ticks = SDL_GetTicks();
+}
+
+void Time_Begin()
+{
+ TIME.start_ticks = SDL_GetTicks();
+}
+
+float Time_End()
+{
+ TIME.counted_frames += 1;
+ float FPS = TIME.counted_frames / ( (float)(SDL_GetTicks() - TIME.beg_ticks) / 1000.f );
+
+ float frameTicks = (float)(SDL_GetTicks() - TIME.start_ticks);
+ TIME.time_per_frame = frameTicks;
+ if(frameTicks < TIME.max_ticks_per_frame){
+ SDL_Delay( (Uint32)(TIME.max_ticks_per_frame - frameTicks) );
+ }
+
+ return FPS;
+}
+
+float Time_GetFrameTime()
+{
+ return (float)TIME.time_per_frame / 1000.0f;
+}
+
+void Time_SetMaxFramesPerSecond(Uint32 frames)
+{
+ TIME.max_ticks_per_frame = 1000.0f / (float)frames;
+}
+
+Uint32 Time_GetCountedFrames()
+{
+ return TIME.counted_frames;
+}
diff --git a/08-august/src/util/util_time.h b/08-august/src/util/util_time.h
new file mode 100644
index 0000000..3c3e470
--- /dev/null
+++ b/08-august/src/util/util_time.h
@@ -0,0 +1,13 @@
+#ifndef UTIL_TIME_H
+#define UTIL_TIME_H
+
+#include <SDL2/SDL.h>
+
+extern void Time_Init( void );
+extern void Time_Begin( void );
+extern float Time_End( void );
+extern void Time_SetMaxFramesPerSecond(Uint32 frames);
+extern float Time_GetFrameTime( void );
+extern Uint32 Time_GetCountedFrames( void );
+
+#endif // UTIL_TIME_H
diff --git a/08-august/src/vertex.h b/08-august/src/vertex.h
new file mode 100644
index 0000000..7ac2ec8
--- /dev/null
+++ b/08-august/src/vertex.h
@@ -0,0 +1,17 @@
+#ifndef VERTEX_H
+#define VERTEX_H
+
+#include <GL/glew.h>
+#include "math/vector2f.h"
+#include "math/vector3f.h"
+#include "math/vector4f.h"
+
+typedef struct
+{
+ vec3_t position;
+ vec2_t texCoord;
+ vec3_t normal;
+ vec3_t tangent;
+} vertex_t;
+
+#endif // VERTEX_H
diff --git a/09-september/Draw.c b/09-september/Draw.c
new file mode 100644
index 0000000..7138fb1
--- /dev/null
+++ b/09-september/Draw.c
@@ -0,0 +1,77 @@
+#include "game.h"
+
+/*We upload all the light vectors*/
+static const Light diffuseLight[4] =
+{
+ /* Sun Light */
+ { {5.0f, 50.0f, 2.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 0.0f, 0.0f} },
+ /* Other lights */
+ { {10.0f, 20.0f, 0.0f}, {1.0f, 0.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ { {20.0f, 20.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+ { {30.0f, 20.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} },
+};
+
+void Draw(Game *game)
+{
+ Mat4 viewMatrix, projectedViewMatrix, modelTransform, projectionMatrix;
+ Vec3 pos = {-10.0, 70.0, 10.0};
+ Vec3 viewDirection = {0.22, -0.77, -0.58};
+ Vec3 up = {0.0f, 1.0f, 0.0f};
+
+ Render_BeginFrame();
+ shader_set_uniform_vec3(game->shaderProgram, "World_eyePosition", (float *)&game->camera->position);
+ Render_LoadLights(game->shaderProgram, diffuseLight, 1);
+
+ texture_bind(game->normalMap[1], 13);
+ glUniform1i(game->shaderProgram->Normal_Map, 13);
+
+ viewMatrix = mat4_lookAt(&pos, &viewDirection, &up);
+ projectionMatrix = mat4_orthographic(-50.0f, 50.0f, -50.0f, 50.0f, -50.0f, 70.0f);
+ //
+ projectedViewMatrix = mat4_mul(&projectionMatrix, &viewMatrix);
+
+ Render_DrawEntity(game->shaderProgram, &projectedViewMatrix, &game->player.entity);
+
+ texture_bind(game->normalMap[0], 13);
+ Render_DrawEntity(game->shaderProgram, &projectedViewMatrix, &game->ents[0]);
+
+ Render_EndFrame();
+
+ Vec3 t = {-1.0f, 10.0f, -1.0f};
+ modelTransform = mat4_translate(&t);
+ Mat4 temp = mat4_scale(10.0f, 10.0f, 10.0f);
+ modelTransform = mat4_mul(&modelTransform, &temp);
+ viewMatrix = camera_get_model_to_view_matrix(game->camera);
+ projectionMatrix = game->camera->projectionMatrix;
+ projectedViewMatrix = mat4_mul(&projectionMatrix, &viewMatrix);
+
+ modelTransform = mat4_mul(&projectedViewMatrix, &modelTransform);
+
+ glBindTexture(GL_TEXTURE_2D, render.shadow_map);
+ glUseProgram(render.default_shader->id);
+ glUniform1i(render.default_shader->Texture, 0);
+ glUniformMatrix4fv(render.default_shader->totalTransform, 1, GL_FALSE, modelTransform.data);
+
+ glBindVertexArray(render.default_quad->vao);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ glBindVertexArray(0);
+
+ /*
+ glUseProgram(game->terrainProgram->id);
+
+ shader_set_uniform_vec3(game->terrainProgram, "World_eyePosition", (float *)&game->camera->position);
+ Render_LoadLights(game->terrainProgram, diffuseLight, 1);
+
+ Render_DrawTerrain(game->terrainProgram, &projectedViewMatrix, game->terrain);
+
+ glUseProgram(game->skyboxProgram->id);
+ Render_DrawSky(game->skyboxProgram, &viewMatrix, &game->camera->projectionMatrix, &game->sky);
+
+ glUseProgram(game->particlesProgram->id);
+ Render_DrawParticles(game->particlesProgram, &viewMatrix,
+ &game->camera->projectionMatrix);
+
+ */
+ glUseProgram(game->shaderProgram->id);
+ window_update(game->window);
+}
diff --git a/09-september/LoadResources.c b/09-september/LoadResources.c
new file mode 100644
index 0000000..5c42f79
--- /dev/null
+++ b/09-september/LoadResources.c
@@ -0,0 +1,136 @@
+#include "game.h"
+
+void CleanUp(Game *game)
+{
+ Terrain_Destroy(game->terrain);
+ Particles_Shutdown();
+ Render_Shutdown();
+}
+
+void LoadResources(Game *game)
+{
+ Render_Init(game->window);
+ Particles_Init();
+
+ Uint32 start = SDL_GetTicks();
+
+ game->shaderProgram = shader_new("shader_program", "resources/shaders/shader.vert",
+ "resources/shaders/shader.frag");
+
+ game->terrainProgram = shader_new("terrain_program", "resources/shaders/terrainShader.vert",
+ "resources/shaders/terrainShader.frag");
+
+ game->skyboxProgram = shader_new("skybox_program", "resources/shaders/skyboxShader.vert",
+ "resources/shaders/skyboxShader.frag");
+
+ game->particlesProgram = shader_new("particles_program", "resources/shaders/particlesShader.vert",
+ "resources/shaders/particlesShader.frag");
+ glUseProgram(game->shaderProgram->id);
+
+ Model *entsMesh = model_obj_new("resources/barrel.obj");
+
+ Texture *entsTexture = texture_new("resources/textures/barrel.png");
+ game->normalMap[0] = texture_new("resources/textures/bricks_normal.png");
+ game->normalMap[1] = texture_new("resources/textures/normal_map.png");
+ game->defaultNormalMap = texture_new("resources/textures/default_normal_map.png");
+
+
+ Player_Init(&game->player);
+ game->player.entity.texture = entsTexture;
+ game->player.entity.model = entsMesh;
+
+ {
+ Vec3 position = { 0.0f, 0.0f, 0.0f };
+ float rotation[3] = { 0.0f, 0.0f, 0.0f };
+ game->ents[0].position = position;
+ game->ents[0].rotX = rotation[0];
+ game->ents[0].rotY = rotation[1];
+ game->ents[0].rotZ = rotation[2];
+ game->ents[0].model = model_obj_new("resources/plane3.obj");
+ game->ents[0].texture = texture_new("resources/textures/bricks.png");
+ game->ents[0].index = 0;
+ game->ents[0].scale[0] = 1.0f;
+ game->ents[0].scale[1] = 1.0f;
+ game->ents[0].scale[2] = 1.0f;
+ }
+
+ {
+ Vec3 position = { -400.0f, 0.0f, -400.0f };
+ Texture *blendmap = texture_new("resources/textures/blendmap.png");
+ TerrainTexturePack pack =
+ {
+ {
+ texture_new("resources/textures/soil1.png"),
+ texture_new("resources/textures/soil2.png"),
+ texture_new("resources/textures/soil4.png"),
+ texture_new("resources/textures/soil3.png"),
+ }
+ };
+
+ game->terrain = Terrain_Create(800, 800, "resources/textures/heightmap.png", blendmap, &pack);
+ game->terrain->position = position;
+ }
+
+ {
+ game->sky.rotation = 0.0f;
+ game->sky.cube = mesh_make_skybox(500.0f);
+ const char *paths[6] =
+ {
+ "resources/textures/right.png",
+ "resources/textures/left.png",
+ "resources/textures/top.png",
+ "resources/textures/bottom.png",
+ "resources/textures/back.png",
+ "resources/textures/front.png"
+ };
+ game->sky.texture = texture_cubemap_new(paths);
+ }
+
+ ParticleSystem *sys = Particles_AddSystem();
+ game->s = sys;
+ sys->texture = texture_new("resources/textures/particleStar.png");
+ sys->position = game->player.entity.position;
+ sys->texture->number_of_rows = 1;
+ sys->emit_rate = 1;
+ sys->weight = 0.1f;
+ sys->life_length = 1.0f;
+ sys->speed = 10.0f;
+
+ /* Shader Layouts */
+ Shader *s = game->shaderProgram;
+
+ s->Texture = shader_get_uniform_location(s, "Texture");
+ s->modelToWorld = shader_get_uniform_location(s, "M_model");
+ s->totalTransform = shader_get_uniform_location(s, "M_MVP");
+ s->lightPosition = shader_get_uniform_location(s, "lightPosition");
+ s->lightColor = shader_get_uniform_location(s, "lightColor");
+ s->lightAttenuation = shader_get_uniform_location(s, "attenuation");
+ s->Normal_Map = shader_get_uniform_location(s, "normalMap");
+ s->extra0 = shader_get_uniform_location(s, "number_of_rows");
+ s->extra1 = shader_get_uniform_location(s, "offset");
+
+ s = game->terrainProgram;
+ s->modelToWorld = shader_get_uniform_location(s, "M_model");
+ s->totalTransform = shader_get_uniform_location(s, "M_MVP");
+ s->lightPosition = shader_get_uniform_location(s, "lightPosition");
+ s->lightColor = shader_get_uniform_location(s, "lightColor");
+ s->lightAttenuation = shader_get_uniform_location(s, "attenuation");
+
+ s->extra0 = shader_get_uniform_location(s, "Texture_Background");
+ s->extra1 = shader_get_uniform_location(s, "Texture_R");
+ s->extra2 = shader_get_uniform_location(s, "Texture_G");
+ s->extra3 = shader_get_uniform_location(s, "Texture_B");
+ s->extra4 = shader_get_uniform_location(s, "Texture_BlendMap");
+
+ s = game->skyboxProgram;
+ s->totalTransform = shader_get_uniform_location(s, "M_MVP");
+ s->Texture = shader_get_uniform_location(s, "cubeMap");
+
+ s = game->particlesProgram;
+ s->Texture = shader_get_uniform_location(s, "Texture");
+ s->extra0 = shader_get_uniform_location(s, "number_of_rows");
+
+ fprintf(stderr, "Loading time: %u (ms)\n", SDL_GetTicks() - start);
+
+ Util_CheckGLError();
+}
diff --git a/09-september/Makefile b/09-september/Makefile
new file mode 100644
index 0000000..c6add7a
--- /dev/null
+++ b/09-september/Makefile
@@ -0,0 +1,45 @@
+OBJDIR = obj
+RENDERDIR = tomcat/renderer
+MATHDIR = tomcat/math
+UTILDIR = tomcat/util
+PARTICLESDIR = tomcat/particles
+
+RENDEROBJ = $(RENDERDIR)/camera.o \
+ $(RENDERDIR)/entity.o \
+ $(RENDERDIR)/mesh.o \
+ $(RENDERDIR)/model.o \
+ $(RENDERDIR)/renderer.o \
+ $(RENDERDIR)/shader.o \
+ $(RENDERDIR)/texture.o \
+ $(RENDERDIR)/window.o
+
+MATHOBJ = $(MATHDIR)/math_util.o \
+ $(MATHDIR)/matrix4x4.o \
+ $(MATHDIR)/vector.o
+
+UTILOBJ = $(UTILDIR)/array.o \
+ $(UTILDIR)/str.o \
+ $(UTILDIR)/util.o \
+ $(UTILDIR)/util_time.o
+
+PARTICLESOBJ = $(PARTICLESDIR)/particles.o
+
+BASEOBJ = tomcat/input.o tomcat/terrain.o
+
+OBJS = main.o Draw.o LoadResources.o ProcessInput.o player.o $(RENDEROBJ) \
+ $(MATHOBJ) $(UTILOBJ) $(PARTICLESOBJ) $(BASEOBJ)
+
+TARGET = game
+CFLAGS = -g -std=c99 -Wall
+LDFLAGS = -lSDL2 -lSDL2_image -lGL -lGLEW -lm
+
+all: $(OBJS)
+ $(CC) $(LDFLAGS) $(OBJS) -o $(TARGET)
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+
+.PHONY: clean
+clean:
+ @rm -f $(OBJS) $(TARGET)
diff --git a/09-september/ProcessInput.c b/09-september/ProcessInput.c
new file mode 100644
index 0000000..0f088f8
--- /dev/null
+++ b/09-september/ProcessInput.c
@@ -0,0 +1,47 @@
+#include "game.h"
+#include <string.h>
+
+void ProcessInput(Game *game)
+{
+ static Vec2 mousePosition;
+ SDL_Event e;
+
+ while(SDL_PollEvent(&e))
+ {
+ switch(e.type)
+ {
+ case SDL_QUIT:
+ game->gameState = EXIT;
+ break;
+
+ case SDL_MOUSEMOTION:
+ mousePosition.x = (GLfloat) e.motion.x;
+ mousePosition.y = (GLfloat) e.motion.y;
+ camera_mouse_update(game->camera, &mousePosition);
+ break;
+
+ case SDL_KEYDOWN:
+ Input_PressKey(e.key.keysym.scancode);
+ break;
+
+ case SDL_KEYUP:
+ Input_ReleaseKey(e.key.keysym.scancode);
+ break;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_UP))
+ camera_move_foward(game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_DOWN))
+ camera_move_backward(game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_LEFT))
+ camera_move_left(game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_RIGHT))
+ camera_move_right(game->camera);
+
+ if(Input_isKeyPressed(SDL_SCANCODE_ESCAPE))
+ game->gameState = EXIT;
+ }
+}
diff --git a/09-september/game.h b/09-september/game.h
new file mode 100644
index 0000000..3225d39
--- /dev/null
+++ b/09-september/game.h
@@ -0,0 +1,54 @@
+#ifndef GAME_H
+#define GAME_H
+
+#include "tomcat/renderer/camera.h"
+#include "player.h"
+#include "tomcat/terrain.h"
+
+#include "tomcat/math/vector.h"
+#include "tomcat/math/matrix4x4.h"
+
+#include "tomcat/input.h"
+
+#include "tomcat/util/util.h"
+#include "tomcat/util/util_time.h"
+#include "tomcat/renderer/renderer_types.h"
+#include "tomcat/renderer/window.h"
+
+typedef enum
+{
+ MENU,
+ RUNNING,
+ EXIT
+}GameState;
+
+#define NUM_ENTITIES 1
+
+#define WINDOW_WIDTH 1024
+#define WINDOW_HEIGHT 768
+#define WINDOW_ASPECT_RATIO (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT
+
+typedef struct _Game
+{
+ GameState gameState;
+ Shader *shaderProgram, *terrainProgram, *skyboxProgram, *particlesProgram;
+
+ Entity ents[NUM_ENTITIES];
+ Texture *normalMap[2];
+ Texture *defaultNormalMap;
+ Terrain *terrain;
+ Skybox sky;
+
+ Player player;
+
+ Camera *camera;
+ Window *window;
+ ParticleSystem *s;
+} Game;
+
+extern void LoadResources(Game *game);
+extern void Draw(Game *game);
+extern void ProcessInput(Game *game);
+extern void CleanUp(Game *game);
+
+#endif // GAME_H
diff --git a/09-september/main.c b/09-september/main.c
new file mode 100644
index 0000000..0f6ee58
--- /dev/null
+++ b/09-september/main.c
@@ -0,0 +1,61 @@
+#include "game.h"
+
+/**
+ TODO: Shadows
+ Fix timing
+ Scenes
+ Materials
+ Text
+ Fix particle emission rate
+
+ +improve skybox
+ |
+ +->fog
+ +->day/night
+
+ +mouse picking (is it working perfectly?)
+
+ +add cell shading?
+
+ improve math package
+ repair gui on renderer.c
+ improve shape loading (normal generation) (support other formats)
+**/
+
+int main(int args, char *argv[])
+{
+ SDL_Init(SDL_INIT_EVERYTHING);
+
+ Game game;
+ game.gameState = RUNNING;
+ game.window = window_new("Test", WINDOW_WIDTH, WINDOW_HEIGHT);
+
+ game.camera = camera_new();
+ game.camera->projectionMatrix = mat4_perspective(60.0f, WINDOW_ASPECT_RATIO, 0.1f, 900.0f);
+
+ LoadResources(&game);
+
+ Time_Init();
+ SDL_GL_SetSwapInterval(1);
+ Time_SetMaxFramesPerSecond(60);
+ while(game.gameState != EXIT)
+ {
+ Time_Begin();
+ ProcessInput(&game);
+ Player_Update(&game.player, game.terrain);
+ Particles_Update(&game.camera->position);
+ Draw(&game);
+
+ float FPS = Time_End();
+
+ if( !( Time_GetCountedFrames() % (int)FPS ) )
+ {
+ fprintf(stderr, "FPS: %.4f\n", FPS);
+ }
+ }
+
+ window_destroy(game.window);
+ CleanUp(&game);
+ SDL_Quit();
+ return 0;
+}
diff --git a/09-september/player.c b/09-september/player.c
new file mode 100644
index 0000000..9258058
--- /dev/null
+++ b/09-september/player.c
@@ -0,0 +1,66 @@
+#include "player.h"
+#include "tomcat/util/util_time.h"
+#include "tomcat/input.h"
+#include "tomcat/util/util.h"
+
+#define MAX_MOVEMENT_SPEED 10
+#define MAX_ROTATION_SPEED 100
+#define GRAVITY -15
+#define JUMP_POWER 7
+
+static void jump(Player *player)
+{
+ player->verticalSpeed = JUMP_POWER;
+}
+
+static void check_input(Player *player)
+{
+ if(Input_isKeyPressed(SDL_SCANCODE_W)) {
+ player->speed = MAX_MOVEMENT_SPEED;
+ } else if(Input_isKeyPressed(SDL_SCANCODE_S)) {
+ player->speed = -MAX_MOVEMENT_SPEED;
+ } else {
+ player->speed = 0.0f;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_A)) {
+ player->turnSpeed = MAX_ROTATION_SPEED;
+ } else if(Input_isKeyPressed(SDL_SCANCODE_D)) {
+ player->turnSpeed = -MAX_ROTATION_SPEED;
+ } else {
+ player->turnSpeed = 0.0f;
+ }
+
+ if(Input_isKeyPressed(SDL_SCANCODE_SPACE)) {
+ jump(player);
+ }
+}
+
+void Player_Init(Player *player)
+{
+ Entity *e = &player->entity;
+ memset(player, 0, sizeof(Player));
+ e->position = (Vec3){ 0.0f, 35.0f, 0.0f };
+ e->scale[0] = 1.0f;
+ e->scale[1] = 1.0f;
+ e->scale[2] = 1.0f;
+}
+
+void Player_Update(Player *player, Terrain *terrain)
+{
+ check_input(player);
+ player->entity.rotY += player->turnSpeed * Time_GetFrameTime();
+ player->entity.position.x += SDL_sinf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime();
+ player->entity.position.z += SDL_cosf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime();
+
+ /*
+ player->verticalSpeed += GRAVITY * Time_GetFrameTime();
+ player->entity.position.y += player->verticalSpeed * Time_GetFrameTime();
+ */
+
+ GLfloat terrainHeight = Terrain_GetHeightOfTerrain(terrain, player->entity.position.x, player->entity.position.z);
+ if(player->entity.position.y - 1.0f < terrainHeight) {
+ //player->entity.position.y = terrainHeight + 1.0f;
+ //player->verticalSpeed = 0.0f;
+ }
+}
diff --git a/09-september/player.h b/09-september/player.h
new file mode 100644
index 0000000..146bf03
--- /dev/null
+++ b/09-september/player.h
@@ -0,0 +1,17 @@
+#ifndef PLAYER_H
+#define PLAYER_H
+
+#include "tomcat/renderer/renderer.h"
+#include "tomcat/math/vector.h"
+#include "tomcat/terrain.h"
+
+typedef struct
+{
+ Entity entity;
+ float speed, turnSpeed, verticalSpeed;
+} Player;
+
+extern void Player_Init(Player *player);
+extern void Player_Update(Player *player, Terrain *terrain);
+
+#endif // PLAYER_H
diff --git a/09-september/resources/barrel.obj b/09-september/resources/barrel.obj
new file mode 100644
index 0000000..70b1ccc
--- /dev/null
+++ b/09-september/resources/barrel.obj
@@ -0,0 +1,4970 @@
+# Blender v2.67 (sub 0) OBJ File: 'Wooden Barrel.blend'
+# www.blender.org
+o Mesh_Mesh_Cylinder.001
+v -0.787850 -6.030530 -3.960651
+v -1.545395 -6.030530 -3.730846
+v -2.243551 -6.030530 -3.357669
+v -2.855488 -6.030530 -2.855458
+v -3.357692 -6.030530 -2.243515
+v -3.730861 -6.030530 -1.545355
+v -3.960657 -6.030532 -0.787808
+v -4.038247 -6.030532 0.000014
+v -3.960650 -6.030532 0.787834
+v -3.730849 -6.030532 1.545380
+v -3.357673 -6.030532 2.243535
+v -2.855464 -6.030532 2.855475
+v -2.243523 -6.030532 3.357681
+v -1.545364 -6.030532 3.730853
+v -0.787818 -6.030532 3.960649
+v 0.000003 -6.030532 4.038245
+v 0.787825 -6.030532 3.960649
+v 1.545370 -6.030532 3.730852
+v 2.243529 -6.030532 3.357675
+v 2.855470 -6.030532 2.855470
+v 3.357677 -6.030532 2.243530
+v 3.730851 -6.030532 1.545371
+v 3.960651 -6.030532 0.787827
+v 4.038246 -6.030532 0.000006
+v 3.960654 -6.030532 -0.787817
+v 3.730856 -6.030530 -1.545366
+v 3.357683 -6.030530 -2.243527
+v 2.855477 -6.030530 -2.855469
+v 2.243536 -6.030530 -3.357678
+v 1.545376 -6.030530 -3.730854
+v 0.787829 -6.030530 -3.960654
+v 0.000006 -6.030530 -4.038250
+v 0.000000 -6.026094 -0.000003
+v 0.814696 5.429936 -4.095735
+v 0.000003 5.429936 -4.175975
+v 0.000003 -5.429935 -4.175979
+v 0.814696 -5.429935 -4.095738
+v 1.598080 5.429936 -3.858098
+v 1.598080 -5.429935 -3.858101
+v 2.320051 5.429936 -3.472194
+v 2.320051 -5.429935 -3.472198
+v 2.952864 5.429936 -2.952858
+v 2.952864 -5.429935 -2.952862
+v 3.472199 5.429936 -2.320044
+v 3.472199 -5.429935 -2.320048
+v 3.858100 5.429936 -1.598074
+v 3.858100 -5.429935 -1.598077
+v 4.095736 5.429935 -0.814688
+v 4.095736 -5.429937 -0.814691
+v 4.175976 5.429935 0.000005
+v 4.175976 -5.429937 0.000001
+v 4.095734 5.429935 0.814698
+v 4.095734 -5.429937 0.814694
+v 3.858097 5.429935 1.598080
+v 3.858097 -5.429937 1.598076
+v 3.472195 5.429935 2.320050
+v 3.472195 -5.429937 2.320046
+v 2.952859 5.429935 2.952863
+v 2.952859 -5.429937 2.952859
+v 2.320047 5.429935 3.472198
+v 2.320047 -5.429937 3.472194
+v 1.598076 5.429935 3.858100
+v 1.598076 -5.429937 3.858097
+v 0.814693 5.429935 4.095737
+v 0.814693 -5.429937 4.095733
+v 0.000001 5.429935 4.175976
+v 0.000001 -5.429937 4.175972
+v -0.814691 5.429935 4.095737
+v -0.814691 -5.429937 4.095733
+v -1.598075 5.429935 3.858100
+v -1.598075 -5.429937 3.858096
+v -2.320046 5.429935 3.472199
+v -2.320046 -5.429937 3.472196
+v -2.952858 5.429935 2.952866
+v -2.952858 -5.429937 2.952862
+v -3.472195 5.429935 2.320053
+v -3.472195 -5.429937 2.320049
+v -3.858098 5.429935 1.598082
+v -3.858098 -5.429937 1.598079
+v -4.095735 5.429935 0.814700
+v -4.095735 -5.429937 0.814696
+v -4.175976 5.429935 0.000006
+v -4.175976 -5.429937 0.000003
+v -4.095737 5.429935 -0.814686
+v -4.095737 -5.429937 -0.814689
+v -3.858102 5.429936 -1.598070
+v -3.858102 -5.429935 -1.598073
+v -3.472203 5.429936 -2.320040
+v -3.472203 -5.429935 -2.320044
+v -2.952868 5.429936 -2.952853
+v -2.952868 -5.429935 -2.952857
+v -2.320056 5.429936 -3.472191
+v -2.320056 -5.429935 -3.472195
+v -1.598087 5.429936 -3.858094
+v -1.598087 -5.429935 -3.858098
+v -0.814704 5.429936 -4.095734
+v -0.814704 -5.429935 -4.095738
+v 0.000001 5.314117 -4.114266
+v 0.802655 5.314117 -4.035212
+v 0.000001 -5.314116 -4.114270
+v 0.802655 -5.314116 -4.035216
+v 1.574463 5.314117 -3.801086
+v 1.574463 -5.314116 -3.801090
+v 2.285766 5.314117 -3.420886
+v 2.285766 -5.314116 -3.420890
+v 2.909227 5.314117 -2.909224
+v 2.909227 -5.314116 -2.909228
+v 3.420889 5.314117 -2.285762
+v 3.420889 -5.314116 -2.285766
+v 3.801088 5.314117 -1.574460
+v 3.801088 -5.314116 -1.574463
+v 4.035212 5.314116 -0.802650
+v 4.035212 -5.314117 -0.802654
+v 4.114267 5.314116 0.000003
+v 4.114267 -5.314117 -0.000001
+v 4.035211 5.314116 0.802658
+v 4.035211 -5.314117 0.802654
+v 3.801086 5.314116 1.574463
+v 3.801086 -5.314118 1.574460
+v 3.420887 5.314116 2.285766
+v 3.420887 -5.314118 2.285762
+v 2.909225 5.314116 2.909226
+v 2.909225 -5.314118 2.909223
+v 2.285764 5.314116 3.420888
+v 2.285764 -5.314118 3.420884
+v 1.574461 5.314116 3.801088
+v 1.574461 -5.314118 3.801084
+v 0.802653 5.314116 4.035214
+v 0.802653 -5.314118 4.035210
+v 0.000000 5.314116 4.114268
+v 0.000000 -5.314118 4.114264
+v -0.802654 5.314116 4.035214
+v -0.802654 -5.314118 4.035210
+v -1.574462 5.314116 3.801086
+v -1.574462 -5.314118 3.801083
+v -2.285764 5.314116 3.420889
+v -2.285764 -5.314118 3.420886
+v -2.909226 5.314116 2.909227
+v -2.909226 -5.314118 2.909224
+v -3.420888 5.314116 2.285766
+v -3.420888 -5.314118 2.285762
+v -3.801088 5.314116 1.574463
+v -3.801088 -5.314118 1.574460
+v -4.035212 5.314116 0.802656
+v -4.035212 -5.314117 0.802652
+v -4.114268 5.314116 0.000001
+v -4.114268 -5.314117 -0.000002
+v -4.035213 5.314116 -0.802651
+v -4.035213 -5.314117 -0.802655
+v -3.801088 5.314117 -1.574461
+v -3.801088 -5.314116 -1.574464
+v -3.420890 5.314117 -2.285762
+v -3.420890 -5.314116 -2.285766
+v -2.909228 5.314117 -2.909224
+v -2.909228 -5.314116 -2.909228
+v -2.285767 5.314117 -3.420887
+v -2.285767 -5.314116 -3.420891
+v -1.574464 5.314117 -3.801085
+v -1.574464 -5.314116 -3.801089
+v -0.802656 5.314117 -4.035212
+v -0.802656 -5.314116 -4.035216
+v 0.000000 4.895285 -4.204680
+v 0.820293 4.895285 -4.123888
+v 0.000000 -4.895283 -4.204684
+v 0.820293 -4.895283 -4.123892
+v 1.609062 4.895285 -3.884618
+v 1.609062 -4.895283 -3.884621
+v 2.335995 4.895285 -3.496063
+v 2.335995 -4.895283 -3.496066
+v 2.973158 4.895285 -2.973157
+v 2.973158 -4.895283 -2.973160
+v 3.496064 4.895285 -2.335993
+v 3.496064 -4.895283 -2.335997
+v 3.884618 4.895285 -1.609061
+v 3.884618 -4.895283 -1.609064
+v 4.123888 4.895283 -0.820292
+v 4.123888 -4.895284 -0.820295
+v 4.204680 4.895283 0.000001
+v 4.204680 -4.895284 -0.000002
+v 4.123887 4.895283 0.820293
+v 4.123887 -4.895284 0.820290
+v 3.884618 4.895283 1.609062
+v 3.884618 -4.895285 1.609058
+v 3.496063 4.895283 2.335996
+v 3.496063 -4.895285 2.335993
+v 2.973157 4.895283 2.973158
+v 2.973157 -4.895285 2.973155
+v 2.335994 4.895283 3.496064
+v 2.335994 -4.895285 3.496060
+v 1.609061 4.895283 3.884620
+v 1.609061 -4.895285 3.884616
+v 0.820291 4.895283 4.123889
+v 0.820291 -4.895285 4.123885
+v -0.000001 4.895283 4.204682
+v -0.000001 -4.895285 4.204678
+v -0.820294 4.895283 4.123889
+v -0.820294 -4.895285 4.123885
+v -1.609063 4.895283 3.884617
+v -1.609063 -4.895285 3.884614
+v -2.335996 4.895283 3.496064
+v -2.335996 -4.895285 3.496060
+v -2.973159 4.895283 2.973158
+v -2.973159 -4.895285 2.973155
+v -3.496065 4.895283 2.335995
+v -3.496065 -4.895285 2.335992
+v -3.884619 4.895283 1.609061
+v -3.884619 -4.895285 1.609057
+v -4.123888 4.895283 0.820291
+v -4.123888 -4.895284 0.820288
+v -4.204681 4.895283 -0.000001
+v -4.204681 -4.895284 -0.000004
+v -4.123888 4.895283 -0.820294
+v -4.123888 -4.895284 -0.820297
+v -3.884618 4.895285 -1.609063
+v -3.884618 -4.895283 -1.609066
+v -3.496063 4.895285 -2.335997
+v -3.496063 -4.895283 -2.336000
+v -2.973157 4.895285 -2.973158
+v -2.973157 -4.895283 -2.973161
+v -2.335994 4.895285 -3.496065
+v -2.335994 -4.895283 -3.496068
+v -1.609060 4.895285 -3.884619
+v -1.609060 -4.895283 -3.884622
+v -0.820291 4.895285 -4.123888
+v -0.820291 -4.895283 -4.123892
+v 0.000000 3.563111 -4.433841
+v 0.000000 4.053377 -4.338616
+v 0.846422 4.053378 -4.255250
+v 0.864999 3.563111 -4.348646
+v 0.846422 -4.053376 -4.255252
+v 0.000000 -4.053376 -4.338618
+v 0.000000 -3.563108 -4.433843
+v 0.864999 -3.563108 -4.348648
+v 1.660317 4.053378 -4.008359
+v 1.696757 3.563111 -4.096335
+v 1.660317 -4.053376 -4.008361
+v 1.696757 -3.563108 -4.096337
+v 2.410405 4.053378 -3.607427
+v 2.463310 3.563111 -3.686604
+v 2.410405 -4.053376 -3.607430
+v 2.463310 -3.563108 -3.686605
+v 3.067865 4.053377 -3.067864
+v 3.135198 3.563111 -3.135199
+v 3.067865 -4.053376 -3.067867
+v 3.135198 -3.563108 -3.135201
+v 3.607427 4.053378 -2.410405
+v 3.686603 3.563111 -2.463310
+v 3.607427 -4.053376 -2.410408
+v 3.686603 -3.563108 -2.463311
+v 4.008358 4.053378 -1.660317
+v 4.096334 3.563110 -1.696757
+v 4.008358 -4.053376 -1.660320
+v 4.096334 -3.563109 -1.696760
+v 4.255250 4.053377 -0.846422
+v 4.348645 3.563110 -0.864999
+v 4.255250 -4.053377 -0.846425
+v 4.348645 -3.563109 -0.865002
+v 4.338616 4.053377 0.000001
+v 4.433840 3.563109 -0.000000
+v 4.338616 -4.053377 -0.000002
+v 4.433840 -3.563110 -0.000003
+v 4.255250 4.053375 0.846423
+v 4.348645 3.563109 0.864999
+v 4.255250 -4.053377 0.846420
+v 4.348645 -3.563110 0.864996
+v 4.008358 4.053376 1.660316
+v 4.096334 3.563109 1.696756
+v 4.008358 -4.053378 1.660313
+v 4.096334 -3.563110 1.696753
+v 3.607427 4.053376 2.410406
+v 3.686603 3.563108 2.463310
+v 3.607427 -4.053378 2.410403
+v 3.686603 -3.563111 2.463309
+v 3.067864 4.053376 3.067865
+v 3.135198 3.563108 3.135199
+v 3.067864 -4.053378 3.067862
+v 3.135198 -3.563111 3.135196
+v 2.410405 4.053374 3.607427
+v 2.463309 3.563108 3.686603
+v 2.410405 -4.053378 3.607424
+v 2.463309 -3.563111 3.686600
+v 1.660315 4.053376 4.008358
+v 1.696756 3.563108 4.096334
+v 1.660315 -4.053378 4.008357
+v 1.696756 -3.563111 4.096333
+v 0.846421 4.053376 4.255250
+v 0.864998 3.563108 4.348646
+v 0.846421 -4.053378 4.255249
+v 0.864998 -3.563111 4.348643
+v -0.000001 4.053374 4.338614
+v -0.000002 3.563108 4.433842
+v -0.000001 -4.053378 4.338614
+v -0.000002 -3.563111 4.433839
+v -0.846424 4.053376 4.255250
+v -0.865001 3.563108 4.348646
+v -0.846424 -4.053378 4.255249
+v -0.865001 -3.563111 4.348643
+v -1.660318 4.053374 4.008358
+v -1.696760 3.563108 4.096334
+v -1.660318 -4.053378 4.008356
+v -1.696760 -3.563111 4.096332
+v -2.410408 4.053376 3.607428
+v -2.463312 3.563108 3.686603
+v -2.410408 -4.053378 3.607425
+v -2.463312 -3.563111 3.686600
+v -3.067867 4.053376 3.067865
+v -3.135201 3.563108 3.135199
+v -3.067867 -4.053378 3.067862
+v -3.135201 -3.563111 3.135196
+v -3.607429 4.053374 2.410404
+v -3.686605 3.563108 2.463307
+v -3.607429 -4.053378 2.410401
+v -3.686605 -3.563111 2.463305
+v -4.008361 4.053376 1.660315
+v -4.096337 3.563109 1.696754
+v -4.008361 -4.053378 1.660312
+v -4.096337 -3.563110 1.696751
+v -4.255252 4.053375 0.846421
+v -4.348647 3.563109 0.864996
+v -4.255252 -4.053377 0.846417
+v -4.348647 -3.563110 0.864993
+v -4.338617 4.053377 -0.000003
+v -4.433841 3.563109 -0.000003
+v -4.338617 -4.053377 -0.000006
+v -4.433841 -3.563110 -0.000006
+v -4.255250 4.053375 -0.846425
+v -4.348644 3.563110 -0.865003
+v -4.255250 -4.053377 -0.846428
+v -4.348644 -3.563109 -0.865006
+v -4.008358 4.053377 -1.660319
+v -4.096333 3.563110 -1.696761
+v -4.008358 -4.053376 -1.660322
+v -4.096333 -3.563109 -1.696764
+v -3.607426 4.053378 -2.410409
+v -3.686602 3.563111 -2.463314
+v -3.607426 -4.053376 -2.410412
+v -3.686602 -3.563108 -2.463315
+v -3.067863 4.053378 -3.067867
+v -3.135195 3.563111 -3.135201
+v -3.067863 -4.053376 -3.067870
+v -3.135195 -3.563108 -3.135203
+v -2.410403 4.053378 -3.607430
+v -2.463306 3.563111 -3.686606
+v -2.410403 -4.053376 -3.607433
+v -2.463306 -3.563108 -3.686609
+v -1.660313 4.053378 -4.008360
+v -1.696753 3.563111 -4.096336
+v -1.660313 -4.053376 -4.008362
+v -1.696753 -3.563108 -4.096338
+v -0.846418 4.053378 -4.255251
+v -0.864994 3.563111 -4.348647
+v -0.846418 -4.053376 -4.255253
+v -0.864994 -3.563108 -4.348649
+v 0.814693 -5.429937 4.095733
+v 0.000000 2.681008 -4.510056
+v 0.879868 2.681008 -4.423396
+v 0.814693 5.429935 4.095737
+v 0.879868 -2.681005 -4.423398
+v 0.000000 -2.681005 -4.510057
+v 1.598076 -5.429937 3.858097
+v 1.598076 5.429935 3.858100
+v 1.725923 2.681008 -4.166749
+v 2.320047 -5.429937 3.472194
+v 1.725923 -2.681005 -4.166750
+v 2.320047 5.429935 3.472198
+v 2.505652 2.681008 -3.749974
+v 2.952859 -5.429937 2.952859
+v 2.505652 -2.681005 -3.749975
+v 2.952859 5.429935 2.952863
+v 3.189090 2.681007 -3.189090
+v 3.472195 -5.429937 2.320046
+v 3.189090 -2.681005 -3.189092
+v 3.472195 5.429935 2.320050
+v 3.749973 2.681007 -2.505652
+v 3.858097 -5.429937 1.598076
+v 3.749973 -2.681005 -2.505655
+v 3.858097 5.429935 1.598080
+v 4.166746 2.681007 -1.725924
+v 4.095734 -5.429937 0.814694
+v 4.166746 -2.681006 -1.725925
+v 4.095734 5.429935 0.814698
+v 4.423394 2.681007 -0.879869
+v 4.175976 -5.429937 0.000001
+v 4.423394 -2.681006 -0.879870
+v 4.175976 5.429935 0.000005
+v 4.510054 2.681006 -0.000001
+v 4.095736 -5.429937 -0.814691
+v 4.510054 -2.681007 -0.000002
+v 4.095736 5.429935 -0.814688
+v 4.423394 2.681006 0.879867
+v 3.858100 -5.429935 -1.598077
+v 4.423394 -2.681007 0.879866
+v 3.858100 5.429936 -1.598074
+v 4.166746 2.681006 1.725922
+v 3.472199 -5.429935 -2.320048
+v 4.166746 -2.681007 1.725921
+v 3.472199 5.429936 -2.320044
+v 3.749973 2.681005 2.505651
+v 2.952864 -5.429935 -2.952862
+v 3.749973 -2.681007 2.505650
+v 2.952864 5.429936 -2.952858
+v 3.189090 2.681005 3.189090
+v 2.320051 -5.429935 -3.472198
+v 3.189090 -2.681007 3.189088
+v 2.320051 5.429936 -3.472194
+v 2.505651 2.681005 3.749973
+v 1.598080 -5.429935 -3.858101
+v 2.505651 -2.681008 3.749970
+v 1.598080 5.429936 -3.858098
+v 1.725922 2.681005 4.166748
+v 0.814696 -5.429935 -4.095738
+v 1.725922 -2.681008 4.166746
+v 0.000003 -5.429935 -4.175979
+v 0.879867 2.681005 4.423395
+v 0.000003 5.429936 -4.175975
+v 0.879867 -2.681008 4.423392
+v 0.814696 5.429936 -4.095735
+v -0.000002 2.681005 4.510055
+v -0.787850 -6.030530 -3.960651
+v -0.000002 -2.681008 4.510053
+v -0.787850 6.030532 -3.960648
+v -0.879870 2.681005 4.423395
+v -1.545395 -6.030530 -3.730846
+v -0.879870 -2.681008 4.423392
+v -1.545395 6.030532 -3.730842
+v -1.725926 2.681005 4.166748
+v -2.243551 -6.030530 -3.357669
+v -1.725926 -2.681008 4.166746
+v -2.243551 6.030532 -3.357665
+v -2.505655 2.681005 3.749974
+v -2.855488 -6.030530 -2.855458
+v -2.505655 -2.681008 3.749972
+v -2.855488 6.030532 -2.855454
+v -3.189093 2.681005 3.189090
+v -3.357692 -6.030530 -2.243515
+v -3.189093 -2.681007 3.189088
+v -3.357692 6.030532 -2.243511
+v -3.749976 2.681005 2.505650
+v -3.730861 -6.030530 -1.545355
+v -3.749976 -2.681007 2.505647
+v -3.730861 6.030532 -1.545351
+v -4.166750 2.681006 1.725919
+v -3.960657 -6.030532 -0.787808
+v -4.166750 -2.681007 1.725918
+v -3.960657 6.030531 -0.787804
+v -4.423396 2.681006 0.879864
+v -4.038247 -6.030532 0.000014
+v -4.423396 -2.681007 0.879863
+v -4.038247 6.030531 0.000018
+v -4.510055 2.681006 -0.000005
+v -3.960650 -6.030532 0.787834
+v -4.510055 -2.681007 -0.000006
+v -3.960650 6.030531 0.787838
+v -4.423394 2.681007 -0.879873
+v -3.730849 -6.030532 1.545380
+v -4.423394 -2.681006 -0.879874
+v -3.730849 6.030530 1.545383
+v -4.166745 2.681007 -1.725927
+v -3.357673 -6.030532 2.243535
+v -4.166745 -2.681006 -1.725929
+v -3.357673 6.030530 2.243539
+v -3.749971 2.681007 -2.505656
+v -2.855464 -6.030532 2.855475
+v -3.749971 -2.681005 -2.505658
+v -2.855464 6.030530 2.855479
+v -3.189087 2.681007 -3.189094
+v -2.243523 -6.030532 3.357681
+v -3.189087 -2.681005 -3.189095
+v -2.243523 6.030530 3.357685
+v -2.505648 2.681008 -3.749978
+v -1.545364 -6.030532 3.730853
+v -2.505648 -2.681005 -3.749979
+v -1.545364 6.030530 3.730856
+v -1.725918 2.681008 -4.166750
+v -0.787818 -6.030532 3.960649
+v -1.725918 -2.681005 -4.166752
+v -0.787818 6.030530 3.960653
+v -0.879862 2.681008 -4.423398
+v 0.000003 -6.030532 4.038245
+v -0.879862 -2.681005 -4.423399
+v 0.000003 6.030530 4.038249
+v 0.787825 -6.030532 3.960649
+v 0.787825 6.030530 3.960653
+v 1.545370 -6.030532 3.730852
+v 1.545370 6.030530 3.730856
+v 2.243529 -6.030532 3.357675
+v 2.243529 6.030530 3.357678
+v 2.855470 -6.030532 2.855470
+v 2.855470 6.030530 2.855474
+v 3.357677 -6.030532 2.243530
+v 3.357677 6.030530 2.243534
+v 3.730851 -6.030532 1.545371
+v 3.730851 6.030530 1.545375
+v 3.960651 -6.030532 0.787827
+v 3.960651 6.030531 0.787831
+v 4.038246 -6.030532 0.000006
+v 4.038246 6.030531 0.000010
+v 3.960654 -6.030532 -0.787817
+v 3.960654 6.030531 -0.787813
+v 3.730856 -6.030530 -1.545366
+v 3.730856 6.030532 -1.545362
+v 3.357683 -6.030530 -2.243527
+v 3.357683 6.030532 -2.243524
+v 2.855477 -6.030530 -2.855469
+v 2.855477 6.030532 -2.855465
+v 2.243536 -6.030530 -3.357678
+v 2.243536 6.030532 -3.357675
+v 1.545376 -6.030530 -3.730854
+v 1.545376 6.030532 -3.730850
+v 0.787829 -6.030530 -3.960654
+v 0.000006 -6.030530 -4.038250
+v 0.000006 6.030532 -4.038247
+v 0.787829 6.030532 -3.960650
+v 0.000000 4.798631 -4.281936
+v 0.835364 4.798632 -4.199658
+v 0.000000 -4.798628 -4.281940
+v 0.835364 -4.798630 -4.199662
+v 1.638626 4.798632 -3.955993
+v 1.638626 -4.798630 -3.955996
+v 2.378916 4.798632 -3.560299
+v 2.378916 -4.798630 -3.560302
+v 3.027786 4.798631 -3.027785
+v 3.027786 -4.798628 -3.027788
+v 3.560299 4.798632 -2.378915
+v 3.560299 -4.798630 -2.378918
+v 3.955992 4.798632 -1.638625
+v 3.955992 -4.798630 -1.638628
+v 4.199659 4.798630 -0.835364
+v 4.199659 -4.798631 -0.835367
+v 4.281935 4.798630 0.000001
+v 4.281935 -4.798631 -0.000002
+v 4.199659 4.798629 0.835366
+v 4.199659 -4.798630 0.835362
+v 3.955992 4.798630 1.638626
+v 3.955992 -4.798632 1.638622
+v 3.560298 4.798630 2.378917
+v 3.560298 -4.798632 2.378913
+v 3.027785 4.798630 3.027787
+v 3.027785 -4.798632 3.027783
+v 2.378915 4.798628 3.560299
+v 2.378915 -4.798631 3.560296
+v 1.638625 4.798630 3.955994
+v 1.638625 -4.798632 3.955991
+v 0.835363 4.798630 4.199660
+v 0.835363 -4.798632 4.199656
+v -0.000001 4.798628 4.281937
+v -0.000001 -4.798631 4.281933
+v -0.835366 4.798630 4.199660
+v -0.835366 -4.798632 4.199656
+v -1.638627 4.798628 3.955993
+v -1.638627 -4.798631 3.955990
+v -2.378917 4.798630 3.560299
+v -2.378917 -4.798632 3.560296
+v -3.027787 4.798630 3.027787
+v -3.027787 -4.798632 3.027783
+v -3.560301 4.798628 2.378915
+v -3.560301 -4.798631 2.378912
+v -3.955994 4.798630 1.638625
+v -3.955994 -4.798632 1.638621
+v -4.199660 4.798629 0.835363
+v -4.199660 -4.798630 0.835360
+v -4.281936 4.798630 -0.000002
+v -4.281936 -4.798631 -0.000005
+v -4.199659 4.798629 -0.835367
+v -4.199659 -4.798630 -0.835370
+v -3.955992 4.798631 -1.638628
+v -3.955992 -4.798628 -1.638631
+v -3.560298 4.798632 -2.378918
+v -3.560298 -4.798630 -2.378921
+v -3.027784 4.798632 -3.027787
+v -3.027784 -4.798630 -3.027790
+v -2.378914 4.798632 -3.560301
+v -2.378914 -4.798630 -3.560304
+v -1.638623 4.798632 -3.955994
+v -1.638623 -4.798630 -3.955997
+v -0.835361 4.798632 -4.199659
+v -0.835361 -4.798630 -4.199663
+v 0.000000 4.156910 -4.371553
+v 0.852848 4.156911 -4.287555
+v 0.852848 -4.156909 -4.287557
+v 0.000000 -4.156909 -4.371555
+v 1.672921 4.156911 -4.038788
+v 1.672921 -4.156909 -4.038791
+v 2.428705 4.156911 -3.634813
+v 2.428705 -4.156909 -3.634816
+v 3.091155 4.156910 -3.091154
+v 3.091155 -4.156909 -3.091157
+v 3.634813 4.156911 -2.428704
+v 3.634813 -4.156909 -2.428707
+v 4.038788 4.156911 -1.672921
+v 4.038788 -4.156909 -1.672924
+v 4.287554 4.156910 -0.852847
+v 4.287554 -4.156910 -0.852850
+v 4.371552 4.156910 0.000001
+v 4.371552 -4.156910 -0.000002
+v 4.287554 4.156909 0.852849
+v 4.287554 -4.156909 0.852846
+v 4.038788 4.156909 1.672921
+v 4.038788 -4.156911 1.672917
+v 3.634813 4.156909 2.428705
+v 3.634813 -4.156911 2.428701
+v 3.091154 4.156909 3.091155
+v 3.091154 -4.156911 3.091152
+v 2.428704 4.156909 3.634813
+v 2.428704 -4.156910 3.634810
+v 1.672920 4.156909 4.038789
+v 1.672920 -4.156911 4.038787
+v 0.852846 4.156909 4.287556
+v 0.852846 -4.156911 4.287553
+v -0.000001 4.156909 4.371552
+v -0.000001 -4.156910 4.371552
+v -0.852849 4.156909 4.287556
+v -0.852849 -4.156911 4.287553
+v -1.672923 4.156909 4.038788
+v -1.672923 -4.156910 4.038786
+v -2.428706 4.156909 3.634813
+v -2.428706 -4.156911 3.634810
+v -3.091157 4.156909 3.091155
+v -3.091157 -4.156911 3.091152
+v -3.634815 4.156909 2.428703
+v -3.634815 -4.156910 2.428700
+v -4.038790 4.156909 1.672920
+v -4.038790 -4.156911 1.672916
+v -4.287555 4.156909 0.852847
+v -4.287555 -4.156909 0.852844
+v -4.371554 4.156910 -0.000003
+v -4.371554 -4.156910 -0.000006
+v -4.287554 4.156909 -0.852850
+v -4.287554 -4.156909 -0.852853
+v -4.038787 4.156910 -1.672924
+v -4.038787 -4.156909 -1.672927
+v -3.634812 4.156911 -2.428707
+v -3.634812 -4.156909 -2.428710
+v -3.091153 4.156911 -3.091157
+v -3.091153 -4.156909 -3.091160
+v -2.428702 4.156911 -3.634816
+v -2.428702 -4.156909 -3.634819
+v -1.672918 4.156911 -4.038791
+v -1.672918 -4.156909 -4.038793
+v -0.852844 4.156911 -4.287556
+v -0.852844 -4.156909 -4.287558
+v 0.000000 3.446066 -4.498246
+v 0.877564 3.446066 -4.411812
+v 0.000000 -3.446063 -4.498248
+v 0.877564 -3.446063 -4.411815
+v 1.721404 3.446066 -4.155838
+v 1.721404 -3.446063 -4.155839
+v 2.499091 3.446066 -3.740155
+v 2.499091 -3.446063 -3.740156
+v 3.180739 3.446065 -3.180740
+v 3.180739 -3.446064 -3.180742
+v 3.740153 3.446065 -2.499090
+v 3.740153 -3.446064 -2.499093
+v 4.155836 3.446064 -1.721404
+v 4.155836 -3.446064 -1.721407
+v 4.411812 3.446064 -0.877564
+v 4.411812 -3.446064 -0.877567
+v 4.498245 3.446064 -0.000000
+v 4.498245 -3.446065 -0.000003
+v 4.411812 3.446064 0.877564
+v 4.411812 -3.446065 0.877561
+v 4.155836 3.446064 1.721403
+v 4.155836 -3.446065 1.721400
+v 3.740153 3.446064 2.499091
+v 3.740153 -3.446065 2.499089
+v 3.180739 3.446064 3.180738
+v 3.180739 -3.446065 3.180737
+v 2.499090 3.446063 3.740152
+v 2.499090 -3.446066 3.740150
+v 1.721403 3.446063 4.155837
+v 1.721403 -3.446066 4.155835
+v 0.877563 3.446063 4.411811
+v 0.877563 -3.446066 4.411809
+v -0.000002 3.446063 4.498244
+v -0.000002 -3.446066 4.498242
+v -0.877566 3.446063 4.411811
+v -0.877566 -3.446066 4.411809
+v -1.721406 3.446063 4.155837
+v -1.721406 -3.446066 4.155835
+v -2.499093 3.446063 3.740154
+v -2.499093 -3.446066 3.740151
+v -3.180742 3.446064 3.180738
+v -3.180742 -3.446065 3.180737
+v -3.740156 3.446064 2.499089
+v -3.740156 -3.446065 2.499088
+v -4.155839 3.446064 1.721401
+v -4.155839 -3.446065 1.721398
+v -4.411813 3.446064 0.877561
+v -4.411813 -3.446065 0.877558
+v -4.498246 3.446064 -0.000004
+v -4.498246 -3.446065 -0.000007
+v -4.411812 3.446064 -0.877568
+v -4.411812 -3.446064 -0.877571
+v -4.155835 3.446064 -1.721408
+v -4.155835 -3.446064 -1.721411
+v -3.740152 3.446065 -2.499095
+v -3.740152 -3.446064 -2.499098
+v -3.180736 3.446065 -3.180743
+v -3.180736 -3.446064 -3.180744
+v -2.499087 3.446066 -3.740158
+v -2.499087 -3.446063 -3.740160
+v -1.721399 3.446066 -4.155839
+v -1.721399 -3.446063 -4.155841
+v -0.877558 3.446066 -4.411815
+v -0.877558 -3.446063 -4.411817
+v 0.000000 2.775532 -4.530448
+v 0.883846 2.775532 -4.443397
+v 0.883846 -2.775529 -4.443398
+v 0.000000 -2.775529 -4.530450
+v 1.733727 2.775532 -4.185588
+v 1.733727 -2.775529 -4.185590
+v 2.516982 2.775532 -3.766930
+v 2.516982 -2.775529 -3.766932
+v 3.203510 2.775532 -3.203511
+v 3.203510 -2.775530 -3.203512
+v 3.766928 2.775532 -2.516982
+v 3.766928 -2.775530 -2.516984
+v 4.185587 2.775531 -1.733728
+v 4.185587 -2.775530 -1.733729
+v 4.443395 2.775531 -0.883847
+v 4.443395 -2.775530 -0.883848
+v 4.530447 2.775530 -0.000001
+v 4.530447 -2.775531 -0.000002
+v 4.443395 2.775530 0.883846
+v 4.443395 -2.775531 0.883844
+v 4.185587 2.775530 1.733725
+v 4.185587 -2.775531 1.733724
+v 3.766928 2.775530 2.516983
+v 3.766928 -2.775532 2.516980
+v 3.203510 2.775530 3.203510
+v 3.203510 -2.775532 3.203507
+v 2.516981 2.775529 3.766928
+v 2.516981 -2.775532 3.766927
+v 1.733726 2.775529 4.185588
+v 1.733726 -2.775532 4.185586
+v 0.883845 2.775529 4.443396
+v 0.883845 -2.775532 4.443394
+v -0.000002 2.775529 4.530447
+v -0.000002 -2.775532 4.530445
+v -0.883848 2.775529 4.443396
+v -0.883848 -2.775532 4.443394
+v -1.733730 2.775529 4.185586
+v -1.733730 -2.775532 4.185585
+v -2.516984 2.775529 3.766929
+v -2.516984 -2.775532 3.766927
+v -3.203512 2.775530 3.203510
+v -3.203512 -2.775532 3.203507
+v -3.766931 2.775530 2.516979
+v -3.766931 -2.775532 2.516978
+v -4.185590 2.775530 1.733724
+v -4.185590 -2.775531 1.733721
+v -4.443397 2.775530 0.883842
+v -4.443397 -2.775531 0.883841
+v -4.530448 2.775530 -0.000005
+v -4.530448 -2.775531 -0.000006
+v -4.443395 2.775531 -0.883851
+v -4.443395 -2.775530 -0.883852
+v -4.185586 2.775531 -1.733732
+v -4.185586 -2.775530 -1.733734
+v -3.766927 2.775532 -2.516987
+v -3.766927 -2.775530 -2.516989
+v -3.203506 2.775532 -3.203514
+v -3.203506 -2.775530 -3.203516
+v -2.516978 2.775532 -3.766933
+v -2.516978 -2.775529 -3.766936
+v -1.733722 2.775532 -4.185591
+v -1.733722 -2.775529 -4.185593
+v -0.883841 2.775532 -4.443398
+v -0.883841 -2.775529 -4.443400
+v -0.787850 6.030532 -3.960648
+v -1.545395 6.030532 -3.730842
+v -2.243551 6.030532 -3.357665
+v -2.855488 6.030532 -2.855454
+v -3.357692 6.030532 -2.243511
+v -3.730861 6.030532 -1.545351
+v -3.960657 6.030531 -0.787804
+v -4.038247 6.030531 0.000018
+v -3.960650 6.030531 0.787838
+v -3.730849 6.030530 1.545383
+v -3.357673 6.030530 2.243539
+v -2.855464 6.030530 2.855479
+v -2.243523 6.030530 3.357685
+v -1.545364 6.030530 3.730856
+v -0.787818 6.030530 3.960653
+v 0.000003 6.030530 4.038249
+v 0.787825 6.030530 3.960653
+v 1.545370 6.030530 3.730856
+v 2.243529 6.030530 3.357678
+v 2.855470 6.030530 2.855474
+v 3.357677 6.030530 2.243534
+v 3.730851 6.030530 1.545375
+v 3.960651 6.030531 0.787831
+v 4.038246 6.030531 0.000010
+v 3.960654 6.030531 -0.787813
+v 3.730856 6.030532 -1.545362
+v 3.357683 6.030532 -2.243524
+v 2.855477 6.030532 -2.855465
+v 2.243536 6.030532 -3.357675
+v 1.545376 6.030532 -3.730850
+v 0.000000 6.026093 0.000001
+v 0.000006 6.030532 -4.038247
+v 0.787829 6.030532 -3.960650
+v 0.000001 5.429935 4.175976
+v 0.000001 -5.429937 4.175972
+v -0.814691 5.429935 4.095737
+v -0.814691 -5.429937 4.095733
+v -1.598075 5.429935 3.858100
+v -1.598075 -5.429937 3.858096
+v -2.320046 5.429935 3.472199
+v -2.320046 -5.429937 3.472196
+v -2.952858 5.429935 2.952866
+v -2.952858 -5.429937 2.952862
+v -3.472195 5.429935 2.320053
+v -3.472195 -5.429937 2.320049
+v -3.858098 5.429935 1.598082
+v -3.858098 -5.429937 1.598079
+v -4.095735 5.429935 0.814700
+v -4.095735 -5.429937 0.814696
+v -4.175976 5.429935 0.000006
+v -4.175976 -5.429937 0.000003
+v -4.095737 5.429935 -0.814686
+v -4.095737 -5.429937 -0.814689
+v -3.858102 5.429936 -1.598070
+v -3.858102 -5.429935 -1.598073
+v -3.472203 5.429936 -2.320040
+v -3.472203 -5.429935 -2.320044
+v -2.952868 5.429936 -2.952853
+v -2.952868 -5.429935 -2.952857
+v -2.320056 5.429936 -3.472191
+v -2.320056 -5.429935 -3.472195
+v -1.598087 5.429936 -3.858094
+v -1.598087 -5.429935 -3.858098
+v -0.814704 5.429936 -4.095734
+v -0.814704 -5.429935 -4.095738
+v 0.000001 5.314117 -4.114266
+v 0.802655 5.314117 -4.035212
+v 0.000001 -5.314116 -4.114270
+v 0.802655 -5.314116 -4.035216
+v 1.574463 5.314117 -3.801086
+v 1.574463 -5.314116 -3.801090
+v 2.285766 5.314117 -3.420886
+v 2.285766 -5.314116 -3.420890
+v 2.909227 5.314117 -2.909224
+v 2.909227 -5.314116 -2.909228
+v 3.420889 5.314117 -2.285762
+v 3.420889 -5.314116 -2.285766
+v 3.801088 5.314117 -1.574460
+v 3.801088 -5.314116 -1.574463
+v 4.035212 5.314116 -0.802650
+v 4.035212 -5.314117 -0.802654
+v 4.114267 5.314116 0.000003
+v 4.114267 -5.314117 -0.000001
+v 4.035211 5.314116 0.802658
+v 4.035211 -5.314117 0.802654
+v 3.801086 5.314116 1.574463
+v 3.801086 -5.314118 1.574460
+v 3.420887 5.314116 2.285766
+v 3.420887 -5.314118 2.285762
+v 2.909225 5.314116 2.909226
+v 2.909225 -5.314118 2.909223
+v 2.285764 5.314116 3.420888
+v 2.285764 -5.314118 3.420884
+v 1.574461 5.314116 3.801088
+v 1.574461 -5.314118 3.801084
+v 0.802653 5.314116 4.035214
+v 0.802653 -5.314118 4.035210
+v 0.000000 5.314116 4.114268
+v 0.000000 -5.314118 4.114264
+v -0.802654 5.314116 4.035214
+v -0.802654 -5.314118 4.035210
+v -1.574462 5.314116 3.801086
+v -1.574462 -5.314118 3.801083
+v -2.285764 5.314116 3.420889
+v -2.285764 -5.314118 3.420886
+v -2.909226 5.314116 2.909227
+v -2.909226 -5.314118 2.909224
+v -3.420888 5.314116 2.285766
+v -3.420888 -5.314118 2.285762
+v -3.801088 5.314116 1.574463
+v -3.801088 -5.314118 1.574460
+v -4.035212 5.314116 0.802656
+v -4.035212 -5.314117 0.802652
+v -4.114268 5.314116 0.000001
+v -4.114268 -5.314117 -0.000002
+v -4.035213 5.314116 -0.802651
+v -4.035213 -5.314117 -0.802655
+v -3.801088 5.314117 -1.574461
+v -3.801088 -5.314116 -1.574464
+v -3.420890 5.314117 -2.285762
+v -3.420890 -5.314116 -2.285766
+v -2.909228 5.314117 -2.909224
+v -2.909228 -5.314116 -2.909228
+v -2.285767 5.314117 -3.420887
+v -2.285767 -5.314116 -3.420891
+v -1.574464 5.314117 -3.801085
+v -1.574464 -5.314116 -3.801089
+v -0.802656 5.314117 -4.035212
+v -0.802656 -5.314116 -4.035216
+v 0.000000 4.895285 -4.204680
+v 0.820293 4.895285 -4.123888
+v 0.000000 -4.895283 -4.204684
+v 0.820293 -4.895283 -4.123892
+v 1.609062 4.895285 -3.884618
+v 1.609062 -4.895283 -3.884621
+v 2.335995 4.895285 -3.496063
+v 2.335995 -4.895283 -3.496066
+v 2.973158 4.895285 -2.973157
+v 2.973158 -4.895283 -2.973160
+v 3.496064 4.895285 -2.335993
+v 3.496064 -4.895283 -2.335997
+v 3.884618 4.895285 -1.609061
+v 3.884618 -4.895283 -1.609064
+v 4.123888 4.895283 -0.820292
+v 4.123888 -4.895284 -0.820295
+v 4.204680 4.895283 0.000001
+v 4.204680 -4.895284 -0.000002
+v 4.123887 4.895283 0.820293
+v 4.123887 -4.895284 0.820290
+v 3.884618 4.895283 1.609062
+v 3.884618 -4.895285 1.609058
+v 3.496063 4.895283 2.335996
+v 3.496063 -4.895285 2.335993
+v 2.973157 4.895283 2.973158
+v 2.973157 -4.895285 2.973155
+v 2.335994 4.895283 3.496064
+v 2.335994 -4.895285 3.496060
+v 1.609061 4.895283 3.884620
+v 1.609061 -4.895285 3.884616
+v 0.820291 4.895283 4.123889
+v 0.820291 -4.895285 4.123885
+v -0.000001 4.895283 4.204682
+v -0.000001 -4.895285 4.204678
+v -0.820294 4.895283 4.123889
+v -0.820294 -4.895285 4.123885
+v -1.609063 4.895283 3.884617
+v -1.609063 -4.895285 3.884614
+v -2.335996 4.895283 3.496064
+v -2.335996 -4.895285 3.496060
+v -2.973159 4.895283 2.973158
+v -2.973159 -4.895285 2.973155
+v -3.496065 4.895283 2.335995
+v -3.496065 -4.895285 2.335992
+v -3.884619 4.895283 1.609061
+v -3.884619 -4.895285 1.609057
+v -4.123888 4.895283 0.820291
+v -4.123888 -4.895284 0.820288
+v -4.204681 4.895283 -0.000001
+v -4.204681 -4.895284 -0.000004
+v -4.123888 4.895283 -0.820294
+v -4.123888 -4.895284 -0.820297
+v -3.884618 4.895285 -1.609063
+v -3.884618 -4.895283 -1.609066
+v -3.496063 4.895285 -2.335997
+v -3.496063 -4.895283 -2.336000
+v -2.973157 4.895285 -2.973158
+v -2.973157 -4.895283 -2.973161
+v -2.335994 4.895285 -3.496065
+v -2.335994 -4.895283 -3.496068
+v -1.609060 4.895285 -3.884619
+v -1.609060 -4.895283 -3.884622
+v -0.820291 4.895285 -4.123888
+v -0.820291 -4.895283 -4.123892
+v 0.000000 3.563111 -4.433841
+v 0.000000 4.053377 -4.338616
+v 0.846422 4.053378 -4.255250
+v 0.864999 3.563111 -4.348646
+v 0.846422 -4.053376 -4.255252
+v 0.000000 -4.053376 -4.338618
+v 0.000000 -3.563108 -4.433843
+v 0.864999 -3.563108 -4.348648
+v 1.660317 4.053378 -4.008359
+v 1.696757 3.563111 -4.096335
+v 1.660317 -4.053376 -4.008361
+v 1.696757 -3.563108 -4.096337
+v 2.410405 4.053378 -3.607427
+v 2.463310 3.563111 -3.686604
+v 2.410405 -4.053376 -3.607430
+v 2.463310 -3.563108 -3.686605
+v 3.067865 4.053377 -3.067864
+v 3.135198 3.563111 -3.135199
+v 3.067865 -4.053376 -3.067867
+v 3.135198 -3.563108 -3.135201
+v 3.607427 4.053378 -2.410405
+v 3.686603 3.563111 -2.463310
+v 3.607427 -4.053376 -2.410408
+v 3.686603 -3.563108 -2.463311
+v 4.008358 4.053378 -1.660317
+v 4.096334 3.563110 -1.696757
+v 4.008358 -4.053376 -1.660320
+v 4.096334 -3.563109 -1.696760
+v 4.255250 4.053377 -0.846422
+v 4.348645 3.563110 -0.864999
+v 4.255250 -4.053377 -0.846425
+v 4.348645 -3.563109 -0.865002
+v 4.338616 4.053377 0.000001
+v 4.433840 3.563109 -0.000000
+v 4.338616 -4.053377 -0.000002
+v 4.433840 -3.563110 -0.000003
+v 4.255250 4.053375 0.846423
+v 4.348645 3.563109 0.864999
+v 4.255250 -4.053377 0.846420
+v 4.348645 -3.563110 0.864996
+v 4.008358 4.053376 1.660316
+v 4.096334 3.563109 1.696756
+v 4.008358 -4.053378 1.660313
+v 4.096334 -3.563110 1.696753
+v 3.607427 4.053376 2.410406
+v 3.686603 3.563108 2.463310
+v 3.607427 -4.053378 2.410403
+v 3.686603 -3.563111 2.463309
+v 3.067864 4.053376 3.067865
+v 3.135198 3.563108 3.135199
+v 3.067864 -4.053378 3.067862
+v 3.135198 -3.563111 3.135196
+v 2.410405 4.053374 3.607427
+v 2.463309 3.563108 3.686603
+v 2.410405 -4.053378 3.607424
+v 2.463309 -3.563111 3.686600
+v 1.660315 4.053376 4.008358
+v 1.696756 3.563108 4.096334
+v 1.660315 -4.053378 4.008357
+v 1.696756 -3.563111 4.096333
+v 0.846421 4.053376 4.255250
+v 0.864998 3.563108 4.348646
+v 0.846421 -4.053378 4.255249
+v 0.864998 -3.563111 4.348643
+v -0.000001 4.053374 4.338614
+v -0.000002 3.563108 4.433842
+v -0.000001 -4.053378 4.338614
+v -0.000002 -3.563111 4.433839
+v -0.846424 4.053376 4.255250
+v -0.865001 3.563108 4.348646
+v -0.846424 -4.053378 4.255249
+v -0.865001 -3.563111 4.348643
+v -1.660318 4.053374 4.008358
+v -1.696760 3.563108 4.096334
+v -1.660318 -4.053378 4.008356
+v -1.696760 -3.563111 4.096332
+v -2.410408 4.053376 3.607428
+v -2.463312 3.563108 3.686603
+v -2.410408 -4.053378 3.607425
+v -2.463312 -3.563111 3.686600
+v -3.067867 4.053376 3.067865
+v -3.135201 3.563108 3.135199
+v -3.067867 -4.053378 3.067862
+v -3.135201 -3.563111 3.135196
+v -3.607429 4.053374 2.410404
+v -3.686605 3.563108 2.463307
+v -3.607429 -4.053378 2.410401
+v -3.686605 -3.563111 2.463305
+v -4.008361 4.053376 1.660315
+v -4.096337 3.563109 1.696754
+v -4.008361 -4.053378 1.660312
+v -4.096337 -3.563110 1.696751
+v -4.255252 4.053375 0.846421
+v -4.348647 3.563109 0.864996
+v -4.255252 -4.053377 0.846417
+v -4.348647 -3.563110 0.864993
+v -4.338617 4.053377 -0.000003
+v -4.433841 3.563109 -0.000003
+v -4.338617 -4.053377 -0.000006
+v -4.433841 -3.563110 -0.000006
+v -4.255250 4.053375 -0.846425
+v -4.348644 3.563110 -0.865003
+v -4.255250 -4.053377 -0.846428
+v -4.348644 -3.563109 -0.865006
+v -4.008358 4.053377 -1.660319
+v -4.096333 3.563110 -1.696761
+v -4.008358 -4.053376 -1.660322
+v -4.096333 -3.563109 -1.696764
+v -3.607426 4.053378 -2.410409
+v -3.686602 3.563111 -2.463314
+v -3.607426 -4.053376 -2.410412
+v -3.686602 -3.563108 -2.463315
+v -3.067863 4.053378 -3.067867
+v -3.135195 3.563111 -3.135201
+v -3.067863 -4.053376 -3.067870
+v -3.135195 -3.563108 -3.135203
+v -2.410403 4.053378 -3.607430
+v -2.463306 3.563111 -3.686606
+v -2.410403 -4.053376 -3.607433
+v -2.463306 -3.563108 -3.686609
+v -1.660313 4.053378 -4.008360
+v -1.696753 3.563111 -4.096336
+v -1.660313 -4.053376 -4.008362
+v -1.696753 -3.563108 -4.096338
+v -0.846418 4.053378 -4.255251
+v -0.864994 3.563111 -4.348647
+v -0.846418 -4.053376 -4.255253
+v -0.864994 -3.563108 -4.348649
+v 0.000000 2.106952 -4.622553
+v 0.000000 2.681008 -4.510056
+v 0.879868 2.681008 -4.423396
+v 0.901815 2.106952 -4.533732
+v 0.879868 -2.681005 -4.423398
+v 0.000000 -2.681005 -4.510057
+v 0.000000 -2.106949 -4.622555
+v 0.901815 -2.106949 -4.533734
+v 1.725923 2.681008 -4.166749
+v 1.768974 2.106952 -4.270683
+v 1.725923 -2.681005 -4.166750
+v 1.768974 -2.106949 -4.270686
+v 2.505652 2.681008 -3.749974
+v 2.568153 2.106952 -3.843513
+v 2.505652 -2.681005 -3.749975
+v 2.568153 -2.106949 -3.843514
+v 3.189090 2.681007 -3.189090
+v 3.268639 2.106951 -3.268640
+v 3.189090 -2.681005 -3.189092
+v 3.268639 -2.106950 -3.268641
+v 3.749973 2.681007 -2.505652
+v 3.843512 2.106951 -2.568154
+v 3.749973 -2.681005 -2.505655
+v 3.843512 -2.106950 -2.568155
+v 4.166746 2.681007 -1.725924
+v 4.270682 2.106951 -1.768976
+v 4.166746 -2.681006 -1.725925
+v 4.270682 -2.106951 -1.768977
+v 4.423394 2.681007 -0.879869
+v 4.533732 2.106951 -0.901816
+v 4.423394 -2.681006 -0.879870
+v 4.533732 -2.106951 -0.901817
+v 4.510054 2.681006 -0.000001
+v 4.622553 2.106951 -0.000001
+v 4.510054 -2.681007 -0.000002
+v 4.622553 -2.106951 -0.000002
+v 4.423394 2.681006 0.879867
+v 4.533732 2.106950 0.901815
+v 4.423394 -2.681007 0.879866
+v 4.533732 -2.106951 0.901814
+v 4.166746 2.681006 1.725922
+v 4.270682 2.106950 1.768973
+v 4.166746 -2.681007 1.725921
+v 4.270682 -2.106951 1.768972
+v 3.749973 2.681005 2.505651
+v 3.843512 2.106950 2.568153
+v 3.749973 -2.681007 2.505650
+v 3.843512 -2.106951 2.568152
+v 3.189090 2.681005 3.189090
+v 3.268639 2.106950 3.268638
+v 3.189090 -2.681007 3.189088
+v 3.268639 -2.106951 3.268637
+v 2.505651 2.681005 3.749973
+v 2.568152 2.106949 3.843511
+v 2.505651 -2.681008 3.749970
+v 2.568152 -2.106952 3.843510
+v 1.725922 2.681005 4.166748
+v 1.768974 2.106949 4.270682
+v 1.725922 -2.681008 4.166746
+v 1.768974 -2.106952 4.270680
+v 0.879867 2.681005 4.423395
+v 0.901814 2.106949 4.533732
+v 0.879867 -2.681008 4.423392
+v 0.901814 -2.106952 4.533731
+v -0.000002 2.681005 4.510055
+v -0.000002 2.106949 4.622554
+v -0.000002 -2.681008 4.510053
+v -0.000002 -2.106952 4.622552
+v -0.879870 2.681005 4.423395
+v -0.901818 2.106949 4.533732
+v -0.879870 -2.681008 4.423392
+v -0.901818 -2.106952 4.533731
+v -1.725926 2.681005 4.166748
+v -1.768977 2.106949 4.270682
+v -1.725926 -2.681008 4.166746
+v -1.768977 -2.106952 4.270680
+v -2.505655 2.681005 3.749974
+v -2.568156 2.106949 3.843512
+v -2.505655 -2.681008 3.749972
+v -2.568156 -2.106952 3.843511
+v -3.189093 2.681005 3.189090
+v -3.268641 2.106950 3.268638
+v -3.189093 -2.681007 3.189088
+v -3.268641 -2.106951 3.268637
+v -3.749976 2.681005 2.505650
+v -3.843515 2.106950 2.568151
+v -3.749976 -2.681007 2.505647
+v -3.843515 -2.106951 2.568150
+v -4.166750 2.681006 1.725919
+v -4.270685 2.106950 1.768971
+v -4.166750 -2.681007 1.725918
+v -4.270685 -2.106951 1.768970
+v -4.423396 2.681006 0.879864
+v -4.533734 2.106950 0.901811
+v -4.423396 -2.681007 0.879863
+v -4.533734 -2.106951 0.901810
+v -4.510055 2.681006 -0.000005
+v -4.622554 2.106951 -0.000005
+v -4.510055 -2.681007 -0.000006
+v -4.622554 -2.106951 -0.000006
+v -4.423394 2.681007 -0.879873
+v -4.533732 2.106951 -0.901820
+v -4.423394 -2.681006 -0.879874
+v -4.533732 -2.106951 -0.901821
+v -4.166745 2.681007 -1.725927
+v -4.270681 2.106951 -1.768980
+v -4.166745 -2.681006 -1.725929
+v -4.270681 -2.106951 -1.768981
+v -3.749971 2.681007 -2.505656
+v -3.843510 2.106951 -2.568159
+v -3.749971 -2.681005 -2.505658
+v -3.843510 -2.106950 -2.568160
+v -3.189087 2.681007 -3.189094
+v -3.268635 2.106951 -3.268643
+v -3.189087 -2.681005 -3.189095
+v -3.268635 -2.106950 -3.268644
+v -2.505648 2.681008 -3.749978
+v -2.568149 2.106952 -3.843518
+v -2.505648 -2.681005 -3.749979
+v -2.568149 -2.106949 -3.843518
+v -1.725918 2.681008 -4.166750
+v -1.768969 2.106952 -4.270686
+v -1.725918 -2.681005 -4.166752
+v -1.768969 -2.106949 -4.270688
+v -0.879862 2.681008 -4.423398
+v -0.901809 2.106952 -4.533733
+v -0.879862 -2.681005 -4.423399
+v -0.901809 -2.106949 -4.533735
+v 0.000000 0.000001 -4.719423
+v 0.920713 0.000001 -4.628741
+v 1.806044 0.000001 -4.360179
+v 2.621970 0.000001 -3.924056
+v 3.337135 0.000001 -3.337136
+v 3.924055 0.000000 -2.621970
+v 4.360176 0.000000 -1.806046
+v 4.628739 0.000000 -0.920714
+v 4.719421 -0.000001 -0.000001
+v 4.628739 -0.000001 0.920712
+v 4.360176 -0.000001 1.806043
+v 3.924055 -0.000001 2.621971
+v 3.337135 -0.000002 3.337132
+v 2.621969 -0.000002 3.924054
+v 1.806043 -0.000002 4.360177
+v 0.920712 -0.000002 4.628739
+v -0.000002 -0.000002 4.719422
+v -0.920716 -0.000002 4.628739
+v -1.806047 -0.000002 4.360175
+v -2.621973 -0.000002 3.924055
+v -3.337137 -0.000002 3.337132
+v -3.924058 -0.000001 2.621968
+v -4.360179 -0.000001 1.806041
+v -4.628739 -0.000001 0.920708
+v -4.719422 -0.000001 -0.000005
+v -4.628738 0.000000 -0.920718
+v -4.360175 0.000000 -1.806050
+v -3.924053 0.000000 -2.621976
+v -3.337131 0.000001 -3.337139
+v -2.621966 0.000001 -3.924060
+v -1.806039 0.000001 -4.360180
+v -0.920707 0.000001 -4.628741
+v 0.000000 4.798631 -4.281936
+v 0.835364 4.798632 -4.199658
+v 0.000000 -4.798628 -4.281940
+v 0.835364 -4.798630 -4.199662
+v 1.638626 4.798632 -3.955993
+v 1.638626 -4.798630 -3.955996
+v 2.378916 4.798632 -3.560299
+v 2.378916 -4.798630 -3.560302
+v 3.027786 4.798631 -3.027785
+v 3.027786 -4.798628 -3.027788
+v 3.560299 4.798632 -2.378915
+v 3.560299 -4.798630 -2.378918
+v 3.955992 4.798632 -1.638625
+v 3.955992 -4.798630 -1.638628
+v 4.199659 4.798630 -0.835364
+v 4.199659 -4.798631 -0.835367
+v 4.281935 4.798630 0.000001
+v 4.281935 -4.798631 -0.000002
+v 4.199659 4.798629 0.835366
+v 4.199659 -4.798630 0.835362
+v 3.955992 4.798630 1.638626
+v 3.955992 -4.798632 1.638622
+v 3.560298 4.798630 2.378917
+v 3.560298 -4.798632 2.378913
+v 3.027785 4.798630 3.027787
+v 3.027785 -4.798632 3.027783
+v 2.378915 4.798628 3.560299
+v 2.378915 -4.798631 3.560296
+v 1.638625 4.798630 3.955994
+v 1.638625 -4.798632 3.955991
+v 0.835363 4.798630 4.199660
+v 0.835363 -4.798632 4.199656
+v -0.000001 4.798628 4.281937
+v -0.000001 -4.798631 4.281933
+v -0.835366 4.798630 4.199660
+v -0.835366 -4.798632 4.199656
+v -1.638627 4.798628 3.955993
+v -1.638627 -4.798631 3.955990
+v -2.378917 4.798630 3.560299
+v -2.378917 -4.798632 3.560296
+v -3.027787 4.798630 3.027787
+v -3.027787 -4.798632 3.027783
+v -3.560301 4.798628 2.378915
+v -3.560301 -4.798631 2.378912
+v -3.955994 4.798630 1.638625
+v -3.955994 -4.798632 1.638621
+v -4.199660 4.798629 0.835363
+v -4.199660 -4.798630 0.835360
+v -4.281936 4.798630 -0.000002
+v -4.281936 -4.798631 -0.000005
+v -4.199659 4.798629 -0.835367
+v -4.199659 -4.798630 -0.835370
+v -3.955992 4.798631 -1.638628
+v -3.955992 -4.798628 -1.638631
+v -3.560298 4.798632 -2.378918
+v -3.560298 -4.798630 -2.378921
+v -3.027784 4.798632 -3.027787
+v -3.027784 -4.798630 -3.027790
+v -2.378914 4.798632 -3.560301
+v -2.378914 -4.798630 -3.560304
+v -1.638623 4.798632 -3.955994
+v -1.638623 -4.798630 -3.955997
+v -0.835361 4.798632 -4.199659
+v -0.835361 -4.798630 -4.199663
+v 0.000000 4.156910 -4.371553
+v 0.852848 4.156911 -4.287555
+v 0.852848 -4.156909 -4.287557
+v 0.000000 -4.156909 -4.371555
+v 1.672921 4.156911 -4.038788
+v 1.672921 -4.156909 -4.038791
+v 2.428705 4.156911 -3.634813
+v 2.428705 -4.156909 -3.634816
+v 3.091155 4.156910 -3.091154
+v 3.091155 -4.156909 -3.091157
+v 3.634813 4.156911 -2.428704
+v 3.634813 -4.156909 -2.428707
+v 4.038788 4.156911 -1.672921
+v 4.038788 -4.156909 -1.672924
+v 4.287554 4.156910 -0.852847
+v 4.287554 -4.156910 -0.852850
+v 4.371552 4.156910 0.000001
+v 4.371552 -4.156910 -0.000002
+v 4.287554 4.156909 0.852849
+v 4.287554 -4.156909 0.852846
+v 4.038788 4.156909 1.672921
+v 4.038788 -4.156911 1.672917
+v 3.634813 4.156909 2.428705
+v 3.634813 -4.156911 2.428701
+v 3.091154 4.156909 3.091155
+v 3.091154 -4.156911 3.091152
+v 2.428704 4.156909 3.634813
+v 2.428704 -4.156910 3.634810
+v 1.672920 4.156909 4.038789
+v 1.672920 -4.156911 4.038787
+v 0.852846 4.156909 4.287556
+v 0.852846 -4.156911 4.287553
+v -0.000001 4.156909 4.371552
+v -0.000001 -4.156910 4.371552
+v -0.852849 4.156909 4.287556
+v -0.852849 -4.156911 4.287553
+v -1.672923 4.156909 4.038788
+v -1.672923 -4.156910 4.038786
+v -2.428706 4.156909 3.634813
+v -2.428706 -4.156911 3.634810
+v -3.091157 4.156909 3.091155
+v -3.091157 -4.156911 3.091152
+v -3.634815 4.156909 2.428703
+v -3.634815 -4.156910 2.428700
+v -4.038790 4.156909 1.672920
+v -4.038790 -4.156911 1.672916
+v -4.287555 4.156909 0.852847
+v -4.287555 -4.156909 0.852844
+v -4.371554 4.156910 -0.000003
+v -4.371554 -4.156910 -0.000006
+v -4.287554 4.156909 -0.852850
+v -4.287554 -4.156909 -0.852853
+v -4.038787 4.156910 -1.672924
+v -4.038787 -4.156909 -1.672927
+v -3.634812 4.156911 -2.428707
+v -3.634812 -4.156909 -2.428710
+v -3.091153 4.156911 -3.091157
+v -3.091153 -4.156909 -3.091160
+v -2.428702 4.156911 -3.634816
+v -2.428702 -4.156909 -3.634819
+v -1.672918 4.156911 -4.038791
+v -1.672918 -4.156909 -4.038793
+v -0.852844 4.156911 -4.287556
+v -0.852844 -4.156909 -4.287558
+v 0.000000 3.446066 -4.498246
+v 0.877564 3.446066 -4.411812
+v 0.000000 -3.446063 -4.498248
+v 0.877564 -3.446063 -4.411815
+v 1.721404 3.446066 -4.155838
+v 1.721404 -3.446063 -4.155839
+v 2.499091 3.446066 -3.740155
+v 2.499091 -3.446063 -3.740156
+v 3.180739 3.446065 -3.180740
+v 3.180739 -3.446064 -3.180742
+v 3.740153 3.446065 -2.499090
+v 3.740153 -3.446064 -2.499093
+v 4.155836 3.446064 -1.721404
+v 4.155836 -3.446064 -1.721407
+v 4.411812 3.446064 -0.877564
+v 4.411812 -3.446064 -0.877567
+v 4.498245 3.446064 -0.000000
+v 4.498245 -3.446065 -0.000003
+v 4.411812 3.446064 0.877564
+v 4.411812 -3.446065 0.877561
+v 4.155836 3.446064 1.721403
+v 4.155836 -3.446065 1.721400
+v 3.740153 3.446064 2.499091
+v 3.740153 -3.446065 2.499089
+v 3.180739 3.446064 3.180738
+v 3.180739 -3.446065 3.180737
+v 2.499090 3.446063 3.740152
+v 2.499090 -3.446066 3.740150
+v 1.721403 3.446063 4.155837
+v 1.721403 -3.446066 4.155835
+v 0.877563 3.446063 4.411811
+v 0.877563 -3.446066 4.411809
+v -0.000002 3.446063 4.498244
+v -0.000002 -3.446066 4.498242
+v -0.877566 3.446063 4.411811
+v -0.877566 -3.446066 4.411809
+v -1.721406 3.446063 4.155837
+v -1.721406 -3.446066 4.155835
+v -2.499093 3.446063 3.740154
+v -2.499093 -3.446066 3.740151
+v -3.180742 3.446064 3.180738
+v -3.180742 -3.446065 3.180737
+v -3.740156 3.446064 2.499089
+v -3.740156 -3.446065 2.499088
+v -4.155839 3.446064 1.721401
+v -4.155839 -3.446065 1.721398
+v -4.411813 3.446064 0.877561
+v -4.411813 -3.446065 0.877558
+v -4.498246 3.446064 -0.000004
+v -4.498246 -3.446065 -0.000007
+v -4.411812 3.446064 -0.877568
+v -4.411812 -3.446064 -0.877571
+v -4.155835 3.446064 -1.721408
+v -4.155835 -3.446064 -1.721411
+v -3.740152 3.446065 -2.499095
+v -3.740152 -3.446064 -2.499098
+v -3.180736 3.446065 -3.180743
+v -3.180736 -3.446064 -3.180744
+v -2.499087 3.446066 -3.740158
+v -2.499087 -3.446063 -3.740160
+v -1.721399 3.446066 -4.155839
+v -1.721399 -3.446063 -4.155841
+v -0.877558 3.446066 -4.411815
+v -0.877558 -3.446063 -4.411817
+v 0.000000 2.775532 -4.530448
+v 0.883846 2.775532 -4.443397
+v 0.883846 -2.775529 -4.443398
+v 0.000000 -2.775529 -4.530450
+v 1.733727 2.775532 -4.185588
+v 1.733727 -2.775529 -4.185590
+v 2.516982 2.775532 -3.766930
+v 2.516982 -2.775529 -3.766932
+v 3.203510 2.775532 -3.203511
+v 3.203510 -2.775530 -3.203512
+v 3.766928 2.775532 -2.516982
+v 3.766928 -2.775530 -2.516984
+v 4.185587 2.775531 -1.733728
+v 4.185587 -2.775530 -1.733729
+v 4.443395 2.775531 -0.883847
+v 4.443395 -2.775530 -0.883848
+v 4.530447 2.775530 -0.000001
+v 4.530447 -2.775531 -0.000002
+v 4.443395 2.775530 0.883846
+v 4.443395 -2.775531 0.883844
+v 4.185587 2.775530 1.733725
+v 4.185587 -2.775531 1.733724
+v 3.766928 2.775530 2.516983
+v 3.766928 -2.775532 2.516980
+v 3.203510 2.775530 3.203510
+v 3.203510 -2.775532 3.203507
+v 2.516981 2.775529 3.766928
+v 2.516981 -2.775532 3.766927
+v 1.733726 2.775529 4.185588
+v 1.733726 -2.775532 4.185586
+v 0.883845 2.775529 4.443396
+v 0.883845 -2.775532 4.443394
+v -0.000002 2.775529 4.530447
+v -0.000002 -2.775532 4.530445
+v -0.883848 2.775529 4.443396
+v -0.883848 -2.775532 4.443394
+v -1.733730 2.775529 4.185586
+v -1.733730 -2.775532 4.185585
+v -2.516984 2.775529 3.766929
+v -2.516984 -2.775532 3.766927
+v -3.203512 2.775530 3.203510
+v -3.203512 -2.775532 3.203507
+v -3.766931 2.775530 2.516979
+v -3.766931 -2.775532 2.516978
+v -4.185590 2.775530 1.733724
+v -4.185590 -2.775531 1.733721
+v -4.443397 2.775530 0.883842
+v -4.443397 -2.775531 0.883841
+v -4.530448 2.775530 -0.000005
+v -4.530448 -2.775531 -0.000006
+v -4.443395 2.775531 -0.883851
+v -4.443395 -2.775530 -0.883852
+v -4.185586 2.775531 -1.733732
+v -4.185586 -2.775530 -1.733734
+v -3.766927 2.775532 -2.516987
+v -3.766927 -2.775530 -2.516989
+v -3.203506 2.775532 -3.203514
+v -3.203506 -2.775530 -3.203516
+v -2.516978 2.775532 -3.766933
+v -2.516978 -2.775529 -3.766936
+v -1.733722 2.775532 -4.185591
+v -1.733722 -2.775529 -4.185593
+v -0.883841 2.775532 -4.443398
+v -0.883841 -2.775529 -4.443400
+vt 0.310819 0.890729
+vt 0.294243 0.911489
+vt 0.196123 0.808752
+vt 0.324309 0.867353
+vt 0.334402 0.841759
+vt 0.341594 0.814481
+vt 0.347246 0.785867
+vt 0.352959 0.756129
+vt 0.305065 0.703331
+vt 0.332135 0.715368
+vt 0.279620 0.690441
+vt 0.253993 0.679141
+vt 0.227614 0.671168
+vt 0.200680 0.667600
+vt 0.173817 0.668906
+vt 0.147813 0.675164
+vt 0.123506 0.686193
+vt 0.101690 0.701585
+vt 0.083132 0.720825
+vt 0.068570 0.743292
+vt 0.058848 0.768243
+vt 0.054898 0.794803
+vt 0.053571 0.821629
+vt 0.058234 0.848017
+vt 0.068092 0.872915
+vt 0.082487 0.895453
+vt 0.100766 0.914888
+vt 0.122276 0.930566
+vt 0.146260 0.941969
+vt 0.171881 0.948705
+vt 0.198268 0.950549
+vt 0.224511 0.947451
+vt 0.249717 0.939583
+vt 0.273129 0.927361
+vt 0.827298 0.658847
+vt 0.852437 0.682572
+vt 0.803930 0.683920
+vt 0.560095 0.842512
+vt 0.543284 0.850884
+vt 0.547844 0.818346
+vt 0.877532 0.706176
+vt 0.829114 0.707800
+vt 0.571672 0.867024
+vt 0.554656 0.874978
+vt 0.902799 0.729458
+vt 0.854355 0.731550
+vt 0.582544 0.891884
+vt 0.565382 0.899448
+vt 0.928374 0.752189
+vt 0.879925 0.754700
+vt 0.592932 0.916972
+vt 0.575573 0.924266
+vt 0.954934 0.774259
+vt 0.906154 0.776625
+vt 0.602607 0.942366
+vt 0.585092 0.949639
+vt 0.983820 0.793171
+vt 0.934760 0.795576
+vt 0.613526 0.967584
+vt 0.591890 0.975160
+vt 0.206566 0.005952
+vt 0.226105 0.036027
+vt 0.183705 0.025091
+vt 0.066880 0.370900
+vt 0.059215 0.388153
+vt 0.043231 0.358515
+vt 0.248183 0.063215
+vt 0.203224 0.055748
+vt 0.091403 0.382209
+vt 0.083303 0.399040
+vt 0.270868 0.089535
+vt 0.223262 0.084944
+vt 0.115594 0.393827
+vt 0.107163 0.410449
+vt 0.294169 0.115573
+vt 0.245008 0.112285
+vt 0.139526 0.406044
+vt 0.130704 0.422478
+vt 0.317869 0.141353
+vt 0.268039 0.138639
+vt 0.163046 0.419069
+vt 0.153821 0.435233
+vt 0.341615 0.167052
+vt 0.291800 0.164426
+vt 0.186199 0.432695
+vt 0.176552 0.448579
+vt 0.365404 0.192608
+vt 0.339601 0.215758
+vt 0.208898 0.446992
+vt 0.198842 0.462559
+vt 0.389051 0.218282
+vt 0.231248 0.461777
+vt 0.220744 0.477040
+vt 0.412776 0.243759
+vt 0.363409 0.241401
+vt 0.253088 0.477204
+vt 0.242194 0.492120
+vt 0.436367 0.269065
+vt 0.387262 0.266909
+vt 0.274446 0.493144
+vt 0.263158 0.507784
+vt 0.460089 0.293997
+vt 0.435017 0.317441
+vt 0.295238 0.509666
+vt 0.283655 0.523960
+vt 0.483922 0.318842
+vt 0.459075 0.342422
+vt 0.315632 0.526674
+vt 0.303709 0.540664
+vt 0.507990 0.343428
+vt 0.483239 0.367260
+vt 0.335580 0.544230
+vt 0.323233 0.557930
+vt 0.531987 0.368066
+vt 0.507555 0.391958
+vt 0.355038 0.562359
+vt 0.342363 0.575650
+vt 0.556122 0.392726
+vt 0.531777 0.416732
+vt 0.374097 0.580913
+vt 0.361048 0.593908
+vt 0.580290 0.417364
+vt 0.556040 0.441428
+vt 0.392630 0.599990
+vt 0.379254 0.612668
+vt 0.604730 0.441636
+vt 0.580570 0.465851
+vt 0.410526 0.619682
+vt 0.396810 0.632064
+vt 0.629245 0.465840
+vt 0.605209 0.490188
+vt 0.427940 0.639875
+vt 0.413924 0.651898
+vt 0.653937 0.490043
+vt 0.445007 0.660479
+vt 0.430583 0.672174
+vt 0.678760 0.514281
+vt 0.654773 0.538716
+vt 0.461355 0.681719
+vt 0.446653 0.693013
+vt 0.703521 0.538626
+vt 0.679508 0.563095
+vt 0.477303 0.703387
+vt 0.462216 0.714299
+vt 0.728189 0.563036
+vt 0.704214 0.587473
+vt 0.492624 0.725563
+vt 0.477184 0.736068
+vt 0.752866 0.587156
+vt 0.728955 0.611793
+vt 0.507350 0.748182
+vt 0.491570 0.758269
+vt 0.777444 0.611190
+vt 0.753825 0.635920
+vt 0.521490 0.771144
+vt 0.505475 0.780804
+vt 0.802363 0.634944
+vt 0.778838 0.659938
+vt 0.534963 0.794548
+vt 0.518623 0.803814
+vt 0.531294 0.827139
+vt 0.977298 0.154557
+vt 0.966929 0.158429
+vt 0.963016 0.123857
+vt 0.292457 0.956907
+vt 0.317677 0.937052
+vt 0.298751 0.966242
+vt 0.953207 0.129408
+vt 0.943177 0.095685
+vt 0.263875 0.972230
+vt 0.268426 0.982598
+vt 0.934463 0.102936
+vt 0.918271 0.071366
+vt 0.232719 0.982183
+vt 0.235285 0.993246
+vt 0.911028 0.080110
+vt 0.889118 0.051953
+vt 0.200053 0.986246
+vt 0.200532 0.997608
+vt 0.883617 0.061901
+vt 0.856740 0.038235
+vt 0.167078 0.984168
+vt 0.165436 0.995435
+vt 0.853181 0.049048
+vt 0.822285 0.030746
+vt 0.134973 0.975979
+vt 0.131261 0.986760
+vt 0.820793 0.042048
+vt 0.786964 0.029776
+vt 0.104864 0.961946
+vt 0.099218 0.971864
+vt 0.787589 0.041170
+vt 0.751998 0.035378
+vt 0.077826 0.942526
+vt 0.070428 0.951246
+vt 0.754724 0.046482
+vt 0.718579 0.047381
+vt 0.054770 0.918364
+vt 0.045879 0.925591
+vt 0.723312 0.057805
+vt 0.687828 0.065426
+vt 0.036508 0.890238
+vt 0.026413 0.895719
+vt 0.694416 0.074821
+vt 0.660766 0.089014
+vt 0.023708 0.859005
+vt 0.012723 0.862533
+vt 0.669020 0.097068
+vt 0.638338 0.117587
+vt 0.016940 0.825564
+vt 0.005404 0.826953
+vt 0.648039 0.123978
+vt 0.621516 0.150623
+vt 0.017101 0.791068
+vt 0.005093 0.789881
+vt 0.632793 0.154916
+vt 0.612084 0.186475
+vt 0.023699 0.757213
+vt 0.012652 0.753589
+vt 0.623588 0.188155
+vt 0.621338 0.222194
+vt 0.036873 0.725750
+vt 0.609807 0.222724
+vt 0.625502 0.255693
+vt 0.055541 0.697626
+vt 0.026792 0.720133
+vt 0.614306 0.258331
+vt 0.625244 0.292246
+vt 0.078954 0.673646
+vt 0.071634 0.664807
+vt 0.635753 0.287600
+vt 0.642179 0.323411
+vt 0.106278 0.654512
+vt 0.100698 0.644474
+vt 0.651662 0.316913
+vt 0.664494 0.350812
+vt 0.136563 0.640826
+vt 0.132897 0.629911
+vt 0.672656 0.342678
+vt 0.691375 0.373543
+vt 0.168730 0.633010
+vt 0.167098 0.621567
+vt 0.697948 0.364036
+vt 0.721816 0.390875
+vt 0.201641 0.631250
+vt 0.202075 0.619642
+vt 0.726613 0.380297
+vt 0.754659 0.402347
+vt 0.234151 0.635426
+vt 0.236587 0.624033
+vt 0.757566 0.391069
+vt 0.788666 0.407872
+vt 0.265283 0.645060
+vt 0.269486 0.634266
+vt 0.789725 0.396336
+vt 0.822684 0.407872
+vt 0.294487 0.659276
+vt 0.299930 0.649449
+vt 0.822200 0.396662
+vt 0.855921 0.403486
+vt 0.322120 0.676641
+vt 0.327717 0.668208
+vt 0.854675 0.393450
+vt 0.888710 0.397003
+vt 0.350805 0.693404
+vt 0.354167 0.688644
+vt 0.949772 0.354440
+vt 0.943960 0.351823
+vt 0.965830 0.322241
+vt 0.379271 0.789170
+vt 0.383438 0.753738
+vt 0.389806 0.789971
+vt 0.956035 0.318253
+vt 0.978784 0.289626
+vt 0.375591 0.822771
+vt 0.386843 0.824938
+vt 0.967746 0.286540
+vt 0.987001 0.255825
+vt 0.368111 0.855004
+vt 0.379111 0.858853
+vt 0.975439 0.254358
+vt 0.989629 0.221322
+vt 0.355886 0.885348
+vt 0.366064 0.890901
+vt 0.978035 0.221748
+vt 0.986322 0.187150
+vt 0.338899 0.912941
+vt 0.347853 0.920004
+vt 0.975156 0.189474
+vt 0.325233 0.945143
+vt 0.850291 0.540086
+vt 0.873302 0.552185
+vt 0.841159 0.556793
+vt 0.518911 0.862823
+vt 0.502178 0.870973
+vt 0.507262 0.839745
+vt 0.896641 0.563588
+vt 0.864639 0.569141
+vt 0.529972 0.886258
+vt 0.513018 0.893927
+vt 0.920340 0.574274
+vt 0.888520 0.580814
+vt 0.540419 0.910054
+vt 0.523239 0.917190
+vt 0.944409 0.584213
+vt 0.912797 0.591743
+vt 0.550231 0.934202
+vt 0.532793 0.940769
+vt 0.968921 0.593182
+vt 0.937480 0.601928
+vt 0.559251 0.958816
+vt 0.541411 0.964770
+vt 0.994380 0.599575
+vt 0.987321 0.621026
+vt 0.568553 0.982886
+vt 0.547518 0.989675
+vt 0.448462 0.016416
+vt 0.453523 0.043011
+vt 0.426102 0.022413
+vt 0.047989 0.412890
+vt 0.041065 0.430030
+vt 0.016710 0.422115
+vt 0.461225 0.068562
+vt 0.434617 0.048156
+vt 0.071833 0.423399
+vt 0.064204 0.440211
+vt 0.469690 0.093810
+vt 0.451385 0.100367
+vt 0.095124 0.434524
+vt 0.087002 0.451021
+vt 0.479081 0.118656
+vt 0.118028 0.446236
+vt 0.109377 0.462572
+vt 0.489103 0.143205
+vt 0.460924 0.125846
+vt 0.140507 0.458622
+vt 0.131446 0.474645
+vt 0.500007 0.167373
+vt 0.471281 0.150928
+vt 0.162614 0.471582
+vt 0.153132 0.487372
+vt 0.511606 0.191068
+vt 0.482439 0.175619
+vt 0.184340 0.485056
+vt 0.174417 0.500612
+vt 0.523812 0.214348
+vt 0.506948 0.223622
+vt 0.205621 0.499168
+vt 0.195343 0.514354
+vt 0.536823 0.237126
+vt 0.226506 0.513800
+vt 0.215805 0.528715
+vt 0.550358 0.259495
+vt 0.534172 0.269743
+vt 0.246952 0.528941
+vt 0.235904 0.543495
+vt 0.564699 0.281287
+vt 0.548886 0.291959
+vt 0.266898 0.544666
+vt 0.255494 0.558901
+vt 0.579625 0.302563
+vt 0.564174 0.313740
+vt 0.286440 0.560864
+vt 0.274614 0.574771
+vt 0.595062 0.323404
+vt 0.305493 0.577596
+vt 0.293346 0.591063
+vt 0.611298 0.343577
+vt 0.596644 0.355678
+vt 0.324068 0.594848
+vt 0.311460 0.608016
+vt 0.628118 0.363298
+vt 0.342130 0.612659
+vt 0.329151 0.625451
+vt 0.645705 0.382380
+vt 0.613881 0.375847
+vt 0.359734 0.630992
+vt 0.346319 0.643500
+vt 0.663772 0.401054
+vt 0.631800 0.395479
+vt 0.376850 0.649826
+vt 0.363153 0.661950
+vt 0.682489 0.419050
+vt 0.669467 0.432934
+vt 0.393493 0.669123
+vt 0.379453 0.680917
+vt 0.701729 0.436379
+vt 0.689164 0.450703
+vt 0.409640 0.688894
+vt 0.395187 0.700314
+vt 0.721448 0.453144
+vt 0.425221 0.709168
+vt 0.410448 0.720157
+vt 0.741711 0.469287
+vt 0.709403 0.467842
+vt 0.440294 0.729888
+vt 0.425198 0.740471
+vt 0.762485 0.484814
+vt 0.730144 0.484364
+vt 0.454800 0.751053
+vt 0.439419 0.761239
+vt 0.783824 0.499551
+vt 0.773159 0.515394
+vt 0.468741 0.772671
+vt 0.453004 0.782472
+vt 0.805546 0.513718
+vt 0.795428 0.529866
+vt 0.482162 0.794653
+vt 0.466143 0.804034
+vt 0.827708 0.527228
+vt 0.818103 0.543682
+vt 0.494986 0.817035
+vt 0.478719 0.825992
+vt 0.490767 0.848308
+vt 0.776542 0.713123
+vt 0.802035 0.737219
+vt 0.726484 0.766467
+vt 0.752362 0.790775
+vt 0.700776 0.843168
+vt 0.827882 0.761212
+vt 0.778597 0.815061
+vt 0.726398 0.867297
+vt 0.854406 0.784907
+vt 0.805208 0.839178
+vt 0.752193 0.891454
+vt 0.882354 0.806881
+vt 0.832596 0.863142
+vt 0.777582 0.915809
+vt 0.912487 0.825829
+vt 0.859459 0.885507
+vt 0.802168 0.941079
+vt 0.945802 0.837986
+vt 0.885555 0.905111
+vt 0.822384 0.969418
+vt 0.160524 0.044392
+vt 0.173681 0.078610
+vt 0.091566 0.105128
+vt 0.111404 0.131935
+vt 0.054687 0.190659
+vt 0.191746 0.109013
+vt 0.134786 0.160092
+vt 0.079897 0.215199
+vt 0.214027 0.137785
+vt 0.158255 0.187513
+vt 0.104518 0.241287
+vt 0.237580 0.165014
+vt 0.182309 0.214626
+vt 0.128916 0.267536
+vt 0.261551 0.191461
+vt 0.206598 0.241325
+vt 0.153252 0.293736
+vt 0.285616 0.217479
+vt 0.230939 0.267658
+vt 0.177698 0.319762
+vt 0.309680 0.243275
+vt 0.255354 0.293678
+vt 0.202133 0.345655
+vt 0.333732 0.268902
+vt 0.279697 0.319478
+vt 0.226672 0.371348
+vt 0.357773 0.294425
+vt 0.304073 0.345087
+vt 0.251254 0.396894
+vt 0.381838 0.319825
+vt 0.328474 0.370564
+vt 0.275843 0.422311
+vt 0.405979 0.345090
+vt 0.352914 0.395923
+vt 0.300441 0.447605
+vt 0.430226 0.370194
+vt 0.377401 0.421157
+vt 0.325044 0.472794
+vt 0.454548 0.395141
+vt 0.401917 0.446286
+vt 0.349604 0.497936
+vt 0.478855 0.420062
+vt 0.426474 0.471328
+vt 0.374270 0.522941
+vt 0.503290 0.444843
+vt 0.451065 0.496303
+vt 0.398902 0.547962
+vt 0.527785 0.469512
+vt 0.475711 0.521214
+vt 0.423580 0.572893
+vt 0.552315 0.494155
+vt 0.500407 0.546021
+vt 0.448294 0.597819
+vt 0.576994 0.518692
+vt 0.525152 0.570767
+vt 0.473052 0.622781
+vt 0.601744 0.543122
+vt 0.549976 0.595402
+vt 0.497921 0.647728
+vt 0.626501 0.567520
+vt 0.574857 0.619996
+vt 0.523026 0.672466
+vt 0.651337 0.591851
+vt 0.599837 0.644526
+vt 0.548178 0.697166
+vt 0.676170 0.616212
+vt 0.624899 0.668984
+vt 0.573479 0.721702
+vt 0.701102 0.640516
+vt 0.650079 0.693401
+vt 0.598776 0.746169
+vt 0.726074 0.664817
+vt 0.675373 0.717783
+vt 0.624201 0.770499
+vt 0.751241 0.688990
+vt 0.700838 0.742133
+vt 0.649636 0.794826
+vt 0.675171 0.819032
+vt 0.797607 0.690587
+vt 0.822827 0.714505
+vt 0.679128 0.865525
+vt 0.848163 0.738297
+vt 0.704522 0.889584
+vt 0.873881 0.761733
+vt 0.729828 0.913648
+vt 0.901036 0.783605
+vt 0.754991 0.937769
+vt 0.930297 0.802475
+vt 0.779907 0.962034
+vt 0.961832 0.818924
+vt 0.804336 0.986690
+vt 0.180227 0.028130
+vt 0.196613 0.060238
+vt 0.032679 0.212538
+vt 0.025442 0.169024
+vt 0.215969 0.090395
+vt 0.057312 0.238141
+vt 0.237890 0.118141
+vt 0.081866 0.263832
+vt 0.261131 0.144725
+vt 0.106162 0.289680
+vt 0.284904 0.170721
+vt 0.130498 0.315660
+vt 0.308851 0.196427
+vt 0.154967 0.341744
+vt 0.332738 0.222099
+vt 0.179685 0.367606
+vt 0.356625 0.247713
+vt 0.204374 0.393273
+vt 0.380501 0.273213
+vt 0.229051 0.418792
+vt 0.404388 0.298600
+vt 0.253721 0.444179
+vt 0.428365 0.323782
+vt 0.278384 0.469441
+vt 0.452462 0.348792
+vt 0.303031 0.494583
+vt 0.476649 0.373677
+vt 0.327625 0.519607
+vt 0.500972 0.398409
+vt 0.352181 0.544788
+vt 0.525245 0.423161
+vt 0.376983 0.569764
+vt 0.549576 0.447849
+vt 0.401676 0.594573
+vt 0.574102 0.472349
+vt 0.426253 0.619507
+vt 0.598736 0.496753
+vt 0.450990 0.644539
+vt 0.623512 0.521045
+vt 0.475914 0.669613
+vt 0.648319 0.545304
+vt 0.501087 0.694703
+vt 0.673050 0.569664
+vt 0.526554 0.719466
+vt 0.697770 0.594039
+vt 0.551960 0.744006
+vt 0.722546 0.618376
+vt 0.577297 0.768389
+vt 0.747496 0.642489
+vt 0.602599 0.792923
+vt 0.772489 0.666579
+vt 0.628163 0.817246
+vt 0.653671 0.841426
+vt 0.838480 0.561690
+vt 0.862100 0.574144
+vt 0.830878 0.575592
+vt 0.537718 0.853613
+vt 0.523834 0.860416
+vt 0.525780 0.830034
+vt 0.886135 0.585889
+vt 0.854939 0.588272
+vt 0.549021 0.877562
+vt 0.534961 0.883987
+vt 0.910573 0.596893
+vt 0.879399 0.600219
+vt 0.559683 0.901878
+vt 0.545467 0.907921
+vt 0.935416 0.607144
+vt 0.904230 0.611407
+vt 0.569809 0.926537
+vt 0.555359 0.932223
+vt 0.960740 0.616663
+vt 0.929409 0.621825
+vt 0.579117 0.951515
+vt 0.564470 0.956984
+vt 0.985964 0.624519
+vt 0.954911 0.631499
+vt 0.587713 0.976394
+vt 0.571982 0.981577
+vt 0.422546 0.023557
+vt 0.429142 0.049984
+vt 0.405693 0.028096
+vt 0.056651 0.393799
+vt 0.050336 0.407976
+vt 0.032638 0.383295
+vt 0.437155 0.076293
+vt 0.413417 0.054930
+vt 0.080692 0.404597
+vt 0.074107 0.418482
+vt 0.445975 0.102305
+vt 0.421746 0.081520
+vt 0.104418 0.415955
+vt 0.097534 0.429653
+vt 0.455593 0.127947
+vt 0.430740 0.107885
+vt 0.127807 0.427919
+vt 0.120574 0.441438
+vt 0.466011 0.153208
+vt 0.440571 0.133956
+vt 0.150783 0.440570
+vt 0.143188 0.453891
+vt 0.477229 0.178081
+vt 0.462708 0.185081
+vt 0.173372 0.453824
+vt 0.165436 0.466902
+vt 0.489292 0.202448
+vt 0.195533 0.467688
+vt 0.187247 0.480533
+vt 0.501970 0.226367
+vt 0.475061 0.209898
+vt 0.217286 0.482104
+vt 0.208668 0.494696
+vt 0.515352 0.249829
+vt 0.487980 0.234207
+vt 0.238613 0.497054
+vt 0.229683 0.509397
+vt 0.529436 0.272766
+vt 0.501683 0.258092
+vt 0.259443 0.512618
+vt 0.250204 0.524683
+vt 0.544213 0.295156
+vt 0.531199 0.304252
+vt 0.279844 0.528665
+vt 0.270298 0.540458
+vt 0.559653 0.317041
+vt 0.546980 0.326478
+vt 0.299749 0.545277
+vt 0.289926 0.556787
+vt 0.575718 0.338369
+vt 0.563293 0.348089
+vt 0.319182 0.562415
+vt 0.309059 0.573645
+vt 0.592339 0.359224
+vt 0.338183 0.580045
+vt 0.327769 0.590974
+vt 0.609670 0.379556
+vt 0.597750 0.389956
+vt 0.356739 0.598199
+vt 0.345956 0.608876
+vt 0.627685 0.399347
+vt 0.616107 0.410151
+vt 0.374801 0.616856
+vt 0.363700 0.627285
+vt 0.646368 0.418529
+vt 0.392258 0.636104
+vt 0.380895 0.646248
+vt 0.665644 0.437035
+vt 0.635161 0.429753
+vt 0.409259 0.655827
+vt 0.397627 0.665652
+vt 0.685482 0.454912
+vt 0.654854 0.448587
+vt 0.425802 0.675995
+vt 0.413879 0.685531
+vt 0.705851 0.472166
+vt 0.695794 0.484336
+vt 0.441759 0.696698
+vt 0.429561 0.705921
+vt 0.726724 0.488794
+vt 0.717030 0.501263
+vt 0.457209 0.717856
+vt 0.444729 0.726756
+vt 0.748103 0.504755
+vt 0.738770 0.517536
+vt 0.472050 0.739505
+vt 0.459301 0.748053
+vt 0.770003 0.520080
+vt 0.761128 0.533177
+vt 0.486380 0.761556
+vt 0.473386 0.769754
+vt 0.792447 0.534615
+vt 0.784013 0.548027
+vt 0.500160 0.783972
+vt 0.486870 0.791871
+vt 0.815257 0.548517
+vt 0.513226 0.806826
+vt 0.499766 0.814374
+vt 0.512091 0.837222
+vt 0.485463 0.851068
+vt 0.830795 0.521981
+vt 0.853233 0.534712
+vt 0.473525 0.828863
+vt 0.808790 0.508574
+vt 0.461038 0.807037
+vt 0.787212 0.494505
+vt 0.447991 0.785590
+vt 0.434489 0.764497
+vt 0.766033 0.479870
+vt 0.745416 0.464479
+vt 0.420379 0.743862
+vt 0.725305 0.448457
+vt 0.405733 0.723674
+vt 0.390584 0.703945
+vt 0.705722 0.431819
+vt 0.374975 0.684659
+vt 0.686625 0.414627
+vt 0.358747 0.665850
+vt 0.668095 0.396718
+vt 0.342040 0.647478
+vt 0.650126 0.378201
+vt 0.324988 0.629532
+vt 0.632665 0.359261
+vt 0.307451 0.612185
+vt 0.615945 0.339730
+vt 0.289458 0.595377
+vt 0.599861 0.319706
+vt 0.270851 0.579203
+vt 0.584552 0.299021
+vt 0.251839 0.563438
+vt 0.569749 0.277874
+vt 0.232370 0.548154
+vt 0.555547 0.256230
+vt 0.542110 0.234026
+vt 0.212399 0.533466
+vt 0.192052 0.519212
+vt 0.529220 0.211397
+vt 0.171257 0.505566
+vt 0.517113 0.188279
+vt 0.505621 0.164740
+vt 0.150093 0.492410
+vt 0.494819 0.140754
+vt 0.128542 0.479775
+vt 0.484866 0.116386
+vt 0.106615 0.467773
+vt 0.475565 0.091718
+vt 0.084388 0.456305
+vt 0.467156 0.066674
+vt 0.061766 0.445556
+vt 0.459500 0.041305
+vt 0.038778 0.435435
+vt 0.452668 0.015570
+vt 0.543661 0.990672
+vt 0.970736 0.587412
+vt 0.995421 0.595640
+vt 0.535753 0.966510
+vt 0.946600 0.578540
+vt 0.527218 0.942865
+vt 0.922748 0.568687
+vt 0.517751 0.919485
+vt 0.899225 0.558079
+vt 0.507603 0.896382
+vt 0.876058 0.546756
+vt 0.496830 0.873579
+vt 0.860237 0.521927
+vt 0.882674 0.533760
+vt 0.484020 0.879778
+vt 0.905425 0.544883
+vt 0.494614 0.902227
+vt 0.928499 0.555271
+vt 0.504564 0.924934
+vt 0.751373 0.500239
+vt 0.951892 0.564899
+vt 0.513824 0.947902
+vt 0.975605 0.573701
+vt 0.522300 0.971156
+vt 0.999730 0.581622
+vt 0.529918 0.994810
+vt 0.467214 0.012070
+vt 0.473830 0.037283
+vt 0.033395 0.448402
+vt 0.015426 0.425973
+vt 0.481368 0.062160
+vt 0.055934 0.458369
+vt 0.650334 0.414540
+vt 0.489639 0.086721
+vt 0.078127 0.468962
+vt 0.498737 0.110972
+vt 0.100005 0.480243
+vt 0.508525 0.134916
+vt 0.121599 0.492065
+vt 0.519107 0.158500
+vt 0.142847 0.504498
+vt 0.580101 0.334967
+vt 0.530354 0.181668
+vt 0.163714 0.517437
+vt 0.542218 0.204396
+vt 0.184195 0.530860
+vt 0.554830 0.226679
+vt 0.204276 0.544876
+vt 0.568031 0.248509
+vt 0.223946 0.559337
+vt 0.520249 0.246923
+vt 0.581929 0.269816
+vt 0.243134 0.574346
+vt 0.596432 0.290608
+vt 0.261860 0.589846
+vt 0.494313 0.199869
+vt 0.611460 0.310872
+vt 0.280125 0.605762
+vt 0.627142 0.330475
+vt 0.297784 0.622210
+vt 0.643523 0.349545
+vt 0.314966 0.639247
+vt 0.660687 0.368154
+vt 0.331748 0.656947
+vt 0.678435 0.386396
+vt 0.348234 0.675138
+vt 0.442608 0.074517
+vt 0.696616 0.404026
+vt 0.364209 0.693663
+vt 0.715301 0.420890
+vt 0.379524 0.712612
+vt 0.024957 0.401779
+vt 0.734521 0.437214
+vt 0.394405 0.732043
+vt 0.962651 0.611347
+vt 0.754258 0.452931
+vt 0.408793 0.751927
+vt 0.774510 0.468007
+vt 0.422653 0.772246
+vt 0.795301 0.482400
+vt 0.435941 0.793012
+vt 0.816530 0.496236
+vt 0.448774 0.814155
+vt 0.838173 0.509408
+vt 0.461060 0.835673
+vt 0.472817 0.857574
+vt 0.810139 0.626706
+vt 0.835143 0.650537
+vt 0.785264 0.603031
+vt 0.760751 0.579133
+vt 0.736210 0.554925
+vt 0.711447 0.530561
+vt 0.686657 0.506204
+vt 0.661819 0.481956
+vt 0.637138 0.457777
+vt 0.612637 0.433676
+vt 0.588357 0.409370
+vt 0.564176 0.384806
+vt 0.540067 0.360167
+vt 0.516069 0.335605
+vt 0.492141 0.310934
+vt 0.468266 0.286229
+vt 0.444694 0.261346
+vt 0.421183 0.236100
+vt 0.397539 0.210521
+vt 0.373758 0.184952
+vt 0.350073 0.159338
+vt 0.326382 0.133643
+vt 0.302760 0.107831
+vt 0.279284 0.081992
+vt 0.256199 0.056031
+vt 0.233466 0.029689
+vt 0.034190 0.379163
+vt 0.211248 0.002453
+vt 0.961022 0.766901
+vt 0.987214 0.788707
+vt 0.935565 0.744348
+vt 0.910380 0.721270
+vt 0.885255 0.697890
+vt 0.860213 0.674318
+vt 0.552346 0.815973
+vt 0.934527 0.170847
+vt 0.940105 0.196819
+vt 0.539367 0.792061
+vt 0.941741 0.223758
+vt 0.525826 0.768549
+vt 0.511609 0.745484
+vt 0.939350 0.251167
+vt 0.933610 0.278785
+vt 0.496815 0.722744
+vt 0.925906 0.306914
+vt 0.481402 0.700456
+vt 0.917751 0.336080
+vt 0.465369 0.678678
+vt 0.448901 0.657345
+vt 0.629920 0.514507
+vt 0.851341 0.361965
+vt 0.887827 0.391242
+vt 0.822820 0.362145
+vt 0.431762 0.636627
+vt 0.414252 0.616352
+vt 0.794848 0.360817
+vt 0.767693 0.356163
+vt 0.396257 0.596573
+vt 0.377629 0.577397
+vt 0.742000 0.347345
+vt 0.358476 0.558742
+vt 0.718546 0.334188
+vt 0.698067 0.316968
+vt 0.338910 0.540537
+vt 0.681227 0.296246
+vt 0.318863 0.522891
+vt 0.298376 0.505806
+vt 0.668578 0.272727
+vt 0.411051 0.292324
+vt 0.660557 0.247219
+vt 0.277489 0.489209
+vt 0.256036 0.473174
+vt 0.657544 0.220620
+vt 0.234090 0.457648
+vt 0.659981 0.193943
+vt 0.211634 0.442767
+vt 0.668297 0.168415
+vt 0.188811 0.428403
+vt 0.315700 0.190119
+vt 0.679071 0.143824
+vt 0.165543 0.414696
+vt 0.695019 0.122284
+vt 0.141891 0.401611
+vt 0.714951 0.104409
+vt 0.117852 0.389311
+vt 0.737887 0.090668
+vt 0.093592 0.377640
+vt 0.762916 0.081446
+vt 0.069213 0.366370
+vt 0.789162 0.077009
+vt 0.044729 0.355305
+vt 0.815709 0.077516
+vt 0.616898 0.966236
+vt 0.607364 0.940528
+vt 0.964960 0.815519
+vt 0.841645 0.082923
+vt 0.866069 0.093056
+vt 0.597648 0.915071
+vt 0.587227 0.889873
+vt 0.888166 0.107532
+vt 0.576292 0.864900
+vt 0.907215 0.125822
+vt 0.564652 0.840265
+vt 0.922713 0.147216
+vt 0.800886 0.218990
+vt 0.880922 0.363256
+vt 0.046709 0.690276
+vt 0.389807 0.753990
+vt 0.007574 0.187373
+vt 0.980575 0.640547
+vt 0.026447 0.398569
+vt 0.451184 0.159704
+vt 0.516083 0.281471
+vt 0.580179 0.369219
+vt 0.675067 0.466760
+vt 0.807231 0.562167
+vt 0.010443 0.439251
+vn 0.000214 -0.999969 0.001068
+vn 0.000000 -0.999969 0.001068
+vn 0.000000 -1.000000 0.000000
+vn 0.000397 -0.999969 0.001007
+vn 0.000580 -0.999969 0.000885
+vn 0.000763 -0.999969 0.000763
+vn 0.000885 -0.999969 0.000580
+vn 0.001007 -0.999969 0.000397
+vn 0.001068 -0.999969 0.000183
+vn 0.001099 -0.999969 0.000000
+vn 0.001068 -0.999969 -0.000214
+vn 0.001007 -0.999969 -0.000397
+vn 0.000885 -0.999969 -0.000610
+vn 0.000763 -0.999969 -0.000763
+vn 0.000610 -0.999969 -0.000885
+vn 0.000397 -0.999969 -0.001007
+vn 0.000214 -0.999969 -0.001068
+vn 0.000000 -0.999969 -0.001099
+vn -0.000214 -0.999969 -0.001068
+vn -0.000397 -0.999969 -0.001007
+vn -0.000610 -0.999969 -0.000885
+vn -0.000763 -0.999969 -0.000763
+vn -0.000885 -0.999969 -0.000610
+vn -0.001007 -0.999969 -0.000397
+vn -0.001068 -0.999969 -0.000214
+vn -0.001099 -0.999969 0.000000
+vn -0.001068 -0.999969 0.000183
+vn -0.001007 -0.999969 0.000397
+vn -0.000885 -0.999969 0.000580
+vn -0.000763 -0.999969 0.000763
+vn -0.000580 -0.999969 0.000885
+vn -0.000397 -0.999969 0.001007
+vn -0.000214 -0.999969 0.001068
+vn 0.000000 -0.047945 -0.998840
+vn -0.194861 -0.047945 -0.979644
+vn -0.194861 0.047945 -0.979644
+vn 0.000000 0.047945 -0.998840
+vn -0.382214 -0.047945 -0.922788
+vn -0.382214 0.047945 -0.922788
+vn -0.554918 -0.047945 -0.830500
+vn -0.554918 0.047945 -0.830500
+vn -0.706290 -0.047945 -0.706290
+vn -0.706290 0.047945 -0.706290
+vn -0.830500 -0.047945 -0.554918
+vn -0.830500 0.047945 -0.554918
+vn -0.922788 -0.047945 -0.382214
+vn -0.922788 0.047945 -0.382214
+vn -0.979644 -0.047945 -0.194861
+vn -0.979644 0.047945 -0.194861
+vn -0.998840 -0.047945 0.000000
+vn -0.998840 0.047945 0.000000
+vn -0.979644 -0.047945 0.194861
+vn -0.979644 0.047945 0.194861
+vn -0.922788 -0.047945 0.382214
+vn -0.922788 0.047945 0.382214
+vn -0.830500 -0.047945 0.554918
+vn -0.830500 0.047945 0.554918
+vn -0.706290 -0.047945 0.706290
+vn -0.706290 0.047945 0.706290
+vn -0.554918 -0.047945 0.830500
+vn -0.554918 0.047945 0.830500
+vn -0.382214 -0.047945 0.922788
+vn -0.382214 0.047945 0.922788
+vn -0.194861 -0.047945 0.979644
+vn -0.194861 0.047945 0.979644
+vn 0.000000 -0.047945 0.998840
+vn 0.000000 0.047945 0.998840
+vn 0.194861 -0.047945 0.979644
+vn 0.194861 0.047945 0.979644
+vn 0.382214 -0.047945 0.922788
+vn 0.382214 0.047945 0.922788
+vn 0.554918 -0.047945 0.830500
+vn 0.554918 0.047945 0.830500
+vn 0.706290 -0.047945 0.706290
+vn 0.706290 0.047945 0.706290
+vn 0.830500 -0.047945 0.554918
+vn 0.830500 0.047945 0.554918
+vn 0.922788 -0.047945 0.382214
+vn 0.922788 0.047945 0.382214
+vn 0.979644 -0.047945 0.194861
+vn 0.979644 0.047945 0.194861
+vn 0.998840 -0.047945 0.000000
+vn 0.998840 0.047945 0.000000
+vn 0.979644 -0.047945 -0.194861
+vn 0.979644 0.047945 -0.194861
+vn 0.922788 -0.047945 -0.382214
+vn 0.922788 0.047945 -0.382214
+vn 0.830500 -0.047945 -0.554918
+vn 0.830500 0.047945 -0.554918
+vn 0.706290 -0.047945 -0.706290
+vn 0.706290 0.047945 -0.706290
+vn 0.554918 -0.047945 -0.830500
+vn 0.554918 0.047945 -0.830500
+vn 0.382214 -0.047945 -0.922788
+vn 0.382214 0.047945 -0.922788
+vn 0.194861 -0.047945 -0.979644
+vn 0.194861 0.047945 -0.979644
+vn 0.000000 -0.470199 -0.882534
+vn 0.172155 -0.470199 -0.865566
+vn 0.172155 0.470199 -0.865566
+vn 0.000000 0.470199 -0.882534
+vn 0.337718 -0.470229 -0.815363
+vn 0.337718 0.470199 -0.815363
+vn 0.337718 -0.470229 -0.815332
+vn 0.490310 -0.470199 -0.733787
+vn 0.490310 0.470199 -0.733787
+vn 0.624043 -0.470229 -0.624043
+vn 0.624043 0.470229 -0.624043
+vn 0.733787 -0.470199 -0.490310
+vn 0.733787 0.470199 -0.490310
+vn 0.815363 -0.470199 -0.337718
+vn 0.815363 0.470199 -0.337718
+vn 0.865566 -0.470199 -0.172155
+vn 0.865566 0.470199 -0.172155
+vn 0.882534 -0.470199 0.000000
+vn 0.882534 0.470199 0.000000
+vn 0.865566 -0.470199 0.172155
+vn 0.865566 0.470199 0.172155
+vn 0.815363 -0.470199 0.337718
+vn 0.815363 0.470199 0.337718
+vn 0.733787 -0.470199 0.490310
+vn 0.733787 0.470199 0.490310
+vn 0.624043 -0.470229 0.624043
+vn 0.624043 0.470199 0.624043
+vn 0.490310 -0.470199 0.733787
+vn 0.490310 0.470199 0.733787
+vn 0.337718 -0.470199 0.815363
+vn 0.337718 0.470229 0.815332
+vn 0.172155 -0.470199 0.865566
+vn 0.172155 0.470199 0.865566
+vn 0.000000 -0.470199 0.882534
+vn 0.000000 0.470199 0.882534
+vn -0.172155 -0.470199 0.865566
+vn -0.172155 0.470199 0.865566
+vn -0.337718 -0.470229 0.815332
+vn -0.337718 0.470199 0.815363
+vn -0.337718 -0.470229 0.815363
+vn -0.490310 -0.470199 0.733787
+vn -0.490310 0.470199 0.733787
+vn -0.624043 -0.470229 0.624043
+vn -0.624043 0.470199 0.624043
+vn -0.733787 -0.470199 0.490310
+vn -0.733787 0.470199 0.490310
+vn -0.815363 -0.470199 0.337718
+vn -0.815363 0.470199 0.337718
+vn -0.865566 -0.470229 0.172155
+vn -0.865566 0.470199 0.172155
+vn -0.882534 -0.470199 0.000000
+vn -0.882534 0.470199 0.000000
+vn -0.865566 -0.470199 -0.172155
+vn -0.865566 0.470199 -0.172155
+vn -0.815363 -0.470199 -0.337718
+vn -0.815363 0.470199 -0.337718
+vn -0.733787 -0.470199 -0.490310
+vn -0.733787 0.470199 -0.490310
+vn -0.624043 -0.470199 -0.624043
+vn -0.624043 0.470199 -0.624043
+vn -0.490310 -0.470199 -0.733787
+vn -0.490310 0.470199 -0.733787
+vn -0.337718 -0.470199 -0.815363
+vn -0.337718 0.470229 -0.815332
+vn -0.337718 0.470199 -0.815363
+vn -0.337718 -0.470229 -0.815332
+vn -0.172155 -0.470199 -0.865566
+vn -0.172155 0.470229 -0.865566
+vn -0.172155 0.470199 -0.865566
+vn -0.172155 -0.470229 -0.865566
+vn 0.000000 -0.138279 -0.990387
+vn -0.193213 -0.138279 -0.971343
+vn -0.193213 0.138310 -0.971343
+vn 0.000000 0.138279 -0.990387
+vn -0.378979 -0.138279 -0.914975
+vn -0.378979 0.138310 -0.914975
+vn -0.550218 -0.138310 -0.823450
+vn -0.378979 -0.138310 -0.914975
+vn -0.550218 0.138310 -0.823450
+vn -0.700308 -0.138310 -0.700308
+vn -0.700308 0.138310 -0.700308
+vn -0.823450 -0.138279 -0.550218
+vn -0.823450 0.138279 -0.550218
+vn -0.823450 0.138310 -0.550218
+vn -0.914975 -0.138279 -0.378979
+vn -0.914975 0.138279 -0.378979
+vn -0.971343 -0.138279 -0.193213
+vn -0.971343 0.138279 -0.193213
+vn -0.990387 -0.138279 0.000000
+vn -0.990387 0.138310 0.000000
+vn -0.990387 0.138279 0.000000
+vn -0.971343 -0.138279 0.193213
+vn -0.971343 0.138310 0.193213
+vn -0.971343 0.138279 0.193213
+vn -0.914975 -0.138310 0.378979
+vn -0.914975 0.138310 0.378979
+vn -0.823450 -0.138279 0.550218
+vn -0.823450 0.138279 0.550218
+vn -0.700308 -0.138310 0.700308
+vn -0.700308 0.138279 0.700308
+vn -0.550218 -0.138310 0.823450
+vn -0.550218 0.138279 0.823450
+vn -0.378979 -0.138310 0.914975
+vn -0.378979 0.138310 0.914975
+vn -0.193213 -0.138310 0.971343
+vn -0.193213 0.138310 0.971343
+vn -0.193213 0.138279 0.971343
+vn 0.000000 -0.138310 0.990387
+vn 0.000000 0.138279 0.990387
+vn 0.193213 -0.138310 0.971343
+vn 0.193213 0.138279 0.971343
+vn 0.193213 0.138310 0.971343
+vn 0.378979 -0.138310 0.914975
+vn 0.378979 0.138279 0.914975
+vn 0.550218 -0.138279 0.823450
+vn 0.550218 0.138279 0.823450
+vn 0.700308 -0.138279 0.700308
+vn 0.700308 0.138279 0.700308
+vn 0.823450 -0.138310 0.550218
+vn 0.823450 0.138310 0.550218
+vn 0.914975 -0.138310 0.378979
+vn 0.914975 0.138279 0.378979
+vn 0.971343 -0.138279 0.193213
+vn 0.914975 -0.138279 0.378979
+vn 0.971343 0.138279 0.193213
+vn 0.990387 -0.138279 0.000000
+vn 0.990387 0.138279 0.000000
+vn 0.971343 -0.138279 -0.193213
+vn 0.971343 0.138279 -0.193213
+vn 0.914975 -0.138310 -0.378979
+vn 0.914975 0.138310 -0.378979
+vn 0.823450 -0.138310 -0.550218
+vn 0.823450 0.138279 -0.550218
+vn 0.823450 0.138310 -0.550218
+vn 0.700308 -0.138279 -0.700308
+vn 0.823450 -0.138279 -0.550218
+vn 0.700308 0.138279 -0.700308
+vn 0.550218 -0.138279 -0.823450
+vn 0.550218 0.138279 -0.823450
+vn 0.378979 -0.138279 -0.914975
+vn 0.378979 0.138279 -0.914975
+vn 0.193213 -0.138279 -0.971343
+vn 0.193213 0.138310 -0.971343
+vn 0.000000 0.138310 -0.990387
+vn 0.000000 -0.118900 -0.992889
+vn -0.193701 -0.118900 -0.973815
+vn 0.000000 0.000000 -0.999969
+vn -0.195074 0.000000 -0.980773
+vn -0.193701 0.118900 -0.973815
+vn -0.379955 -0.118900 -0.917325
+vn -0.382672 0.000000 -0.923856
+vn -0.379955 0.118900 -0.917325
+vn -0.551622 -0.118900 -0.825556
+vn -0.555559 0.000000 -0.831446
+vn -0.551622 0.118900 -0.825556
+vn -0.702078 -0.118900 -0.702078
+vn -0.707083 0.000000 -0.707083
+vn -0.702078 0.118900 -0.702078
+vn -0.825556 -0.118900 -0.551622
+vn -0.831446 0.000000 -0.555559
+vn -0.825556 0.118900 -0.551622
+vn -0.917295 -0.118900 -0.379955
+vn -0.923856 0.000000 -0.382672
+vn -0.917295 0.118900 -0.379955
+vn -0.973815 -0.118900 -0.193701
+vn -0.980773 0.000000 -0.195074
+vn -0.973815 0.118900 -0.193701
+vn -0.992889 -0.118900 0.000000
+vn -0.999969 0.000000 0.000000
+vn -0.992889 0.118900 0.000000
+vn -0.973815 -0.118900 0.193701
+vn -0.980773 0.000000 0.195074
+vn -0.973815 0.118900 0.193701
+vn -0.917325 -0.118900 0.379955
+vn -0.923856 0.000000 0.382672
+vn -0.917325 0.118900 0.379955
+vn -0.825556 -0.118900 0.551622
+vn -0.831446 0.000000 0.555559
+vn -0.825556 0.118900 0.551622
+vn -0.702078 -0.118900 0.702078
+vn -0.707083 0.000000 0.707083
+vn -0.702078 0.118900 0.702078
+vn -0.551622 -0.118900 0.825556
+vn -0.555559 0.000000 0.831446
+vn -0.551622 0.118900 0.825556
+vn -0.379955 -0.118900 0.917325
+vn -0.382672 0.000000 0.923856
+vn -0.379955 0.118900 0.917325
+vn -0.193701 -0.118900 0.973815
+vn -0.195074 0.000000 0.980773
+vn -0.193701 0.118900 0.973815
+vn 0.000000 -0.118900 0.992889
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.118900 0.992889
+vn 0.193701 -0.118900 0.973815
+vn 0.195074 0.000000 0.980773
+vn 0.193701 0.118900 0.973815
+vn 0.379955 -0.118900 0.917295
+vn 0.382672 0.000000 0.923856
+vn 0.379955 0.118900 0.917295
+vn 0.551622 -0.118900 0.825556
+vn 0.555559 0.000000 0.831446
+vn 0.551622 0.118900 0.825556
+vn 0.702078 -0.118900 0.702078
+vn 0.707083 0.000000 0.707083
+vn 0.702078 0.118900 0.702078
+vn 0.825556 -0.118900 0.551622
+vn 0.831446 0.000000 0.555559
+vn 0.825556 0.118900 0.551622
+vn 0.917325 -0.118900 0.379955
+vn 0.923856 0.000000 0.382672
+vn 0.917325 0.118900 0.379955
+vn 0.973815 -0.118900 0.193701
+vn 0.980773 0.000000 0.195074
+vn 0.973815 0.118900 0.193701
+vn 0.992889 -0.118900 0.000000
+vn 0.999969 0.000000 0.000000
+vn 0.992889 0.118900 0.000000
+vn 0.973815 -0.118900 -0.193701
+vn 0.980773 0.000000 -0.195074
+vn 0.973815 0.118900 -0.193701
+vn 0.917295 -0.118900 -0.379955
+vn 0.923856 0.000000 -0.382672
+vn 0.917295 0.118900 -0.379955
+vn 0.825556 -0.118900 -0.551622
+vn 0.831446 0.000000 -0.555559
+vn 0.825556 0.118900 -0.551622
+vn 0.702078 -0.118900 -0.702078
+vn 0.707083 0.000000 -0.707083
+vn 0.702078 0.118900 -0.702078
+vn 0.551622 -0.118900 -0.825556
+vn 0.555559 0.000000 -0.831446
+vn 0.551622 0.118900 -0.825556
+vn 0.379955 -0.118900 -0.917325
+vn 0.382672 0.000000 -0.923856
+vn 0.379955 0.118900 -0.917325
+vn 0.193701 -0.118900 -0.973815
+vn 0.195074 0.000000 -0.980773
+vn 0.193701 0.118900 -0.973815
+vn 0.000000 0.118900 -0.992889
+vn 0.000000 -0.192297 -0.981323
+vn -0.191443 -0.192297 -0.962462
+vn -0.191443 0.192297 -0.962462
+vn -0.375530 -0.192297 -0.906613
+vn -0.375530 0.192297 -0.906613
+vn -0.545183 -0.192297 -0.815943
+vn -0.545183 0.192297 -0.815943
+vn -0.693899 -0.192297 -0.693899
+vn -0.693899 0.192297 -0.693899
+vn -0.815943 -0.192297 -0.545183
+vn -0.815943 0.192297 -0.545183
+vn -0.906613 -0.192297 -0.375530
+vn -0.906613 0.192297 -0.375530
+vn -0.962462 -0.192297 -0.191443
+vn -0.962462 0.192297 -0.191443
+vn -0.981323 -0.192297 0.000000
+vn -0.981323 0.192297 0.000000
+vn -0.962462 -0.192297 0.191443
+vn -0.962462 0.192297 0.191443
+vn -0.906613 -0.192297 0.375530
+vn -0.906613 0.192297 0.375530
+vn -0.815943 -0.192297 0.545183
+vn -0.815943 0.192297 0.545183
+vn -0.693899 -0.192297 0.693899
+vn -0.693899 0.192297 0.693899
+vn -0.545183 -0.192297 0.815943
+vn -0.545183 0.192297 0.815943
+vn -0.375530 -0.192297 0.906613
+vn -0.375530 0.192297 0.906613
+vn -0.191443 -0.192297 0.962462
+vn -0.191443 0.192297 0.962462
+vn 0.000000 -0.192297 0.981323
+vn 0.000000 0.192297 0.981323
+vn 0.191443 -0.192297 0.962462
+vn 0.191443 0.192297 0.962462
+vn 0.375530 -0.192297 0.906613
+vn 0.375530 0.192297 0.906613
+vn 0.545183 -0.192297 0.815943
+vn 0.545183 0.192297 0.815943
+vn 0.693899 -0.192297 0.693899
+vn 0.693899 0.192297 0.693899
+vn 0.815943 -0.192297 0.545183
+vn 0.815943 0.192297 0.545183
+vn 0.906613 -0.192297 0.375530
+vn 0.906613 0.192297 0.375530
+vn 0.962462 -0.192297 0.191443
+vn 0.962462 0.192297 0.191443
+vn 0.981323 -0.192297 0.000000
+vn 0.981323 0.192297 0.000000
+vn 0.962462 -0.192297 -0.191443
+vn 0.962462 0.192297 -0.191443
+vn 0.906613 -0.192297 -0.375530
+vn 0.906613 0.192297 -0.375530
+vn 0.815943 -0.192297 -0.545183
+vn 0.815943 0.192297 -0.545183
+vn 0.693899 -0.192297 -0.693899
+vn 0.693899 0.192297 -0.693899
+vn 0.545183 -0.192297 -0.815943
+vn 0.545183 0.192297 -0.815943
+vn 0.375530 -0.192297 -0.906613
+vn 0.375530 0.192297 -0.906613
+vn 0.191443 -0.192297 -0.962462
+vn 0.191443 0.192297 -0.962462
+vn 0.000000 0.192297 -0.981323
+vn 0.000000 -0.190649 -0.981628
+vn -0.191504 -0.190649 -0.962767
+vn -0.191504 0.190649 -0.962767
+vn 0.000000 0.190649 -0.981628
+vn -0.375652 -0.190649 -0.906919
+vn -0.375652 0.190649 -0.906919
+vn -0.545366 -0.190649 -0.816187
+vn -0.545366 0.190649 -0.816187
+vn -0.694113 -0.190649 -0.694113
+vn -0.694113 0.190649 -0.694113
+vn -0.816187 -0.190649 -0.545366
+vn -0.816187 0.190649 -0.545366
+vn -0.906919 -0.190649 -0.375652
+vn -0.906919 0.190649 -0.375652
+vn -0.962767 -0.190649 -0.191504
+vn -0.962767 0.190649 -0.191504
+vn -0.981628 -0.190649 0.000000
+vn -0.981628 0.190649 0.000000
+vn -0.962767 -0.190649 0.191504
+vn -0.962767 0.190649 0.191504
+vn -0.906919 -0.190649 0.375652
+vn -0.906919 0.190649 0.375652
+vn -0.816187 -0.190649 0.545366
+vn -0.816187 0.190649 0.545366
+vn -0.694113 -0.190649 0.694113
+vn -0.694113 0.190649 0.694113
+vn -0.545366 -0.190649 0.816187
+vn -0.545366 0.190649 0.816187
+vn -0.375652 -0.190649 0.906919
+vn -0.375652 0.190649 0.906919
+vn -0.191504 -0.190649 0.962767
+vn -0.191504 0.190649 0.962767
+vn 0.000000 -0.190649 0.981628
+vn 0.000000 0.190649 0.981628
+vn 0.191504 -0.190649 0.962767
+vn 0.191504 0.190649 0.962767
+vn 0.375652 -0.190649 0.906919
+vn 0.375652 0.190649 0.906919
+vn 0.545366 -0.190649 0.816187
+vn 0.545366 0.190649 0.816187
+vn 0.694113 -0.190649 0.694113
+vn 0.694113 0.190649 0.694113
+vn 0.816187 -0.190649 0.545366
+vn 0.816187 0.190649 0.545366
+vn 0.906919 -0.190649 0.375652
+vn 0.906919 0.190649 0.375652
+vn 0.962767 -0.190649 0.191504
+vn 0.962767 0.190649 0.191504
+vn 0.981628 -0.190649 0.000000
+vn 0.981628 0.190649 0.000000
+vn 0.962767 -0.190649 -0.191504
+vn 0.962767 0.190649 -0.191504
+vn 0.906919 -0.190649 -0.375652
+vn 0.906919 0.190649 -0.375652
+vn 0.816187 -0.190649 -0.545366
+vn 0.816187 0.190649 -0.545366
+vn 0.694113 -0.190649 -0.694113
+vn 0.694113 0.190649 -0.694113
+vn 0.545366 -0.190649 -0.816187
+vn 0.545366 0.190649 -0.816187
+vn 0.375652 -0.190649 -0.906919
+vn 0.375652 0.190649 -0.906919
+vn 0.191504 -0.190649 -0.962767
+vn 0.191504 0.190649 -0.962767
+vn 0.000000 0.624348 -0.781121
+vn 0.152379 0.624348 -0.766106
+vn 0.152379 -0.624348 -0.766106
+vn 0.000000 -0.624348 -0.781121
+vn 0.298898 0.624348 -0.721671
+vn 0.298898 -0.624348 -0.721641
+vn 0.298898 -0.624348 -0.721671
+vn 0.433973 0.624348 -0.649464
+vn 0.433943 -0.624348 -0.649464
+vn 0.433973 -0.624348 -0.649464
+vn 0.433943 0.624348 -0.649464
+vn 0.552324 0.624348 -0.552324
+vn 0.552324 -0.624348 -0.552324
+vn 0.649464 0.624348 -0.433973
+vn 0.649464 -0.624348 -0.433973
+vn 0.649464 0.624348 -0.433943
+vn 0.721671 0.624348 -0.298898
+vn 0.721671 -0.624348 -0.298898
+vn 0.766106 0.624348 -0.152379
+vn 0.766106 -0.624348 -0.152379
+vn 0.781121 0.624348 0.000000
+vn 0.781121 -0.624348 0.000000
+vn 0.766106 0.624348 0.152379
+vn 0.766106 -0.624348 0.152379
+vn 0.721671 0.624348 0.298898
+vn 0.721671 -0.624348 0.298898
+vn 0.649464 0.624348 0.433973
+vn 0.649464 -0.624348 0.433973
+vn 0.552324 0.624348 0.552324
+vn 0.552324 -0.624348 0.552324
+vn 0.433973 0.624348 0.649464
+vn 0.433973 -0.624348 0.649464
+vn 0.298898 0.624348 0.721671
+vn 0.298898 -0.624348 0.721671
+vn 0.152379 0.624348 0.766106
+vn 0.152379 -0.624348 0.766106
+vn 0.000000 0.624348 0.781121
+vn 0.000000 -0.624348 0.781121
+vn -0.152379 0.624348 0.766106
+vn -0.152379 -0.624348 0.766106
+vn -0.298898 0.624348 0.721671
+vn -0.298898 -0.624348 0.721641
+vn -0.298898 -0.624348 0.721671
+vn -0.433973 0.624348 0.649464
+vn -0.433943 -0.624348 0.649464
+vn -0.552324 0.624348 0.552324
+vn -0.552324 -0.624348 0.552324
+vn -0.649464 0.624348 0.433973
+vn -0.649464 -0.624348 0.433973
+vn -0.721671 0.624348 0.298898
+vn -0.721671 -0.624348 0.298898
+vn -0.766106 0.624348 0.152379
+vn -0.766106 -0.624348 0.152379
+vn -0.781121 0.624348 0.000000
+vn -0.781121 -0.624348 0.000000
+vn -0.766106 0.624348 -0.152379
+vn -0.766106 -0.624348 -0.152379
+vn -0.721671 0.624348 -0.298898
+vn -0.721671 -0.624348 -0.298898
+vn -0.721671 -0.624348 -0.298929
+vn -0.649464 0.624348 -0.433973
+vn -0.649464 -0.624348 -0.433973
+vn -0.552324 0.624348 -0.552324
+vn -0.552324 -0.624348 -0.552324
+vn -0.433973 0.624348 -0.649464
+vn -0.433973 -0.624348 -0.649464
+vn -0.298898 0.624348 -0.721671
+vn -0.298898 -0.624348 -0.721671
+vn -0.152379 0.624348 -0.766106
+vn -0.152379 -0.624348 -0.766106
+vn 0.000000 -0.303140 -0.952910
+vn 0.185888 -0.303140 -0.934629
+vn 0.185888 0.303140 -0.934629
+vn 0.000000 0.303140 -0.952910
+vn 0.000000 -0.211005 -0.977477
+vn -0.190680 -0.211005 -0.958678
+vn -0.190680 0.211005 -0.958678
+vn 0.000000 0.211005 -0.977477
+vn 0.364666 -0.303140 -0.880398
+vn 0.364666 0.303140 -0.880398
+vn -0.374065 -0.211005 -0.903073
+vn -0.374035 0.211005 -0.903073
+vn -0.374065 0.211005 -0.903073
+vn 0.529405 -0.303140 -0.792322
+vn 0.529405 0.303140 -0.792322
+vn -0.543046 -0.211005 -0.812738
+vn -0.543046 0.211005 -0.812738
+vn 0.673818 -0.303140 -0.673818
+vn 0.673818 0.303140 -0.673818
+vn -0.691183 -0.211005 -0.691183
+vn -0.691183 0.211005 -0.691183
+vn 0.792322 -0.303140 -0.529405
+vn 0.792322 0.303140 -0.529405
+vn -0.812738 -0.211005 -0.543046
+vn -0.812738 0.211005 -0.543046
+vn 0.880398 -0.303140 -0.364666
+vn 0.880398 0.303140 -0.364666
+vn -0.903073 -0.211005 -0.374065
+vn -0.903073 0.211005 -0.374065
+vn 0.934629 -0.303140 -0.185888
+vn 0.934629 0.303140 -0.185888
+vn -0.958678 -0.211005 -0.190680
+vn -0.958678 0.211005 -0.190680
+vn 0.952940 -0.303140 0.000000
+vn 0.952940 0.303140 0.000000
+vn -0.977477 -0.211005 0.000000
+vn -0.977477 0.211005 0.000000
+vn 0.934629 -0.303140 0.185888
+vn 0.934599 0.303140 0.185888
+vn -0.958678 -0.211005 0.190680
+vn -0.958678 0.211005 0.190680
+vn 0.880398 -0.303140 0.364666
+vn 0.880398 0.303140 0.364666
+vn -0.903073 -0.211005 0.374065
+vn -0.903073 0.211005 0.374065
+vn 0.792322 -0.303140 0.529405
+vn 0.792322 0.303140 0.529405
+vn -0.812738 -0.211005 0.543046
+vn -0.812738 0.211005 0.543046
+vn 0.673818 -0.303140 0.673818
+vn 0.673818 0.303140 0.673818
+vn -0.691183 -0.211005 0.691183
+vn -0.691183 0.211005 0.691183
+vn 0.529405 -0.303140 0.792322
+vn 0.529405 0.303140 0.792322
+vn -0.543046 -0.211005 0.812738
+vn -0.543046 0.211005 0.812738
+vn 0.364666 -0.303140 0.880398
+vn 0.364666 0.303140 0.880398
+vn -0.374065 -0.211005 0.903073
+vn -0.374065 0.211005 0.903073
+vn 0.185888 -0.303140 0.934599
+vn 0.185888 0.303140 0.934599
+vn -0.190680 -0.211005 0.958678
+vn -0.190680 0.211005 0.958678
+vn 0.000000 -0.303140 0.952910
+vn 0.000000 0.303140 0.952910
+vn 0.000000 -0.211005 0.977477
+vn 0.000000 0.211005 0.977477
+vn -0.185888 -0.303140 0.934599
+vn -0.185888 0.303140 0.934599
+vn 0.190680 -0.211005 0.958678
+vn 0.190680 0.211005 0.958678
+vn -0.364666 -0.303140 0.880398
+vn -0.364666 0.303140 0.880398
+vn 0.374065 -0.211005 0.903073
+vn 0.374065 0.211005 0.903073
+vn -0.529405 -0.303140 0.792322
+vn -0.529405 0.303140 0.792322
+vn 0.543046 -0.211005 0.812738
+vn 0.543046 0.211005 0.812738
+vn -0.673818 -0.303140 0.673818
+vn -0.673818 0.303140 0.673818
+vn 0.691183 -0.211005 0.691183
+vn 0.691183 0.211005 0.691183
+vn -0.792322 -0.303140 0.529405
+vn -0.792322 0.303140 0.529405
+vn 0.812738 -0.211005 0.543046
+vn 0.812738 0.211005 0.543046
+vn -0.880398 -0.303140 0.364666
+vn -0.880398 0.303140 0.364666
+vn 0.903073 -0.211005 0.374065
+vn 0.903073 0.211005 0.374065
+vn -0.934629 -0.303140 0.185888
+vn -0.934629 0.303140 0.185888
+vn 0.958678 -0.211005 0.190680
+vn 0.958678 0.211005 0.190680
+vn -0.952910 -0.303140 0.000000
+vn -0.952910 0.303140 0.000000
+vn 0.977477 -0.211005 0.000000
+vn 0.977477 0.211005 0.000000
+vn -0.934629 -0.303140 -0.185888
+vn -0.934629 0.303140 -0.185888
+vn 0.958678 -0.211005 -0.190680
+vn 0.958678 0.211005 -0.190680
+vn -0.880398 -0.303140 -0.364666
+vn -0.880398 0.303140 -0.364666
+vn 0.903073 -0.211005 -0.374065
+vn 0.903073 0.211005 -0.374065
+vn -0.792322 -0.303140 -0.529405
+vn -0.792322 0.303140 -0.529405
+vn 0.812738 -0.211005 -0.543046
+vn 0.812738 0.211005 -0.543046
+vn -0.673818 -0.303140 -0.673818
+vn -0.673818 0.303140 -0.673818
+vn 0.691183 -0.211005 -0.691183
+vn 0.691183 0.211005 -0.691183
+vn -0.529405 -0.303140 -0.792322
+vn -0.529405 0.303140 -0.792322
+vn 0.543046 -0.211005 -0.812738
+vn 0.543046 0.211005 -0.812738
+vn -0.364666 -0.303140 -0.880398
+vn -0.364666 0.303140 -0.880398
+vn 0.374065 -0.211005 -0.903073
+vn 0.374065 0.211005 -0.903073
+vn -0.185888 -0.303140 -0.934629
+vn -0.185888 0.303140 -0.934629
+vn 0.190680 -0.211005 -0.958678
+vn 0.190680 0.211005 -0.958678
+vn 0.000000 0.482070 -0.876095
+vn 0.170904 0.482070 -0.859279
+vn 0.170904 -0.482070 -0.859279
+vn 0.000000 -0.482070 -0.876095
+vn 0.335276 0.482070 -0.809412
+vn 0.335276 -0.482070 -0.809412
+vn 0.486740 0.482070 -0.728446
+vn 0.486740 -0.482070 -0.728446
+vn 0.619495 0.482070 -0.619495
+vn 0.619495 -0.482070 -0.619495
+vn 0.728446 0.482070 -0.486740
+vn 0.728446 -0.482070 -0.486740
+vn 0.809412 0.482070 -0.335276
+vn 0.809412 -0.482070 -0.335276
+vn 0.859279 0.482070 -0.170904
+vn 0.859279 -0.482070 -0.170904
+vn 0.876095 0.482070 0.000000
+vn 0.876095 -0.482070 0.000000
+vn 0.859279 0.482070 0.170904
+vn 0.859279 -0.482070 0.170904
+vn 0.809412 0.482070 0.335276
+vn 0.809412 -0.482070 0.335246
+vn 0.728446 0.482070 0.486740
+vn 0.728446 -0.482070 0.486740
+vn 0.809412 -0.482070 0.335276
+vn 0.619495 0.482070 0.619495
+vn 0.619495 -0.482070 0.619495
+vn 0.486740 0.482070 0.728446
+vn 0.486740 -0.482070 0.728446
+vn 0.335276 0.482070 0.809412
+vn 0.335276 -0.482070 0.809412
+vn 0.170904 0.482070 0.859279
+vn 0.170904 -0.482070 0.859279
+vn 0.000000 0.482070 0.876125
+vn 0.000000 -0.482070 0.876125
+vn -0.170904 0.482070 0.859279
+vn -0.170904 -0.482070 0.859279
+vn -0.335276 0.482070 0.809412
+vn -0.335276 -0.482070 0.809412
+vn -0.486740 0.482070 0.728446
+vn -0.486740 -0.482070 0.728446
+vn -0.619495 0.482070 0.619495
+vn -0.619495 -0.482070 0.619495
+vn -0.728446 0.482070 0.486740
+vn -0.728446 -0.482070 0.486740
+vn -0.809412 0.482070 0.335276
+vn -0.809412 -0.482070 0.335246
+vn -0.859279 0.482070 0.170904
+vn -0.859279 -0.482070 0.170904
+vn -0.809412 -0.482070 0.335276
+vn -0.876095 0.482070 0.000000
+vn -0.876095 -0.482070 0.000000
+vn -0.859279 0.482070 -0.170904
+vn -0.859279 -0.482070 -0.170904
+vn -0.809412 0.482070 -0.335276
+vn -0.809412 -0.482070 -0.335276
+vn -0.728446 0.482070 -0.486740
+vn -0.728446 -0.482070 -0.486740
+vn -0.619495 0.482070 -0.619495
+vn -0.619495 -0.482070 -0.619495
+vn -0.486740 0.482070 -0.728446
+vn -0.486740 -0.482070 -0.728446
+vn -0.335246 0.482070 -0.809412
+vn -0.335246 -0.482070 -0.809412
+vn -0.170904 0.482070 -0.859279
+vn -0.170904 -0.482070 -0.859279
+vn 0.000000 -0.210883 -0.977508
+vn 0.190680 -0.210883 -0.958708
+vn 0.190680 0.210883 -0.958708
+vn 0.000000 0.210883 -0.977508
+vn -0.190130 -0.223518 -0.955962
+vn 0.000000 -0.223518 -0.974670
+vn 0.000000 0.223518 -0.974670
+vn -0.190130 0.223518 -0.955962
+vn 0.374065 -0.210883 -0.903073
+vn 0.374065 0.210883 -0.903073
+vn -0.372997 -0.223518 -0.900479
+vn -0.372997 0.223518 -0.900479
+vn 0.543046 -0.210883 -0.812769
+vn 0.543046 0.210883 -0.812738
+vn 0.543046 0.210883 -0.812769
+vn -0.541490 -0.223518 -0.810419
+vn -0.541490 0.223518 -0.810419
+vn 0.543046 -0.210883 -0.812738
+vn 0.691183 -0.210883 -0.691183
+vn 0.691183 0.210883 -0.691183
+vn -0.689200 -0.223518 -0.689200
+vn -0.689200 0.223518 -0.689200
+vn 0.812769 -0.210852 -0.543077
+vn 0.812769 0.210852 -0.543077
+vn -0.810419 -0.223518 -0.541490
+vn -0.810419 0.223518 -0.541490
+vn 0.903073 -0.210883 -0.374065
+vn 0.903073 0.210883 -0.374065
+vn -0.900479 -0.223518 -0.372967
+vn -0.900479 0.223518 -0.372997
+vn -0.900479 0.223518 -0.372967
+vn 0.958708 -0.210883 -0.190680
+vn 0.958708 0.210883 -0.190680
+vn -0.955962 -0.223518 -0.190130
+vn -0.900479 -0.223518 -0.372997
+vn -0.955962 0.223518 -0.190130
+vn 0.977508 -0.210883 0.000000
+vn 0.977508 0.210883 0.000000
+vn -0.974670 -0.223518 0.000000
+vn -0.974670 0.223518 0.000000
+vn -0.974670 0.223487 0.000000
+vn 0.958708 -0.210883 0.190680
+vn 0.958708 0.210883 0.190680
+vn -0.955962 -0.223518 0.190130
+vn -0.955962 0.223518 0.190130
+vn 0.903073 -0.210883 0.374065
+vn 0.903073 0.210883 0.374065
+vn -0.900479 -0.223518 0.372997
+vn -0.900479 0.223518 0.372997
+vn 0.812769 -0.210883 0.543046
+vn 0.812769 0.210883 0.543046
+vn -0.810419 -0.223518 0.541490
+vn -0.810419 0.223518 0.541490
+vn 0.691183 -0.210883 0.691183
+vn 0.691183 0.210883 0.691183
+vn -0.689200 -0.223518 0.689200
+vn -0.689200 0.223518 0.689200
+vn 0.543046 -0.210883 0.812769
+vn 0.543046 0.210883 0.812769
+vn -0.541490 -0.223518 0.810419
+vn -0.541490 0.223518 0.810419
+vn 0.374065 -0.210883 0.903073
+vn 0.374065 0.210883 0.903073
+vn -0.372997 -0.223518 0.900479
+vn -0.372997 0.223518 0.900479
+vn 0.190680 -0.210883 0.958708
+vn 0.190680 0.210883 0.958708
+vn -0.190130 -0.223518 0.955962
+vn -0.190130 0.223518 0.955962
+vn 0.000000 -0.210852 0.977508
+vn 0.000000 0.210852 0.977508
+vn 0.000000 -0.223518 0.974670
+vn 0.000000 0.223487 0.974700
+vn 0.000000 0.223518 0.974670
+vn -0.190680 -0.210883 0.958708
+vn -0.190680 0.210883 0.958708
+vn 0.190130 -0.223518 0.955962
+vn 0.190130 0.223518 0.955962
+vn -0.374065 -0.210852 0.903104
+vn -0.374065 0.210852 0.903104
+vn 0.372997 -0.223518 0.900479
+vn 0.372997 0.223487 0.900479
+vn 0.372997 0.223518 0.900479
+vn -0.543046 -0.210883 0.812769
+vn -0.543046 0.210883 0.812769
+vn 0.541490 -0.223518 0.810419
+vn 0.541490 0.223518 0.810419
+vn -0.691183 -0.210883 0.691183
+vn -0.691183 0.210852 0.691183
+vn 0.689200 -0.223518 0.689200
+vn 0.689200 0.223518 0.689200
+vn -0.812769 -0.210883 0.543046
+vn -0.812769 0.210883 0.543046
+vn 0.810419 -0.223518 0.541490
+vn 0.810419 0.223518 0.541490
+vn -0.903073 -0.210883 0.374065
+vn -0.903073 0.210883 0.374065
+vn 0.900479 -0.223518 0.372997
+vn 0.900479 0.223518 0.372997
+vn -0.958708 -0.210883 0.190680
+vn -0.958708 0.210883 0.190680
+vn 0.955962 -0.223518 0.190130
+vn 0.955962 0.223518 0.190130
+vn -0.977508 -0.210883 0.000000
+vn -0.977508 0.210883 0.000000
+vn 0.974670 -0.223518 0.000000
+vn 0.974670 0.223518 0.000000
+vn -0.958708 -0.210883 -0.190680
+vn -0.958708 0.210883 -0.190680
+vn 0.955962 -0.223518 -0.190130
+vn 0.955962 0.223518 -0.190130
+vn -0.903073 -0.210883 -0.374065
+vn -0.903073 0.210883 -0.374065
+vn 0.900479 -0.223518 -0.372997
+vn 0.900479 0.223518 -0.372997
+vn -0.812738 -0.210883 -0.543046
+vn -0.812738 0.210883 -0.543046
+vn 0.810419 -0.223518 -0.541490
+vn 0.810419 0.223518 -0.541490
+vn -0.691183 -0.210883 -0.691183
+vn -0.691183 0.210883 -0.691183
+vn 0.689200 -0.223518 -0.689200
+vn 0.689200 0.223518 -0.689200
+vn -0.543046 -0.210883 -0.812769
+vn -0.543046 0.210883 -0.812769
+vn 0.541490 -0.223518 -0.810419
+vn 0.541490 0.223518 -0.810419
+vn -0.374065 -0.210883 -0.903073
+vn -0.374065 0.210883 -0.903073
+vn 0.372997 -0.223518 -0.900479
+vn 0.372997 0.223518 -0.900479
+vn -0.190680 -0.210883 -0.958708
+vn -0.190680 0.210883 -0.958708
+vn 0.190130 -0.223518 -0.955962
+vn 0.190130 0.223518 -0.955962
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.999969 0.001099
+vn 0.000214 0.999969 0.001068
+vn 0.000397 0.999969 0.001007
+vn 0.000610 0.999969 0.000885
+vn 0.000763 0.999969 0.000763
+vn 0.000885 0.999969 0.000610
+vn 0.001007 0.999969 0.000397
+vn 0.001068 0.999969 0.000214
+vn 0.001099 0.999969 0.000000
+vn 0.001068 0.999969 -0.000214
+vn 0.001007 0.999969 -0.000397
+vn 0.000885 0.999969 -0.000610
+vn 0.000763 0.999969 -0.000763
+vn 0.000610 0.999969 -0.000885
+vn 0.000397 0.999969 -0.001007
+vn 0.000214 0.999969 -0.001068
+vn 0.000000 0.999969 -0.001099
+vn -0.000214 0.999969 -0.001068
+vn -0.000397 0.999969 -0.001007
+vn -0.000610 0.999969 -0.000885
+vn -0.000763 0.999969 -0.000763
+vn -0.000885 0.999969 -0.000610
+vn -0.001007 0.999969 -0.000397
+vn -0.001068 0.999969 -0.000214
+vn -0.001099 0.999969 0.000000
+vn -0.001068 0.999969 0.000214
+vn -0.001007 0.999969 0.000397
+vn -0.000885 0.999969 0.000610
+vn -0.000763 0.999969 0.000763
+vn -0.000610 0.999969 0.000885
+vn -0.000397 0.999969 0.001007
+vn -0.000214 0.999969 0.001068
+vn -0.990387 -0.138310 0.000000
+vn -0.550218 -0.138279 0.823450
+vn 0.000000 -0.223487 0.974700
+s 1
+f 1/1/1 32/2/2 33/3/3
+f 2/4/4 1/1/1 33/3/3
+f 3/5/5 2/4/4 33/3/3
+f 4/6/6 3/5/5 33/3/3
+f 5/7/7 4/6/6 33/3/3
+f 6/8/8 5/7/7 33/3/3
+f 7/9/9 6/10/8 33/3/3
+f 8/11/10 7/9/9 33/3/3
+f 9/12/11 8/11/10 33/3/3
+f 10/13/12 9/12/11 33/3/3
+f 11/14/13 10/13/12 33/3/3
+f 12/15/14 11/14/13 33/3/3
+f 13/16/15 12/15/14 33/3/3
+f 14/17/16 13/16/15 33/3/3
+f 15/18/17 14/17/16 33/3/3
+f 16/19/18 15/18/17 33/3/3
+f 17/20/19 16/19/18 33/3/3
+f 18/21/20 17/20/19 33/3/3
+f 19/22/21 18/21/20 33/3/3
+f 20/23/22 19/22/21 33/3/3
+f 21/24/23 20/23/22 33/3/3
+f 22/25/24 21/24/23 33/3/3
+f 23/26/25 22/25/24 33/3/3
+f 24/27/26 23/26/25 33/3/3
+f 25/28/27 24/27/26 33/3/3
+f 26/29/28 25/28/27 33/3/3
+f 27/30/29 26/29/28 33/3/3
+f 28/31/30 27/30/29 33/3/3
+f 29/32/31 28/31/30 33/3/3
+f 30/33/32 29/32/31 33/3/3
+f 31/34/33 30/33/32 33/3/3
+f 33/3/3 32/2/2 31/34/33
+f 1381/35/34 1442/36/35 1446/37/34
+f 1505/38/36 1441/39/36 1443/40/37
+f 1442/36/35 1440/41/38 1506/42/35
+f 1503/43/39 1439/44/39 1505/38/36
+f 1440/41/38 1438/45/40 1504/46/38
+f 1501/47/41 1437/48/41 1503/43/39
+f 1438/45/40 1436/49/42 1502/50/40
+f 1499/51/43 1435/52/43 1501/47/41
+f 1436/49/42 1434/53/44 1500/54/42
+f 1497/55/45 1433/56/45 1499/51/43
+f 1434/53/44 1432/57/46 1498/58/44
+f 1495/59/47 1431/60/47 1497/55/45
+f 1432/61/46 1430/62/48 1496/63/46
+f 1493/64/49 1429/65/49 1495/66/47
+f 1430/62/48 1428/67/50 1494/68/48
+f 1491/69/51 1427/70/51 1429/65/49
+f 1428/67/50 1426/71/52 1492/72/50
+f 1489/73/53 1425/74/53 1491/69/51
+f 1426/71/52 1424/75/54 1490/76/52
+f 1487/77/55 1423/78/55 1489/73/53
+f 1424/75/54 1422/79/56 1488/80/54
+f 1485/81/57 1421/82/57 1487/77/55
+f 1422/79/56 1420/83/58 1486/84/56
+f 1483/85/59 1419/86/59 1485/81/57
+f 1420/83/58 1418/87/60 1482/88/60
+f 1481/89/61 1417/90/61 1419/86/59
+f 1418/87/60 1416/91/62 1482/88/60
+f 1479/92/63 1415/93/63 1481/89/61
+f 1416/91/62 1414/94/64 1480/95/62
+f 1477/96/65 1413/97/65 1479/92/63
+f 1414/94/64 1412/98/66 1478/99/64
+f 1475/100/67 1411/101/67 1477/96/65
+f 1412/98/66 1410/102/68 1474/103/68
+f 1473/104/69 1409/105/69 1411/101/67
+f 1410/102/68 1408/106/70 1472/107/70
+f 1471/108/71 1407/109/71 1409/105/69
+f 1408/106/70 1406/110/72 1470/111/72
+f 1469/112/73 1405/113/73 1407/109/71
+f 1406/110/72 1404/114/74 1468/115/74
+f 1467/116/75 1403/117/75 1405/113/73
+f 1404/114/74 1402/118/76 1466/119/76
+f 1465/120/77 1401/121/77 1403/117/75
+f 1402/118/76 1400/122/78 1464/123/78
+f 1463/124/79 1399/125/79 1401/121/77
+f 1400/122/78 1398/126/80 1462/127/80
+f 1461/128/81 1397/129/81 1399/125/79
+f 1398/126/80 1396/130/82 1460/131/82
+f 1459/132/83 1395/133/83 1397/129/81
+f 1396/130/82 1394/134/84 1460/131/82
+f 1457/135/85 1393/136/85 1395/133/83
+f 1394/134/84 1392/137/86 1456/138/86
+f 1455/139/87 1391/140/87 1393/136/85
+f 1392/137/86 1390/141/88 1454/142/88
+f 1453/143/89 1389/144/89 1391/140/87
+f 1390/141/88 1388/145/90 1452/146/90
+f 1451/147/91 1387/148/91 1389/144/89
+f 1388/145/90 1386/149/92 1450/150/92
+f 1449/151/93 1385/152/93 1387/148/91
+f 1386/149/92 1384/153/94 1448/154/94
+f 1447/155/95 1383/156/95 1385/152/93
+f 1384/153/94 1382/157/96 1445/158/96
+f 1444/159/97 1380/160/97 1447/155/95
+f 1382/157/96 1381/35/34 1446/37/34
+f 1443/40/37 1379/161/37 1380/160/97
+f 98/162/98 35/163/98 99/164/99
+f 37/165/100 36/166/101 101/167/100
+f 99/164/99 34/168/99 102/169/102
+f 39/170/103 37/165/100 103/171/103
+f 102/169/102 38/172/104 104/173/105
+f 41/174/106 39/170/103 105/175/106
+f 104/173/105 40/176/105 106/177/107
+f 43/178/108 41/174/106 107/179/108
+f 106/177/107 42/180/107 108/181/109
+f 45/182/110 43/178/108 109/183/110
+f 108/181/109 44/184/109 110/185/111
+f 47/186/112 45/182/110 111/187/112
+f 110/185/111 46/188/111 112/189/113
+f 49/190/114 47/186/112 113/191/114
+f 112/189/113 48/192/113 114/193/115
+f 51/194/116 49/190/114 115/195/116
+f 114/193/115 50/196/115 116/197/117
+f 53/198/118 51/194/116 117/199/118
+f 116/197/117 52/200/117 118/201/119
+f 55/202/120 53/198/118 119/203/120
+f 118/201/119 54/204/119 120/205/121
+f 57/206/122 55/202/120 121/207/122
+f 120/205/121 56/208/121 122/209/123
+f 59/210/124 57/206/122 123/211/124
+f 122/209/123 58/212/123 124/213/125
+f 61/214/126 59/210/124 125/215/126
+f 124/213/125 60/216/125 126/217/127
+f 63/218/128 61/214/126 127/219/128
+f 126/217/127 62/220/127 64/221/129
+f 65/222/130 63/218/128 127/219/128
+f 128/223/129 64/221/129 66/224/131
+f 67/225/132 65/222/130 129/226/130
+f 130/227/131 66/224/131 132/228/133
+f 69/229/134 67/225/132 133/230/134
+f 132/228/133 68/231/133 134/232/135
+f 71/233/136 69/229/134 135/234/136
+f 134/232/135 70/235/137 136/236/138
+f 73/237/139 71/233/136 137/238/139
+f 136/236/138 72/239/138 138/240/140
+f 75/241/141 73/237/139 139/242/141
+f 138/240/140 74/243/140 140/244/142
+f 77/245/143 75/241/141 141/246/143
+f 140/244/142 76/247/142 142/248/144
+f 79/249/145 77/245/143 143/250/145
+f 142/248/144 78/251/144 144/252/146
+f 81/253/147 79/249/145 145/254/147
+f 144/252/146 80/255/146 146/256/148
+f 83/257/149 81/253/147 147/258/149
+f 146/256/148 82/259/148 148/260/150
+f 85/261/151 83/257/149 149/262/151
+f 148/260/150 84/263/150 150/264/152
+f 87/265/153 85/261/151 151/266/153
+f 150/267/152 86/268/152 152/269/154
+f 89/270/155 87/271/153 153/272/155
+f 152/269/154 88/273/154 154/274/156
+f 91/275/157 89/270/155 155/276/157
+f 154/274/156 90/277/156 156/278/158
+f 93/279/159 91/275/157 157/280/159
+f 156/278/158 92/281/158 158/282/160
+f 95/283/161 93/279/159 159/284/162
+f 158/282/160 94/285/163 160/286/164
+f 97/287/165 95/283/161 161/288/166
+f 160/286/164 96/289/167 98/162/98
+f 36/166/101 97/287/165 100/290/101
+f 1253/291/168 1314/292/169 1318/293/168
+f 1377/294/170 1313/295/170 1315/296/171
+f 1314/292/169 1312/297/172 1378/298/169
+f 1375/299/173 1311/300/173 1377/294/170
+f 1312/297/172 1310/301/174 1376/302/175
+f 1373/303/176 1309/304/176 1375/299/173
+f 1310/301/174 1308/305/177 1374/306/174
+f 1371/307/178 1307/308/178 1373/303/176
+f 1308/305/177 1306/309/179 1372/310/177
+f 1369/311/180 1305/312/181 1371/307/178
+f 1306/309/179 1304/313/182 1368/314/182
+f 1367/315/183 1303/316/183 1369/311/180
+f 1304/317/182 1302/318/184 1368/319/182
+f 1365/320/185 1301/321/185 1303/322/183
+f 1302/318/184 1300/323/186 1366/324/184
+f 1363/325/187 1299/326/188 1365/320/185
+f 1300/323/186 1298/327/189 1362/328/189
+f 1361/329/190 1297/330/191 1299/326/188
+f 1298/327/189 1296/331/192 1362/328/189
+f 1359/332/193 1295/333/193 1361/329/190
+f 1296/331/192 1294/334/194 1360/335/192
+f 1357/336/195 1293/337/195 1295/333/193
+f 1294/334/194 1292/338/196 1358/339/194
+f 1355/340/197 1291/341/197 1357/336/195
+f 1292/338/196 1290/342/198 1356/343/196
+f 1353/344/199 1289/345/199 1355/340/197
+f 1290/342/198 1288/346/200 1352/347/200
+f 1351/348/201 1287/349/201 1289/345/199
+f 1288/346/200 1286/350/202 1352/347/200
+f 1349/351/203 1285/352/204 1351/348/201
+f 1286/350/202 1284/353/205 1348/354/205
+f 1347/355/206 1283/356/206 1285/352/204
+f 1284/353/205 1282/357/207 1346/358/207
+f 1345/359/208 1281/360/209 1283/356/206
+f 1282/357/207 1280/361/210 1344/362/210
+f 1343/363/211 1279/364/211 1281/360/209
+f 1280/361/210 1278/365/212 1344/362/210
+f 1341/366/213 1277/367/213 1343/363/211
+f 1278/365/212 1276/368/214 1340/369/214
+f 1339/370/215 1275/371/215 1277/367/213
+f 1276/368/214 1274/372/216 1340/369/214
+f 1337/373/217 1273/374/217 1339/370/215
+f 1274/372/216 1272/375/218 1338/376/216
+f 1335/377/219 1271/378/219 1337/373/217
+f 1272/375/218 1270/379/220 1336/380/221
+f 1333/381/222 1269/382/222 1335/377/219
+f 1270/379/220 1268/383/223 1332/384/223
+f 1331/385/224 1267/386/224 1269/382/222
+f 1268/383/223 1266/387/225 1330/388/225
+f 1329/389/226 1265/390/226 1267/386/224
+f 1266/387/225 1264/391/227 1330/388/225
+f 1327/392/228 1263/393/228 1265/390/226
+f 1264/391/227 1262/394/229 1328/395/227
+f 1325/396/230 1261/397/231 1327/392/228
+f 1262/394/229 1260/398/232 1326/399/233
+f 1323/400/234 1259/401/234 1325/396/230
+f 1260/398/232 1258/402/235 1322/403/235
+f 1321/404/236 1257/405/236 1259/401/234
+f 1258/402/235 1256/406/237 1320/407/237
+f 1319/408/238 1255/409/238 1257/405/236
+f 1256/406/237 1254/410/239 1317/411/239
+f 1316/412/240 1252/413/240 1255/409/238
+f 1254/410/239 1253/291/168 1317/411/239
+f 1315/296/171 1251/414/241 1316/412/240
+f 1097/415/242 1218/416/243 1219/417/244
+f 1250/418/245 1216/419/246 1219/417/244
+f 1218/416/243 1214/420/247 1250/418/245
+f 1249/421/248 1212/422/249 1250/418/245
+f 1214/420/247 1210/423/250 1249/421/248
+f 1248/424/251 1208/425/252 1249/421/248
+f 1210/423/250 1206/426/253 1248/424/251
+f 1247/427/254 1204/428/255 1248/424/251
+f 1206/426/253 1202/429/256 1247/427/254
+f 1246/430/257 1200/431/258 1247/427/254
+f 1202/429/256 1198/432/259 1246/430/257
+f 1245/433/260 1196/434/261 1246/430/257
+f 1198/435/259 1194/436/262 1245/437/260
+f 1244/438/263 1192/439/264 1245/437/260
+f 1194/436/262 1190/440/265 1244/438/263
+f 1243/441/266 1188/442/267 1244/438/263
+f 1190/440/265 1186/443/268 1243/441/266
+f 1242/444/269 1184/445/270 1243/441/266
+f 1186/443/268 1182/446/271 1241/447/272
+f 1241/447/272 1180/448/273 1242/444/269
+f 1182/446/271 1178/449/274 1241/447/272
+f 1240/450/275 1176/451/276 1241/447/272
+f 1178/449/274 1174/452/277 1240/450/275
+f 1239/453/278 1172/454/279 1240/450/275
+f 1174/452/277 1170/455/280 1239/453/278
+f 1238/456/281 1168/457/282 1239/453/278
+f 1170/455/280 1166/458/283 1238/456/281
+f 1237/459/284 1164/460/285 1238/456/281
+f 1166/458/283 1162/461/286 1237/459/284
+f 1236/462/287 1160/463/288 1237/459/284
+f 1162/461/286 1158/464/289 1236/462/287
+f 1235/465/290 1156/466/291 1236/462/287
+f 1158/464/289 1154/467/292 1234/468/293
+f 1234/468/293 1152/469/294 1156/466/291
+f 1154/467/292 1150/470/295 1233/471/296
+f 1233/471/296 1148/472/297 1152/469/294
+f 1150/470/295 1146/473/298 1232/474/299
+f 1232/474/299 1144/475/300 1148/472/297
+f 1146/473/298 1142/476/301 1231/477/302
+f 1231/477/302 1140/478/303 1144/475/300
+f 1142/476/301 1138/479/304 1230/480/305
+f 1230/480/305 1136/481/306 1140/478/303
+f 1138/479/304 1134/482/307 1229/483/308
+f 1229/483/308 1132/484/309 1136/481/306
+f 1134/482/307 1130/485/310 1228/486/311
+f 1228/486/311 1128/487/312 1132/484/309
+f 1130/485/310 1126/488/313 1227/489/314
+f 1227/489/314 1124/490/315 1128/487/312
+f 1126/488/313 1122/491/316 1226/492/317
+f 1226/492/317 1120/493/318 1124/490/315
+f 1122/491/316 1118/494/319 1225/495/320
+f 1225/495/320 1116/496/321 1120/493/318
+f 1118/494/319 1114/497/322 1224/498/323
+f 1224/498/323 1112/499/324 1116/496/321
+f 1114/497/322 1110/500/325 1223/501/326
+f 1223/501/326 1108/502/327 1112/499/324
+f 1110/500/325 1106/503/328 1222/504/329
+f 1222/504/329 1104/505/330 1108/502/327
+f 1106/503/328 1102/506/331 1221/507/332
+f 1221/507/332 1100/508/333 1104/505/330
+f 1102/506/331 1098/509/334 1220/510/335
+f 1220/510/335 1094/511/336 1100/508/333
+f 1098/509/334 1097/415/242 1219/417/244
+f 1219/417/244 1091/512/337 1094/511/336
+f 1096/513/338 1217/514/339 1097/415/242
+f 1216/419/246 1215/515/340 1091/512/337
+f 1217/514/339 1213/516/341 1218/416/243
+f 1212/422/249 1211/517/342 1216/419/246
+f 1213/516/341 1209/518/343 1214/420/247
+f 1208/425/252 1207/519/344 1212/422/249
+f 1209/518/343 1205/520/345 1210/423/250
+f 1204/428/255 1203/521/346 1208/425/252
+f 1205/520/345 1201/522/347 1206/426/253
+f 1200/431/258 1199/523/348 1204/428/255
+f 1201/522/347 1197/524/349 1202/429/256
+f 1196/434/261 1195/525/350 1200/431/258
+f 1197/526/349 1193/527/351 1198/435/259
+f 1192/439/264 1191/528/352 1196/529/261
+f 1193/527/351 1189/530/353 1194/436/262
+f 1188/442/267 1187/531/354 1191/528/352
+f 1189/530/353 1185/532/355 1190/440/265
+f 1184/445/270 1183/533/356 1188/442/267
+f 1185/532/355 1181/534/357 1186/443/268
+f 1180/448/273 1179/535/358 1184/445/270
+f 1181/534/357 1177/536/359 1178/449/274
+f 1176/451/276 1175/537/360 1179/535/358
+f 1177/536/359 1173/538/361 1174/452/277
+f 1172/454/279 1171/539/362 1175/537/360
+f 1173/538/361 1169/540/363 1170/455/280
+f 1168/457/282 1167/541/364 1171/539/362
+f 1169/540/363 1165/542/365 1170/455/280
+f 1164/460/285 1163/543/366 1168/457/282
+f 1165/542/365 1161/544/367 1166/458/283
+f 1160/463/288 1159/545/368 1164/460/285
+f 1161/544/367 1157/546/369 1162/461/286
+f 1156/466/291 1155/547/370 1160/463/288
+f 1157/546/369 1153/548/371 1154/467/292
+f 1152/469/294 1151/549/372 1155/547/370
+f 1153/548/371 1149/550/373 1150/470/295
+f 1148/472/297 1147/551/374 1151/549/372
+f 1149/550/373 1145/552/375 1146/473/298
+f 1144/475/300 1143/553/376 1148/472/297
+f 1145/552/375 1141/554/377 1146/473/298
+f 1140/478/303 1139/555/378 1144/475/300
+f 1141/554/377 1137/556/379 1138/479/304
+f 1136/481/306 1135/557/380 1139/555/378
+f 1137/556/379 1133/558/381 1134/482/307
+f 1132/484/309 1131/559/382 1135/557/380
+f 1133/558/381 1129/560/383 1130/485/310
+f 1128/487/312 1127/561/384 1131/559/382
+f 1129/560/383 1125/562/385 1126/488/313
+f 1124/490/315 1123/563/386 1127/561/384
+f 1125/562/385 1121/564/387 1122/491/316
+f 1120/493/318 1119/565/388 1123/563/386
+f 1121/564/387 1117/566/389 1118/494/319
+f 1116/496/321 1115/567/390 1119/565/388
+f 1117/566/389 1113/568/391 1118/494/319
+f 1112/499/324 1111/569/392 1116/496/321
+f 1113/568/391 1109/570/393 1110/500/325
+f 1108/502/327 1107/571/394 1112/499/324
+f 1109/570/393 1105/572/395 1106/503/328
+f 1104/505/330 1103/573/396 1107/571/394
+f 1105/572/395 1101/574/397 1102/506/331
+f 1100/508/333 1099/575/398 1103/573/396
+f 1101/574/397 1095/576/399 1098/509/334
+f 1094/511/336 1093/577/400 1099/575/398
+f 1095/576/399 1096/513/338 1097/415/242
+f 1091/512/337 1092/578/401 1093/577/400
+f 968/579/402 1089/580/403 969/581/402
+f 1088/582/404 1087/583/404 963/584/405
+f 1089/580/403 1085/585/406 1090/586/403
+f 1084/587/407 1083/588/407 1088/582/404
+f 1085/585/406 1081/589/408 1086/590/406
+f 1080/591/409 1079/592/409 1084/587/407
+f 1081/589/408 1077/593/410 1082/594/408
+f 1076/595/411 1075/596/411 1080/591/409
+f 1077/593/410 1073/597/412 1078/598/410
+f 1072/599/413 1071/600/413 1076/595/411
+f 1073/597/412 1069/601/414 1074/602/412
+f 1068/603/415 1067/604/415 1072/599/413
+f 1069/605/414 1065/606/416 1070/607/414
+f 1064/608/417 1063/609/417 1068/610/415
+f 1065/606/416 1061/611/418 1066/612/416
+f 1060/613/419 1059/614/419 1064/608/417
+f 1061/611/418 1057/615/420 1062/616/418
+f 1056/617/421 1055/618/421 1060/613/419
+f 1057/615/420 1053/619/422 1058/620/420
+f 1052/621/423 1051/622/423 1056/617/421
+f 1053/619/422 1049/623/424 1054/624/422
+f 1048/625/425 1047/626/425 1052/621/423
+f 1049/623/424 1045/627/426 1046/628/426
+f 1044/629/427 1043/630/427 1048/625/425
+f 1045/627/426 1041/631/428 1046/628/426
+f 1040/632/429 1039/633/429 1044/629/427
+f 1041/631/428 1037/634/430 1042/635/428
+f 1036/636/431 1035/637/431 1040/632/429
+f 1037/634/430 1033/638/432 1038/639/430
+f 1032/640/433 1031/641/433 1036/636/431
+f 1033/638/432 1029/642/434 1034/643/432
+f 1028/644/435 1027/645/435 1032/640/433
+f 1029/642/434 1025/646/436 1026/647/436
+f 1024/648/437 1023/649/437 1027/645/435
+f 1025/646/436 1021/650/438 1022/651/438
+f 1020/652/439 1019/653/439 1023/649/437
+f 1021/650/438 1017/654/440 1018/655/440
+f 1016/656/441 1015/657/441 1020/652/439
+f 1017/654/440 1013/658/442 1018/655/440
+f 1012/659/443 1011/660/443 1015/657/441
+f 1013/658/442 1009/661/444 1010/662/444
+f 1008/663/445 1007/664/445 1011/660/443
+f 1009/661/444 1005/665/446 1006/666/446
+f 1004/667/447 1003/668/447 1007/664/445
+f 1005/665/446 1001/669/448 1006/666/446
+f 1000/670/449 999/671/449 1004/667/447
+f 1001/669/448 997/672/450 1002/673/448
+f 996/674/451 995/675/451 1000/670/449
+f 997/672/450 993/676/452 998/677/450
+f 992/678/453 991/679/453 995/675/451
+f 993/676/452 989/680/454 990/681/454
+f 988/682/455 987/683/455 991/679/453
+f 989/680/454 985/684/456 986/685/456
+f 984/686/457 983/687/457 987/683/455
+f 985/684/456 981/688/458 982/689/458
+f 980/690/459 979/691/459 984/686/457
+f 981/688/458 977/692/460 978/693/460
+f 976/694/461 975/695/461 979/691/459
+f 977/692/460 973/696/462 974/697/462
+f 972/698/463 971/699/463 975/695/461
+f 973/696/462 967/700/464 974/697/462
+f 966/701/465 965/702/465 972/698/463
+f 967/700/464 968/579/402 969/581/402
+f 963/584/405 964/703/405 966/701/465
+f 514/414/466 162/704/466 515/413/467
+f 165/705/468 164/706/469 517/410/468
+f 515/413/467 163/707/467 518/409/470
+f 167/708/471 165/705/468 519/406/472
+f 518/409/470 166/709/470 520/405/473
+f 169/710/474 167/708/471 521/402/475
+f 520/405/473 168/711/476 170/712/477
+f 171/713/478 169/710/474 521/402/475
+f 522/401/477 170/712/477 524/397/479
+f 173/714/480 171/713/478 525/394/480
+f 524/397/479 172/715/481 526/393/482
+f 175/716/483 173/714/480 527/391/483
+f 526/393/482 174/717/482 176/718/484
+f 177/719/485 175/716/483 529/387/485
+f 528/390/484 176/718/484 178/720/486
+f 179/721/487 177/719/485 529/387/485
+f 530/386/486 178/720/486 180/722/488
+f 181/723/489 179/721/487 531/383/487
+f 532/382/488 180/722/488 182/724/490
+f 183/725/491 181/723/489 533/379/489
+f 534/378/490 182/724/490 184/726/492
+f 185/727/493 183/725/491 535/375/491
+f 536/374/492 184/726/492 186/728/494
+f 187/729/495 185/727/493 537/372/493
+f 538/371/494 186/728/494 188/730/496
+f 189/731/497 187/729/495 539/368/495
+f 540/367/496 188/730/496 190/732/498
+f 191/733/499 189/731/497 541/365/497
+f 542/364/498 190/732/498 192/734/500
+f 193/735/501 191/733/499 543/361/499
+f 544/360/500 192/734/500 194/736/502
+f 195/737/503 193/735/501 545/357/501
+f 546/356/502 194/736/502 548/352/504
+f 197/738/505 195/737/503 549/350/505
+f 548/352/504 196/739/504 198/740/506
+f 199/741/507 197/738/505 551/346/508
+f 550/349/506 198/740/506 200/742/509
+f 201/743/510 199/741/507 551/346/508
+f 552/345/509 200/742/509 554/341/511
+f 203/744/512 201/743/510 555/338/512
+f 554/341/511 202/745/511 556/337/513
+f 205/746/514 203/744/512 557/334/514
+f 556/337/513 204/747/513 558/333/515
+f 207/748/516 205/746/514 559/331/516
+f 558/333/515 206/749/515 560/330/517
+f 209/750/518 207/748/516 561/327/518
+f 560/330/517 208/751/517 562/326/519
+f 211/752/520 209/750/518 563/323/520
+f 562/326/519 210/753/519 564/321/521
+f 213/754/522 211/752/520 565/318/522
+f 564/321/521 212/755/521 566/322/523
+f 215/756/524 213/754/522 567/317/525
+f 566/316/523 214/757/523 568/312/526
+f 217/758/527 215/759/524 569/309/527
+f 568/312/526 216/760/526 570/308/528
+f 219/761/529 217/758/527 571/305/529
+f 570/308/528 218/762/528 572/304/530
+f 221/763/531 219/761/529 573/301/531
+f 572/304/530 220/764/530 574/300/532
+f 223/765/533 221/763/531 575/297/533
+f 574/300/532 222/766/532 576/295/534
+f 225/767/535 223/765/533 577/292/535
+f 576/295/534 224/768/534 514/414/466
+f 164/706/469 225/767/535 516/291/469
+f 227/703/536 578/296/536 228/702/537
+f 580/411/538 581/293/539 231/579/539
+f 837/769/540 898/770/541 901/706/540
+f 961/768/542 897/771/542 899/704/543
+f 228/702/537 579/412/537 582/408/544
+f 583/407/545 580/411/538 230/700/538
+f 898/770/541 896/772/546 962/767/541
+f 959/766/547 895/773/548 961/768/542
+f 234/699/544 582/408/544 238/695/549
+f 585/403/550 583/407/545 240/692/550
+f 896/772/546 894/774/551 960/765/546
+f 957/764/552 893/775/552 959/766/547
+f 238/695/549 584/404/549 242/691/553
+f 587/776/554 585/403/550 244/688/554
+f 894/774/551 892/777/555 958/763/551
+f 955/762/556 891/778/556 957/764/552
+f 242/691/553 586/400/553 588/396/557
+f 589/399/558 587/776/554 244/688/554
+f 892/777/555 890/779/559 956/761/555
+f 953/760/560 889/780/560 955/762/556
+f 246/687/557 588/396/557 250/683/561
+f 591/395/562 589/399/558 252/680/562
+f 890/779/559 888/781/563 954/758/559
+f 951/757/564 887/782/564 953/760/560
+f 250/683/561 590/392/561 254/679/565
+f 593/388/566 591/395/562 256/676/566
+f 888/783/563 886/784/567 952/756/563
+f 949/755/568 885/785/568 951/786/564
+f 254/679/565 592/389/565 258/675/569
+f 595/384/570 593/388/566 260/672/570
+f 886/784/567 884/787/571 950/754/567
+f 947/753/572 883/788/572 949/755/568
+f 258/675/569 594/385/569 596/381/573
+f 597/789/574 595/384/570 260/672/570
+f 884/787/571 882/790/575 948/752/571
+f 945/751/576 881/791/576 947/753/572
+f 262/671/573 596/381/573 266/668/577
+f 599/380/578 597/789/574 264/669/574
+f 882/790/575 880/792/579 946/750/575
+f 943/749/580 879/793/580 945/751/576
+f 266/668/577 598/377/577 270/664/581
+f 601/376/582 599/380/578 268/665/578
+f 880/792/579 878/794/583 944/748/579
+f 941/747/584 877/795/584 943/749/580
+f 270/664/581 600/373/581 602/370/585
+f 603/369/586 601/376/582 272/661/582
+f 878/794/583 876/796/587 942/746/583
+f 939/745/588 875/797/588 941/747/584
+f 274/660/585 602/370/585 604/366/589
+f 605/798/590 603/369/586 276/658/586
+f 876/796/587 874/799/591 940/744/587
+f 937/742/592 873/800/592 939/745/588
+f 278/657/589 604/366/589 606/363/593
+f 607/362/594 605/798/590 280/654/590
+f 874/799/591 872/801/595 938/743/591
+f 935/740/596 871/802/596 937/742/592
+f 282/653/593 606/363/593 286/649/597
+f 609/358/598 607/362/594 288/646/598
+f 872/801/595 870/803/599 936/741/595
+f 933/739/600 869/804/600 935/740/596
+f 286/649/597 608/359/597 290/645/601
+f 611/354/602 609/358/598 292/642/602
+f 870/803/599 868/805/603 934/738/599
+f 931/736/604 867/806/604 933/739/600
+f 290/645/601 610/355/601 294/641/605
+f 613/807/606 611/354/602 296/638/606
+f 868/805/603 866/808/607 930/735/607
+f 929/734/608 865/809/608 867/806/604
+f 294/641/605 612/351/605 298/637/609
+f 615/347/610 613/807/606 300/634/610
+f 866/808/607 864/810/611 928/733/611
+f 927/732/612 863/811/612 865/809/608
+f 298/637/609 614/348/609 302/633/613
+f 617/812/614 615/347/610 304/631/614
+f 864/810/611 862/813/615 926/731/615
+f 925/730/616 861/814/616 863/811/612
+f 302/633/613 616/344/613 306/630/617
+f 619/343/618 617/812/614 308/627/618
+f 862/813/615 860/815/619 924/729/619
+f 923/728/620 859/816/620 861/814/616
+f 306/630/617 618/340/617 310/626/621
+f 621/339/622 619/343/618 312/623/622
+f 860/815/619 858/817/623 922/727/623
+f 921/726/624 857/818/624 923/728/620
+f 310/626/621 620/336/621 314/622/625
+f 623/335/626 621/339/622 316/619/626
+f 858/817/623 856/819/627 922/727/623
+f 919/724/628 855/820/628 921/726/624
+f 314/622/625 622/332/625 318/618/629
+f 625/328/630 623/335/626 320/615/630
+f 856/819/627 854/821/631 920/725/627
+f 917/722/632 853/822/632 919/724/628
+f 318/618/629 624/329/629 322/614/633
+f 627/823/634 625/328/630 324/611/634
+f 854/821/631 852/824/635 918/723/631
+f 915/720/636 851/825/636 917/722/632
+f 322/614/633 626/325/633 326/609/637
+f 629/324/638 627/823/634 328/606/638
+f 852/824/635 850/826/639 916/721/635
+f 913/718/640 849/827/640 915/720/636
+f 326/609/637 628/320/637 630/828/641
+f 631/319/642 629/324/638 332/605/642
+f 850/826/639 848/829/643 914/719/639
+f 911/717/644 847/830/644 913/718/640
+f 330/604/641 630/315/641 632/311/645
+f 633/831/646 631/314/642 336/597/646
+f 848/829/643 846/832/647 912/716/643
+f 909/715/648 845/833/648 911/717/644
+f 334/600/645 632/311/645 338/596/649
+f 635/310/650 633/831/646 340/593/650
+f 846/832/647 844/834/651 910/714/647
+f 907/712/652 843/835/652 909/715/648
+f 338/596/649 634/307/649 342/592/653
+f 637/306/654 635/310/650 344/589/654
+f 844/834/651 842/836/655 908/713/651
+f 905/711/656 841/837/656 907/712/652
+f 342/592/653 636/303/653 346/588/657
+f 639/302/658 637/306/654 348/585/658
+f 842/836/655 840/838/659 906/710/655
+f 903/709/660 839/839/660 905/711/656
+f 346/588/657 638/299/657 350/583/661
+f 641/298/662 639/302/658 352/580/662
+f 840/838/659 838/840/663 904/708/659
+f 900/707/664 836/841/664 903/709/660
+f 350/583/661 640/294/661 227/703/536
+f 581/293/539 641/298/662 231/579/539
+f 838/840/663 837/769/540 902/705/663
+f 899/704/543 835/842/543 900/707/664
+f 642/161/665 226/584/665 229/701/666
+f 233/843/667 232/844/668 644/35/668
+f 643/160/666 229/701/666 235/698/669
+f 237/845/670 233/843/667 645/157/667
+f 646/156/669 235/698/669 239/694/671
+f 241/846/672 237/845/670 647/153/670
+f 648/152/671 239/694/671 650/148/673
+f 245/847/674 241/846/672 651/145/674
+f 650/148/673 243/690/673 247/686/675
+f 249/848/676 245/847/674 651/145/674
+f 652/144/675 247/686/675 251/682/677
+f 253/849/678 249/848/676 653/141/676
+f 654/140/677 251/682/677 656/136/679
+f 257/850/680 253/849/678 657/134/680
+f 656/136/679 255/678/679 259/674/681
+f 261/851/682 257/850/680 659/130/682
+f 658/133/681 259/674/681 263/670/683
+f 265/852/684 261/851/682 659/130/682
+f 660/129/683 263/670/683 267/667/685
+f 269/853/686 265/852/684 661/126/684
+f 662/125/685 267/667/685 271/663/687
+f 273/854/688 269/853/686 663/122/689
+f 664/121/687 271/663/687 666/117/690
+f 277/855/691 273/854/688 667/114/691
+f 666/117/690 275/659/690 668/113/692
+f 281/856/693 277/855/691 669/110/693
+f 668/113/692 279/656/692 283/652/694
+f 285/857/695 281/856/693 669/110/693
+f 670/109/694 283/652/694 672/105/696
+f 289/858/697 285/857/695 673/102/697
+f 672/105/696 287/648/696 674/101/698
+f 293/859/699 289/858/697 675/98/699
+f 674/101/698 291/644/698 676/97/700
+f 297/860/701 293/859/699 677/94/701
+f 676/97/700 295/640/700 678/93/702
+f 301/861/703 297/860/701 679/91/703
+f 678/93/702 299/636/702 303/632/704
+f 305/862/705 301/861/703 679/91/703
+f 680/90/704 303/632/704 682/86/706
+f 309/863/707 305/862/705 683/83/707
+f 682/86/706 307/629/706 684/82/708
+f 313/864/709 309/863/707 685/79/709
+f 684/82/708 311/625/708 315/621/710
+f 317/865/711 313/864/709 685/79/709
+f 686/78/710 315/621/710 319/617/712
+f 321/866/713 317/865/711 687/75/714
+f 688/74/712 319/617/712 690/70/715
+f 325/867/716 321/866/713 691/67/716
+f 690/70/715 323/613/715 692/65/717
+f 329/868/718 325/867/716 693/62/718
+f 692/65/717 327/608/717 694/869/719
+f 333/870/720 329/868/718 695/61/720
+f 694/60/719 331/603/719 696/56/721
+f 337/871/722 333/872/720 697/53/722
+f 696/56/721 335/599/721 698/52/723
+f 341/873/724 337/871/722 699/49/724
+f 698/52/723 339/595/723 700/48/725
+f 345/874/726 341/873/724 701/45/726
+f 700/48/725 343/591/725 702/44/727
+f 349/875/728 345/874/726 703/41/728
+f 702/44/727 347/587/727 704/39/729
+f 353/876/730 349/875/728 705/36/730
+f 704/39/729 351/582/729 642/161/665
+f 232/844/668 353/876/730 644/35/668
+f 355/877/731 706/40/731 707/159/732
+f 708/158/733 709/37/734 359/513/734
+f 834/287/735 413/166/736 419/1/735
+f 512/878/737 415/163/737 421/879/738
+f 356/880/732 707/159/732 710/155/739
+f 711/154/740 708/158/733 358/576/733
+f 419/1/735 423/4/741 834/287/735
+f 831/285/742 425/881/742 833/289/738
+f 362/882/739 710/155/739 366/883/743
+f 713/150/744 711/154/740 368/572/745
+f 423/4/741 427/5/746 832/283/741
+f 829/281/747 429/884/747 831/285/742
+f 366/883/743 712/151/748 714/147/749
+f 715/146/750 713/150/744 368/572/745
+f 427/5/746 431/6/751 830/279/746
+f 827/277/752 433/885/752 829/281/747
+f 370/886/749 714/147/749 716/143/753
+f 717/142/754 715/146/750 372/570/750
+f 431/6/751 435/7/755 828/275/751
+f 825/273/756 437/887/756 827/277/752
+f 374/888/753 716/143/753 718/139/757
+f 719/138/758 717/142/754 376/568/754
+f 435/7/755 439/8/759 826/270/755
+f 823/268/760 441/889/761 825/273/756
+f 378/890/757 718/139/757 382/891/762
+f 721/892/763 719/138/758 380/566/758
+f 439/10/759 443/9/764 824/265/765
+f 821/263/766 445/893/766 823/894/760
+f 382/891/762 720/135/762 722/132/767
+f 723/131/768 721/892/763 388/562/768
+f 443/9/764 447/11/769 822/261/764
+f 819/259/770 449/895/771 821/263/766
+f 386/896/767 722/132/767 390/897/772
+f 725/127/773 723/131/768 392/560/773
+f 447/11/769 451/12/774 820/257/769
+f 817/255/775 453/898/775 819/259/770
+f 390/897/772 724/128/772 726/124/776
+f 727/123/777 725/127/773 392/560/773
+f 451/12/774 455/13/778 818/253/774
+f 815/251/779 457/899/779 817/255/775
+f 394/900/776 726/124/776 398/901/780
+f 729/119/781 727/123/777 400/556/781
+f 455/13/778 459/14/782 816/249/778
+f 813/247/783 461/902/783 815/251/779
+f 398/901/780 728/120/780 402/903/784
+f 731/115/785 729/119/781 404/554/785
+f 459/14/782 463/15/786 814/245/782
+f 811/243/787 465/904/787 813/247/783
+f 402/903/784 730/116/784 732/112/788
+f 733/111/789 731/115/785 404/554/785
+f 463/15/786 467/16/790 812/241/786
+f 809/239/791 469/905/791 811/243/787
+f 406/906/788 732/112/788 734/108/792
+f 735/107/793 733/111/789 408/552/789
+f 467/16/790 471/17/794 810/237/790
+f 807/235/795 473/907/795 809/239/791
+f 410/908/792 734/108/792 414/909/796
+f 737/103/797 735/107/793 416/548/797
+f 471/17/794 475/18/798 808/233/794
+f 805/231/799 477/910/799 807/235/795
+f 414/909/796 736/104/796 738/100/800
+f 739/911/801 737/103/797 420/546/801
+f 475/18/798 479/19/802 806/229/798
+f 803/224/803 481/912/804 805/231/799
+f 418/913/800 738/100/800 422/914/805
+f 741/99/806 739/911/801 424/544/806
+f 479/19/802 482/20/807 354/222/807
+f 357/221/808 483/915/808 481/912/804
+f 422/914/805 740/96/805 426/916/809
+f 743/95/810 741/99/806 428/542/810
+f 482/20/807 484/21/811 360/218/811
+f 361/220/812 485/917/813 483/915/808
+f 426/916/809 742/92/809 430/918/814
+f 745/88/815 743/95/810 432/540/815
+f 484/21/811 486/22/816 363/214/816
+f 365/216/817 487/919/817 485/917/813
+f 430/918/814 744/89/814 434/920/818
+f 747/921/819 745/88/815 436/538/819
+f 486/22/816 488/23/820 367/210/820
+f 369/212/821 489/922/821 487/919/817
+f 434/920/818 746/85/818 438/923/822
+f 749/84/823 747/921/819 440/536/823
+f 488/23/820 490/24/824 367/210/820
+f 373/208/825 491/924/825 369/212/821
+f 438/923/822 748/81/822 442/925/826
+f 751/80/827 749/84/823 444/534/827
+f 490/24/824 492/25/828 371/206/824
+f 377/204/829 493/926/829 373/208/825
+f 442/925/826 750/77/826 446/927/830
+f 753/76/831 751/80/827 448/532/831
+f 492/25/828 494/26/832 375/202/828
+f 381/200/833 495/928/833 377/204/829
+f 446/927/830 752/73/830 450/929/834
+f 755/72/835 753/76/831 448/532/831
+f 494/26/832 496/27/836 379/198/832
+f 385/196/837 497/930/837 381/200/833
+f 450/929/834 754/69/834 454/931/838
+f 757/68/839 755/72/835 456/527/839
+f 496/27/836 498/28/840 383/194/836
+f 389/192/841 499/932/841 385/196/837
+f 454/931/838 756/64/838 458/933/842
+f 759/63/843 757/68/839 460/526/843
+f 498/28/840 500/29/844 387/190/840
+f 393/188/845 501/934/845 389/192/841
+f 458/935/842 758/59/842 462/936/846
+f 761/58/847 759/937/843 464/522/847
+f 500/29/844 502/30/848 391/186/844
+f 397/184/849 503/938/849 393/188/845
+f 462/936/846 760/55/846 762/51/850
+f 763/54/851 761/58/847 464/522/847
+f 502/30/848 504/31/852 395/182/848
+f 401/180/853 505/939/853 397/184/849
+f 466/940/850 762/51/850 470/941/854
+f 765/50/855 763/54/851 472/518/855
+f 504/31/852 506/32/856 399/178/852
+f 405/176/857 507/942/857 401/180/853
+f 470/941/854 764/47/854 474/943/858
+f 767/46/859 765/50/855 476/516/859
+f 506/32/856 508/33/860 403/174/856
+f 409/172/861 509/944/861 405/176/857
+f 474/943/858 766/43/858 478/945/862
+f 769/42/863 767/46/859 480/514/863
+f 508/33/860 510/34/864 407/170/860
+f 417/168/865 513/946/865 409/172/861
+f 478/945/862 768/38/862 355/877/731
+f 709/37/734 769/42/863 359/513/734
+f 510/34/864 511/2/736 411/165/864
+f 513/946/865 417/168/865 512/878/737
+f 800/947/866 801/878/867 770/879/868
+f 800/947/866 770/879/868 771/881/869
+f 800/947/866 771/881/869 772/884/870
+f 800/947/866 772/884/870 773/885/871
+f 800/947/866 773/885/871 774/887/872
+f 800/947/866 774/887/872 775/889/873
+f 800/947/866 775/948/873 776/893/874
+f 800/947/866 776/893/874 777/895/875
+f 800/947/866 777/895/875 778/898/876
+f 800/947/866 778/898/876 779/899/877
+f 800/947/866 779/899/877 780/902/878
+f 800/947/866 780/902/878 781/904/879
+f 800/947/866 781/904/879 782/905/880
+f 800/947/866 782/905/880 783/907/881
+f 800/947/866 783/907/881 784/910/882
+f 800/947/866 784/910/882 785/912/883
+f 800/947/866 785/912/883 786/915/884
+f 800/947/866 786/915/884 787/917/885
+f 800/947/866 787/917/885 788/919/886
+f 800/947/866 788/919/886 789/922/887
+f 800/947/866 789/922/887 790/924/888
+f 800/947/866 790/924/888 791/926/889
+f 800/947/866 791/926/889 792/928/890
+f 800/947/866 792/928/890 793/930/891
+f 800/947/866 793/930/891 794/932/892
+f 800/947/866 794/932/892 795/934/893
+f 800/947/866 795/934/893 796/938/894
+f 800/947/866 796/938/894 797/939/895
+f 800/947/866 797/939/895 798/942/896
+f 800/947/866 798/942/896 799/944/897
+f 799/944/897 802/946/898 800/947/866
+f 802/946/898 801/878/867 800/947/866
+f 1442/36/35 1506/42/35 1446/37/34
+f 1441/39/36 1379/161/37 1443/40/37
+f 1440/41/38 1504/46/38 1506/42/35
+f 1439/44/39 1441/39/36 1505/38/36
+f 1438/45/40 1502/50/40 1504/46/38
+f 1437/48/41 1439/44/39 1503/43/39
+f 1436/49/42 1500/54/42 1502/50/40
+f 1435/52/43 1437/48/41 1501/47/41
+f 1434/53/44 1498/58/44 1500/54/42
+f 1433/56/45 1435/52/43 1499/51/43
+f 1432/57/46 1496/937/46 1498/58/44
+f 1431/60/47 1433/56/45 1497/55/45
+f 1430/62/48 1494/68/48 1496/63/46
+f 1429/65/49 1431/869/47 1495/66/47
+f 1428/67/50 1492/72/50 1494/68/48
+f 1493/64/49 1491/69/51 1429/65/49
+f 1426/71/52 1490/76/52 1492/72/50
+f 1425/74/53 1427/70/51 1491/69/51
+f 1424/75/54 1488/80/54 1490/76/52
+f 1423/78/55 1425/74/53 1489/73/53
+f 1422/79/56 1486/84/56 1488/80/54
+f 1421/82/57 1423/78/55 1487/77/55
+f 1420/83/58 1484/921/58 1486/84/56
+f 1419/86/59 1421/82/57 1485/81/57
+f 1484/921/58 1420/83/58 1482/88/60
+f 1483/85/59 1481/89/61 1419/86/59
+f 1416/91/62 1480/95/62 1482/88/60
+f 1415/93/63 1417/90/61 1481/89/61
+f 1414/94/64 1478/99/64 1480/95/62
+f 1413/97/65 1415/93/63 1479/92/63
+f 1412/98/66 1476/911/66 1478/99/64
+f 1411/101/67 1413/97/65 1477/96/65
+f 1476/911/66 1412/98/66 1474/103/68
+f 1475/100/67 1473/104/69 1411/101/67
+f 1474/103/68 1410/102/68 1472/107/70
+f 1473/104/69 1471/108/71 1409/105/69
+f 1472/107/70 1408/106/70 1470/111/72
+f 1471/108/71 1469/112/73 1407/109/71
+f 1470/111/72 1406/110/72 1468/115/74
+f 1469/112/73 1467/116/75 1405/113/73
+f 1468/115/74 1404/114/74 1466/119/76
+f 1467/116/75 1465/120/77 1403/117/75
+f 1466/119/76 1402/118/76 1464/123/78
+f 1465/120/77 1463/124/79 1401/121/77
+f 1464/123/78 1400/122/78 1462/127/80
+f 1463/124/79 1461/128/81 1399/125/79
+f 1462/127/80 1398/126/80 1460/131/82
+f 1461/128/81 1459/132/83 1397/129/81
+f 1394/134/84 1458/892/84 1460/131/82
+f 1459/132/83 1457/135/85 1395/133/83
+f 1458/892/84 1394/134/84 1456/138/86
+f 1457/135/85 1455/139/87 1393/136/85
+f 1456/138/86 1392/137/86 1454/142/88
+f 1455/139/87 1453/143/89 1391/140/87
+f 1454/142/88 1390/141/88 1452/146/90
+f 1453/143/89 1451/147/91 1389/144/89
+f 1452/146/90 1388/145/90 1450/150/92
+f 1451/147/91 1449/151/93 1387/148/91
+f 1450/150/92 1386/149/92 1448/154/94
+f 1449/151/93 1447/155/95 1385/152/93
+f 1448/154/94 1384/153/94 1445/158/96
+f 1380/160/97 1383/156/95 1447/155/95
+f 1445/158/96 1382/157/96 1446/37/34
+f 1444/159/97 1443/40/37 1380/160/97
+f 35/163/98 34/168/99 99/164/99
+f 36/166/101 100/290/101 101/167/100
+f 34/168/99 38/172/104 102/169/102
+f 37/165/100 101/167/100 103/171/103
+f 38/172/104 40/176/105 104/173/105
+f 39/170/103 103/171/103 105/175/106
+f 40/176/105 42/180/107 106/177/107
+f 41/174/106 105/175/106 107/179/108
+f 42/180/107 44/184/109 108/181/109
+f 43/178/108 107/179/108 109/183/110
+f 44/184/109 46/188/111 110/185/111
+f 45/182/110 109/183/110 111/187/112
+f 46/188/111 48/192/113 112/189/113
+f 47/186/112 111/187/112 113/191/114
+f 48/192/113 50/196/115 114/193/115
+f 49/190/114 113/191/114 115/195/116
+f 50/196/115 52/200/117 116/197/117
+f 51/194/116 115/195/116 117/199/118
+f 52/200/117 54/204/119 118/201/119
+f 53/198/118 117/199/118 119/203/120
+f 54/204/119 56/208/121 120/205/121
+f 55/202/120 119/203/120 121/207/122
+f 56/208/121 58/212/123 122/209/123
+f 57/206/122 121/207/122 123/211/124
+f 58/212/123 60/216/125 124/213/125
+f 59/210/124 123/211/124 125/215/126
+f 60/216/125 62/220/127 126/217/127
+f 61/214/126 125/215/126 127/219/128
+f 128/223/129 126/217/127 64/221/129
+f 129/226/130 65/222/130 127/219/128
+f 130/227/131 128/223/129 66/224/131
+f 131/949/132 67/225/132 129/226/130
+f 66/224/131 68/231/133 132/228/133
+f 67/225/132 131/949/132 133/230/134
+f 68/231/133 70/235/137 134/232/135
+f 69/229/134 133/230/134 135/234/136
+f 70/235/137 72/239/138 136/236/138
+f 71/233/136 135/234/136 137/238/139
+f 72/239/138 74/243/140 138/240/140
+f 73/237/139 137/238/139 139/242/141
+f 74/243/140 76/247/142 140/244/142
+f 75/241/141 139/242/141 141/246/143
+f 76/247/142 78/251/144 142/248/144
+f 77/245/143 141/246/143 143/250/145
+f 78/251/144 80/255/146 144/252/146
+f 79/249/145 143/250/145 145/254/147
+f 80/255/146 82/259/148 146/256/148
+f 81/253/147 145/254/147 147/258/149
+f 82/259/148 84/263/150 148/260/150
+f 83/257/149 147/258/149 149/262/151
+f 84/263/150 86/894/152 150/264/152
+f 85/261/151 149/262/151 151/266/153
+f 86/268/152 88/273/154 152/269/154
+f 87/271/153 151/950/153 153/272/155
+f 88/273/154 90/277/156 154/274/156
+f 89/270/155 153/272/155 155/276/157
+f 90/277/156 92/281/158 156/278/158
+f 91/275/157 155/276/157 157/280/159
+f 92/281/158 94/285/163 158/282/160
+f 93/279/159 157/280/159 159/284/162
+f 94/285/163 96/289/167 160/286/164
+f 95/283/161 159/284/162 161/288/166
+f 96/289/167 35/163/98 98/162/98
+f 97/287/165 161/288/166 100/290/101
+f 1314/292/169 1378/298/169 1318/293/168
+f 1313/295/170 1251/414/241 1315/296/171
+f 1312/297/172 1376/302/175 1378/298/169
+f 1311/300/173 1313/295/170 1377/294/170
+f 1310/301/174 1374/306/174 1376/302/175
+f 1309/304/176 1311/300/173 1375/299/173
+f 1308/305/177 1372/310/177 1374/306/174
+f 1307/308/178 1309/304/176 1373/303/176
+f 1306/309/179 1370/831/179 1372/310/177
+f 1305/312/181 1307/308/178 1371/307/178
+f 1370/831/179 1306/309/179 1368/314/182
+f 1303/316/183 1305/312/181 1369/311/180
+f 1302/318/184 1366/324/184 1368/319/182
+f 1367/828/183 1365/320/185 1303/322/183
+f 1300/323/186 1364/823/899 1366/324/184
+f 1299/326/188 1301/321/185 1365/320/185
+f 1364/823/899 1300/323/186 1362/328/189
+f 1363/325/187 1361/329/190 1299/326/188
+f 1296/331/192 1360/335/192 1362/328/189
+f 1295/333/193 1297/330/191 1361/329/190
+f 1294/334/194 1358/339/194 1360/335/192
+f 1359/332/193 1357/336/195 1295/333/193
+f 1292/338/196 1356/343/196 1358/339/194
+f 1291/341/197 1293/337/195 1357/336/195
+f 1290/342/198 1354/812/900 1356/343/196
+f 1289/345/199 1291/341/197 1355/340/197
+f 1354/812/900 1290/342/198 1352/347/200
+f 1353/344/199 1351/348/201 1289/345/199
+f 1286/350/202 1350/807/202 1352/347/200
+f 1285/352/204 1287/349/201 1351/348/201
+f 1350/807/202 1286/350/202 1348/354/205
+f 1349/351/203 1347/355/206 1285/352/204
+f 1348/354/205 1284/353/205 1346/358/207
+f 1347/355/206 1345/359/208 1283/356/206
+f 1346/358/207 1282/357/207 1344/362/210
+f 1345/359/208 1343/363/211 1281/360/209
+f 1278/365/212 1342/798/212 1344/362/210
+f 1277/367/213 1279/364/211 1343/363/211
+f 1342/798/212 1278/365/212 1340/369/214
+f 1341/366/213 1339/370/215 1277/367/213
+f 1274/372/216 1338/376/216 1340/369/214
+f 1273/374/217 1275/371/215 1339/370/215
+f 1272/375/218 1336/380/221 1338/376/216
+f 1271/378/219 1273/374/217 1337/373/217
+f 1270/379/220 1334/789/220 1336/380/221
+f 1269/382/222 1271/378/219 1335/377/219
+f 1334/789/220 1270/379/220 1332/384/223
+f 1333/381/222 1331/385/224 1269/382/222
+f 1332/384/223 1268/383/223 1330/388/225
+f 1331/385/224 1329/389/226 1267/386/224
+f 1264/391/227 1328/395/227 1330/388/225
+f 1329/389/226 1327/392/228 1265/390/226
+f 1262/394/229 1326/399/233 1328/395/227
+f 1261/397/231 1263/393/228 1327/392/228
+f 1260/398/232 1324/776/232 1326/399/233
+f 1259/401/234 1261/397/231 1325/396/230
+f 1324/776/232 1260/398/232 1322/403/235
+f 1323/400/234 1321/404/236 1259/401/234
+f 1322/403/235 1258/402/235 1320/407/237
+f 1321/404/236 1319/408/238 1257/405/236
+f 1320/407/237 1256/406/237 1317/411/239
+f 1319/408/238 1316/412/240 1255/409/238
+f 1253/291/168 1318/293/168 1317/411/239
+f 1251/414/241 1252/413/240 1316/412/240
+f 1218/416/243 1250/418/245 1219/417/244
+f 1216/419/246 1091/512/337 1219/417/244
+f 1214/420/247 1249/421/248 1250/418/245
+f 1212/422/249 1216/419/246 1250/418/245
+f 1210/423/250 1248/424/251 1249/421/248
+f 1208/425/252 1212/422/249 1249/421/248
+f 1206/426/253 1247/427/254 1248/424/251
+f 1204/428/255 1208/425/252 1248/424/251
+f 1202/429/256 1246/430/257 1247/427/254
+f 1200/431/258 1204/428/255 1247/427/254
+f 1198/432/259 1245/433/260 1246/430/257
+f 1196/434/261 1200/431/258 1246/430/257
+f 1194/436/262 1244/438/263 1245/437/260
+f 1192/439/264 1196/529/261 1245/437/260
+f 1190/440/265 1243/441/266 1244/438/263
+f 1188/442/267 1192/439/264 1244/438/263
+f 1186/443/268 1242/444/269 1243/441/266
+f 1184/445/270 1188/442/267 1243/441/266
+f 1242/444/269 1186/443/268 1241/447/272
+f 1180/448/273 1184/445/270 1242/444/269
+f 1178/449/274 1240/450/275 1241/447/272
+f 1176/451/276 1180/448/273 1241/447/272
+f 1174/452/277 1239/453/278 1240/450/275
+f 1172/454/279 1176/451/276 1240/450/275
+f 1170/455/280 1238/456/281 1239/453/278
+f 1168/457/282 1172/454/279 1239/453/278
+f 1166/458/283 1237/459/284 1238/456/281
+f 1164/460/285 1168/457/282 1238/456/281
+f 1162/461/286 1236/462/287 1237/459/284
+f 1160/463/288 1164/460/285 1237/459/284
+f 1158/464/289 1235/465/290 1236/462/287
+f 1156/466/291 1160/463/288 1236/462/287
+f 1235/465/290 1158/464/289 1234/468/293
+f 1235/465/290 1234/468/293 1156/466/291
+f 1234/468/293 1154/467/292 1233/471/296
+f 1234/468/293 1233/471/296 1152/469/294
+f 1233/471/296 1150/470/295 1232/474/299
+f 1233/471/296 1232/474/299 1148/472/297
+f 1232/474/299 1146/473/298 1231/477/302
+f 1232/474/299 1231/477/302 1144/475/300
+f 1231/477/302 1142/476/301 1230/480/305
+f 1231/477/302 1230/480/305 1140/478/303
+f 1230/480/305 1138/479/304 1229/483/308
+f 1230/480/305 1229/483/308 1136/481/306
+f 1229/483/308 1134/482/307 1228/486/311
+f 1229/483/308 1228/486/311 1132/484/309
+f 1228/486/311 1130/485/310 1227/489/314
+f 1228/486/311 1227/489/314 1128/487/312
+f 1227/489/314 1126/488/313 1226/492/317
+f 1227/489/314 1226/492/317 1124/490/315
+f 1226/492/317 1122/491/316 1225/495/320
+f 1226/492/317 1225/495/320 1120/493/318
+f 1225/495/320 1118/494/319 1224/498/323
+f 1225/495/320 1224/498/323 1116/496/321
+f 1224/498/323 1114/497/322 1223/501/326
+f 1224/498/323 1223/501/326 1112/499/324
+f 1223/501/326 1110/500/325 1222/504/329
+f 1223/501/326 1222/504/329 1108/502/327
+f 1222/504/329 1106/503/328 1221/507/332
+f 1222/504/329 1221/507/332 1104/505/330
+f 1221/507/332 1102/506/331 1220/510/335
+f 1221/507/332 1220/510/335 1100/508/333
+f 1220/510/335 1098/509/334 1219/417/244
+f 1220/510/335 1219/417/244 1094/511/336
+f 1217/514/339 1218/416/243 1097/415/242
+f 1215/515/340 1092/578/401 1091/512/337
+f 1213/516/341 1214/420/247 1218/416/243
+f 1211/517/342 1215/515/340 1216/419/246
+f 1209/518/343 1210/423/250 1214/420/247
+f 1207/519/344 1211/517/342 1212/422/249
+f 1205/520/345 1206/426/253 1210/423/250
+f 1203/521/346 1207/519/344 1208/425/252
+f 1201/522/347 1202/429/256 1206/426/253
+f 1199/523/348 1203/521/346 1204/428/255
+f 1197/524/349 1198/432/259 1202/429/256
+f 1195/525/350 1199/523/348 1200/431/258
+f 1193/527/351 1194/436/262 1198/435/259
+f 1191/528/352 1195/951/350 1196/529/261
+f 1189/530/353 1190/440/265 1194/436/262
+f 1192/439/264 1188/442/267 1191/528/352
+f 1185/532/355 1186/443/268 1190/440/265
+f 1183/533/356 1187/531/354 1188/442/267
+f 1181/534/357 1182/446/271 1186/443/268
+f 1179/535/358 1183/533/356 1184/445/270
+f 1182/446/271 1181/534/357 1178/449/274
+f 1180/448/273 1176/451/276 1179/535/358
+f 1178/449/274 1177/536/359 1174/452/277
+f 1176/451/276 1172/454/279 1175/537/360
+f 1174/452/277 1173/538/361 1170/455/280
+f 1172/454/279 1168/457/282 1171/539/362
+f 1165/542/365 1166/458/283 1170/455/280
+f 1163/543/366 1167/541/364 1168/457/282
+f 1161/544/367 1162/461/286 1166/458/283
+f 1159/545/368 1163/543/366 1164/460/285
+f 1157/546/369 1158/464/289 1162/461/286
+f 1155/547/370 1159/545/368 1160/463/288
+f 1158/464/289 1157/546/369 1154/467/292
+f 1156/466/291 1152/469/294 1155/547/370
+f 1154/467/292 1153/548/371 1150/470/295
+f 1152/469/294 1148/472/297 1151/549/372
+f 1150/470/295 1149/550/373 1146/473/298
+f 1143/553/376 1147/551/374 1148/472/297
+f 1141/554/377 1142/476/301 1146/473/298
+f 1139/555/378 1143/553/376 1144/475/300
+f 1142/476/301 1141/554/377 1138/479/304
+f 1140/478/303 1136/481/306 1139/555/378
+f 1138/479/304 1137/556/379 1134/482/307
+f 1136/481/306 1132/484/309 1135/557/380
+f 1134/482/307 1133/558/381 1130/485/310
+f 1132/484/309 1128/487/312 1131/559/382
+f 1130/485/310 1129/560/383 1126/488/313
+f 1128/487/312 1124/490/315 1127/561/384
+f 1126/488/313 1125/562/385 1122/491/316
+f 1124/490/315 1120/493/318 1123/563/386
+f 1122/491/316 1121/564/387 1118/494/319
+f 1120/493/318 1116/496/321 1119/565/388
+f 1113/568/391 1114/497/322 1118/494/319
+f 1111/569/392 1115/567/390 1116/496/321
+f 1114/497/322 1113/568/391 1110/500/325
+f 1107/571/394 1111/569/392 1112/499/324
+f 1110/500/325 1109/570/393 1106/503/328
+f 1108/502/327 1104/505/330 1107/571/394
+f 1106/503/328 1105/572/395 1102/506/331
+f 1104/505/330 1100/508/333 1103/573/396
+f 1102/506/331 1101/574/397 1098/509/334
+f 1100/508/333 1094/511/336 1099/575/398
+f 1098/509/334 1095/576/399 1097/415/242
+f 1094/511/336 1091/512/337 1093/577/400
+f 1089/580/403 1090/586/403 969/581/402
+f 1087/583/404 964/703/405 963/584/405
+f 1085/585/406 1086/590/406 1090/586/403
+f 1083/588/407 1087/583/404 1088/582/404
+f 1081/589/408 1082/594/408 1086/590/406
+f 1079/592/409 1083/588/407 1084/587/407
+f 1077/593/410 1078/598/410 1082/594/408
+f 1075/596/411 1079/592/409 1080/591/409
+f 1073/597/412 1074/602/412 1078/598/410
+f 1071/600/413 1075/596/411 1076/595/411
+f 1069/601/414 1070/952/414 1074/602/412
+f 1067/604/415 1071/600/413 1072/599/413
+f 1065/606/416 1066/612/416 1070/607/414
+f 1063/609/417 1067/953/415 1068/610/415
+f 1061/611/418 1062/616/418 1066/612/416
+f 1059/614/419 1063/609/417 1064/608/417
+f 1057/615/420 1058/620/420 1062/616/418
+f 1055/618/421 1059/614/419 1060/613/419
+f 1053/619/422 1054/624/422 1058/620/420
+f 1051/622/423 1055/618/421 1056/617/421
+f 1049/623/424 1050/954/424 1054/624/422
+f 1047/626/425 1051/622/423 1052/621/423
+f 1050/954/424 1049/623/424 1046/628/426
+f 1043/630/427 1047/626/425 1048/625/425
+f 1041/631/428 1042/635/428 1046/628/426
+f 1039/633/429 1043/630/427 1044/629/427
+f 1037/634/430 1038/639/430 1042/635/428
+f 1035/637/431 1039/633/429 1040/632/429
+f 1033/638/432 1034/643/432 1038/639/430
+f 1031/641/433 1035/637/431 1036/636/431
+f 1029/642/434 1030/955/434 1034/643/432
+f 1027/645/435 1031/641/433 1032/640/433
+f 1030/955/434 1029/642/434 1026/647/436
+f 1028/644/435 1024/648/437 1027/645/435
+f 1026/647/436 1025/646/436 1022/651/438
+f 1024/648/437 1020/652/439 1023/649/437
+f 1022/651/438 1021/650/438 1018/655/440
+f 1015/657/441 1019/653/439 1020/652/439
+f 1013/658/442 1014/956/442 1018/655/440
+f 1016/656/441 1012/659/443 1015/657/441
+f 1014/956/442 1013/658/442 1010/662/444
+f 1012/659/443 1008/663/445 1011/660/443
+f 1010/662/444 1009/661/444 1006/666/446
+f 1008/663/445 1004/667/447 1007/664/445
+f 1001/669/448 1002/673/448 1006/666/446
+f 999/671/449 1003/668/447 1004/667/447
+f 997/672/450 998/677/450 1002/673/448
+f 995/675/451 999/671/449 1000/670/449
+f 993/676/452 994/957/452 998/677/450
+f 996/674/451 992/678/453 995/675/451
+f 994/957/452 993/676/452 990/681/454
+f 992/678/453 988/682/455 991/679/453
+f 990/681/454 989/680/454 986/685/456
+f 988/682/455 984/686/457 987/683/455
+f 986/685/456 985/684/456 982/689/458
+f 979/691/459 983/687/457 984/686/457
+f 982/689/458 981/688/458 978/693/460
+f 980/690/459 976/694/461 979/691/459
+f 978/693/460 977/692/460 974/697/462
+f 976/694/461 972/698/463 975/695/461
+f 967/700/464 970/958/464 974/697/462
+f 965/702/465 971/699/463 972/698/463
+f 970/958/464 967/700/464 969/581/402
+f 964/703/405 965/702/465 966/701/465
+f 162/704/466 163/707/467 515/413/467
+f 164/706/469 516/291/469 517/410/468
+f 163/707/467 166/709/470 518/409/470
+f 165/705/468 517/410/468 519/406/472
+f 166/709/470 168/711/476 520/405/473
+f 167/708/471 519/406/472 521/402/475
+f 522/401/477 520/405/473 170/712/477
+f 523/398/478 171/713/478 521/402/475
+f 170/712/477 172/715/481 524/397/479
+f 171/713/478 523/398/478 525/394/480
+f 172/715/481 174/717/482 526/393/482
+f 173/714/480 525/394/480 527/391/483
+f 528/390/484 526/393/482 176/718/484
+f 175/716/483 527/391/483 529/387/485
+f 530/386/486 528/390/484 178/720/486
+f 531/383/487 179/721/487 529/387/485
+f 532/382/488 530/386/486 180/722/488
+f 533/379/489 181/723/489 531/383/487
+f 534/378/490 532/382/488 182/724/490
+f 535/375/491 183/725/491 533/379/489
+f 536/374/492 534/378/490 184/726/492
+f 537/372/493 185/727/493 535/375/491
+f 538/371/494 536/374/492 186/728/494
+f 539/368/495 187/729/495 537/372/493
+f 540/367/496 538/371/494 188/730/496
+f 541/365/497 189/731/497 539/368/495
+f 542/364/498 540/367/496 190/732/498
+f 543/361/499 191/733/499 541/365/497
+f 544/360/500 542/364/498 192/734/500
+f 545/357/501 193/735/501 543/361/499
+f 546/356/502 544/360/500 194/736/502
+f 547/353/503 195/737/503 545/357/501
+f 194/736/502 196/739/504 548/352/504
+f 195/737/503 547/353/503 549/350/505
+f 550/349/506 548/352/504 198/740/506
+f 197/738/505 549/350/505 551/346/508
+f 552/345/509 550/349/506 200/742/509
+f 553/342/510 201/743/510 551/346/508
+f 200/742/509 202/745/511 554/341/511
+f 201/743/510 553/342/510 555/338/512
+f 202/745/511 204/747/513 556/337/513
+f 203/744/512 555/338/512 557/334/514
+f 204/747/513 206/749/515 558/333/515
+f 205/746/514 557/334/514 559/331/516
+f 206/749/515 208/751/517 560/330/517
+f 207/748/516 559/331/516 561/327/518
+f 208/751/517 210/753/519 562/326/519
+f 209/750/518 561/327/518 563/323/520
+f 210/753/519 212/755/521 564/321/521
+f 211/752/520 563/323/520 565/318/522
+f 212/755/521 214/786/523 566/322/523
+f 213/754/522 565/318/522 567/317/525
+f 214/757/523 216/760/526 568/312/526
+f 215/759/524 567/313/525 569/309/527
+f 216/760/526 218/762/528 570/308/528
+f 217/758/527 569/309/527 571/305/529
+f 218/762/528 220/764/530 572/304/530
+f 219/761/529 571/305/529 573/301/531
+f 220/764/530 222/766/532 574/300/532
+f 221/763/531 573/301/531 575/297/533
+f 222/766/532 224/768/534 576/295/534
+f 223/765/533 575/297/533 577/292/535
+f 224/768/534 162/704/466 514/414/466
+f 225/767/535 577/292/535 516/291/469
+f 578/296/536 579/412/537 228/702/537
+f 230/700/538 580/411/538 231/579/539
+f 898/770/541 962/767/541 901/706/540
+f 897/771/542 835/842/543 899/704/543
+f 234/699/544 228/702/537 582/408/544
+f 236/696/545 583/407/545 230/700/538
+f 896/772/546 960/765/546 962/767/541
+f 895/773/548 897/771/542 961/768/542
+f 582/408/544 584/404/549 238/695/549
+f 583/407/545 236/696/545 240/692/550
+f 894/774/551 958/763/551 960/765/546
+f 893/775/552 895/773/548 959/766/547
+f 584/404/549 586/400/553 242/691/553
+f 585/403/550 240/692/550 244/688/554
+f 892/777/555 956/761/555 958/763/551
+f 891/778/556 893/775/552 957/764/552
+f 246/687/557 242/691/553 588/396/557
+f 248/684/558 589/399/558 244/688/554
+f 890/779/559 954/758/559 956/761/555
+f 889/780/560 891/778/556 955/762/556
+f 588/396/557 590/392/561 250/683/561
+f 589/399/558 248/684/558 252/680/562
+f 888/781/563 952/759/563 954/758/559
+f 887/782/564 889/780/560 953/760/560
+f 590/392/561 592/389/565 254/679/565
+f 591/395/562 252/680/562 256/676/566
+f 886/784/567 950/754/567 952/756/563
+f 885/785/568 887/959/564 951/786/564
+f 592/389/565 594/385/569 258/675/569
+f 593/388/566 256/676/566 260/672/570
+f 884/787/571 948/752/571 950/754/567
+f 883/788/572 885/785/568 949/755/568
+f 262/671/573 258/675/569 596/381/573
+f 264/669/574 597/789/574 260/672/570
+f 882/790/575 946/750/575 948/752/571
+f 881/791/576 883/788/572 947/753/572
+f 596/381/573 598/377/577 266/668/577
+f 268/665/578 599/380/578 264/669/574
+f 880/792/579 944/748/579 946/750/575
+f 879/793/580 881/791/576 945/751/576
+f 598/377/577 600/373/581 270/664/581
+f 272/661/582 601/376/582 268/665/578
+f 878/794/583 942/746/583 944/748/579
+f 877/795/584 879/793/580 943/749/580
+f 274/660/585 270/664/581 602/370/585
+f 276/658/586 603/369/586 272/661/582
+f 876/796/587 940/744/587 942/746/583
+f 875/797/588 877/795/584 941/747/584
+f 278/657/589 274/660/585 604/366/589
+f 280/654/590 605/798/590 276/658/586
+f 874/799/591 938/743/591 940/744/587
+f 873/800/592 875/797/588 939/745/588
+f 282/653/593 278/657/589 606/363/593
+f 284/650/594 607/362/594 280/654/590
+f 872/801/595 936/741/595 938/743/591
+f 871/802/596 873/800/592 937/742/592
+f 606/363/593 608/359/597 286/649/597
+f 607/362/594 284/650/594 288/646/598
+f 870/803/599 934/738/599 936/741/595
+f 869/804/600 871/802/596 935/740/596
+f 608/359/597 610/355/601 290/645/601
+f 609/358/598 288/646/598 292/642/602
+f 868/805/603 932/737/603 934/738/599
+f 867/806/604 869/804/600 933/739/600
+f 610/355/601 612/351/605 294/641/605
+f 611/354/602 292/642/602 296/638/606
+f 932/737/603 868/805/603 930/735/607
+f 931/736/604 929/734/608 867/806/604
+f 612/351/605 614/348/609 298/637/609
+f 613/807/606 296/638/606 300/634/610
+f 930/735/607 866/808/607 928/733/611
+f 929/734/608 927/732/612 865/809/608
+f 614/348/609 616/344/613 302/633/613
+f 615/347/610 300/634/610 304/631/614
+f 928/733/611 864/810/611 926/731/615
+f 927/732/612 925/730/616 863/811/612
+f 616/344/613 618/340/617 306/630/617
+f 617/812/614 304/631/614 308/627/618
+f 926/731/615 862/813/615 924/729/619
+f 925/730/616 923/728/620 861/814/616
+f 618/340/617 620/336/621 310/626/621
+f 619/343/618 308/627/618 312/623/622
+f 924/729/619 860/815/619 922/727/623
+f 857/818/624 859/816/620 923/728/620
+f 620/336/621 622/332/625 314/622/625
+f 621/339/622 312/623/622 316/619/626
+f 856/819/627 920/725/627 922/727/623
+f 855/820/628 857/818/624 921/726/624
+f 622/332/625 624/329/629 318/618/629
+f 623/335/626 316/619/626 320/615/630
+f 854/821/631 918/723/631 920/725/627
+f 853/822/632 855/820/628 919/724/628
+f 624/329/629 626/325/633 322/614/633
+f 625/328/630 320/615/630 324/611/634
+f 852/824/635 916/721/635 918/723/631
+f 851/825/636 853/822/632 917/722/632
+f 626/325/633 628/320/637 326/609/637
+f 627/823/634 324/611/634 328/606/638
+f 850/826/639 914/719/639 916/721/635
+f 849/827/640 851/825/636 915/720/636
+f 330/953/641 326/609/637 630/828/641
+f 629/324/638 328/606/638 332/605/642
+f 848/829/643 912/716/643 914/719/639
+f 847/830/644 849/827/640 913/718/640
+f 334/600/645 330/604/641 632/311/645
+f 631/314/642 332/601/642 336/597/646
+f 846/832/647 910/714/647 912/716/643
+f 845/833/648 847/830/644 911/717/644
+f 632/311/645 634/307/649 338/596/649
+f 633/831/646 336/597/646 340/593/650
+f 844/834/651 908/713/651 910/714/647
+f 843/835/652 845/833/648 909/715/648
+f 634/307/649 636/303/653 342/592/653
+f 635/310/650 340/593/650 344/589/654
+f 842/836/655 906/710/655 908/713/651
+f 841/837/656 843/835/652 907/712/652
+f 636/303/653 638/299/657 346/588/657
+f 637/306/654 344/589/654 348/585/658
+f 840/838/659 904/708/659 906/710/655
+f 839/839/660 841/837/656 905/711/656
+f 638/299/657 640/294/661 350/583/661
+f 639/302/658 348/585/658 352/580/662
+f 838/840/663 902/705/663 904/708/659
+f 836/841/664 839/839/660 903/709/660
+f 640/294/661 578/296/536 227/703/536
+f 641/298/662 352/580/662 231/579/539
+f 837/769/540 901/706/540 902/705/663
+f 835/842/543 836/841/664 900/707/664
+f 643/160/666 642/161/665 229/701/666
+f 645/157/667 233/843/667 644/35/668
+f 646/156/669 643/160/666 235/698/669
+f 647/153/670 237/845/670 645/157/667
+f 648/152/671 646/156/669 239/694/671
+f 649/149/672 241/846/672 647/153/670
+f 239/694/671 243/690/673 650/148/673
+f 241/846/672 649/149/672 651/145/674
+f 652/144/675 650/148/673 247/686/675
+f 653/141/676 249/848/676 651/145/674
+f 654/140/677 652/144/675 251/682/677
+f 655/137/678 253/849/678 653/141/676
+f 251/682/677 255/678/679 656/136/679
+f 253/849/678 655/137/678 657/134/680
+f 658/133/681 656/136/679 259/674/681
+f 257/850/680 657/134/680 659/130/682
+f 660/129/683 658/133/681 263/670/683
+f 661/126/684 265/852/684 659/130/682
+f 662/125/685 660/129/683 267/667/685
+f 663/122/689 269/853/686 661/126/684
+f 664/121/687 662/125/685 271/663/687
+f 665/118/688 273/854/688 663/122/689
+f 271/663/687 275/659/690 666/117/690
+f 273/854/688 665/118/688 667/114/691
+f 275/659/690 279/656/692 668/113/692
+f 277/855/691 667/114/691 669/110/693
+f 670/109/694 668/113/692 283/652/694
+f 671/106/695 285/857/695 669/110/693
+f 283/652/694 287/648/696 672/105/696
+f 285/857/695 671/106/695 673/102/697
+f 287/648/696 291/644/698 674/101/698
+f 289/858/697 673/102/697 675/98/699
+f 291/644/698 295/640/700 676/97/700
+f 293/859/699 675/98/699 677/94/701
+f 295/640/700 299/636/702 678/93/702
+f 297/860/701 677/94/701 679/91/703
+f 680/90/704 678/93/702 303/632/704
+f 681/87/705 305/862/705 679/91/703
+f 303/632/704 307/629/706 682/86/706
+f 305/862/705 681/87/705 683/83/707
+f 307/629/706 311/625/708 684/82/708
+f 309/863/707 683/83/707 685/79/709
+f 686/78/710 684/82/708 315/621/710
+f 687/75/714 317/865/711 685/79/709
+f 688/74/712 686/78/710 319/617/712
+f 689/71/713 321/866/713 687/75/714
+f 319/617/712 323/613/715 690/70/715
+f 321/866/713 689/71/713 691/67/716
+f 323/613/715 327/608/717 692/65/717
+f 325/867/716 691/67/716 693/62/718
+f 327/608/717 331/610/719 694/869/719
+f 329/868/718 693/62/718 695/61/720
+f 331/603/719 335/599/721 696/56/721
+f 333/872/720 695/57/720 697/53/722
+f 335/599/721 339/595/723 698/52/723
+f 337/871/722 697/53/722 699/49/724
+f 339/595/723 343/591/725 700/48/725
+f 341/873/724 699/49/724 701/45/726
+f 343/591/725 347/587/727 702/44/727
+f 345/874/726 701/45/726 703/41/728
+f 347/587/727 351/582/729 704/39/729
+f 349/875/728 703/41/728 705/36/730
+f 351/582/729 226/584/665 642/161/665
+f 353/876/730 705/36/730 644/35/668
+f 356/880/732 355/877/731 707/159/732
+f 358/576/733 708/158/733 359/513/734
+f 413/166/736 511/2/736 419/1/735
+f 415/163/737 833/289/738 421/879/738
+f 362/882/739 356/880/732 710/155/739
+f 364/574/740 711/154/740 358/576/733
+f 423/4/741 832/283/741 834/287/735
+f 425/881/742 421/879/738 833/289/738
+f 710/155/739 712/151/748 366/883/743
+f 711/154/740 364/574/740 368/572/745
+f 427/5/746 830/279/746 832/283/741
+f 429/884/747 425/881/742 831/285/742
+f 370/886/749 366/883/743 714/147/749
+f 372/570/750 715/146/750 368/572/745
+f 431/6/751 828/275/751 830/279/746
+f 433/885/752 429/884/747 829/281/747
+f 374/888/753 370/886/749 716/143/753
+f 376/568/754 717/142/754 372/570/750
+f 435/7/755 826/270/755 828/275/751
+f 437/887/756 433/885/752 827/277/752
+f 378/890/757 374/888/753 718/139/757
+f 380/566/758 719/138/758 376/568/754
+f 439/8/759 824/271/765 826/270/755
+f 441/889/761 437/887/756 825/273/756
+f 718/139/757 720/135/762 382/891/762
+f 384/564/763 721/892/763 380/566/758
+f 443/9/764 822/261/764 824/265/765
+f 445/893/766 441/948/761 823/894/760
+f 386/896/767 382/891/762 722/132/767
+f 721/892/763 384/564/763 388/562/768
+f 447/11/769 820/257/769 822/261/764
+f 449/895/771 445/893/766 821/263/766
+f 722/132/767 724/128/772 390/897/772
+f 723/131/768 388/562/768 392/560/773
+f 451/12/774 818/253/774 820/257/769
+f 453/898/775 449/895/771 819/259/770
+f 394/900/776 390/897/772 726/124/776
+f 396/558/777 727/123/777 392/560/773
+f 455/13/778 816/249/778 818/253/774
+f 457/899/779 453/898/775 817/255/775
+f 726/124/776 728/120/780 398/901/780
+f 727/123/777 396/558/777 400/556/781
+f 459/14/782 814/245/782 816/249/778
+f 461/902/783 457/899/779 815/251/779
+f 728/120/780 730/116/784 402/903/784
+f 729/119/781 400/556/781 404/554/785
+f 463/15/786 812/241/786 814/245/782
+f 465/904/787 461/902/783 813/247/783
+f 406/906/788 402/903/784 732/112/788
+f 408/552/789 733/111/789 404/554/785
+f 467/16/790 810/237/790 812/241/786
+f 469/905/791 465/904/787 811/243/787
+f 410/908/792 406/906/788 734/108/792
+f 412/550/793 735/107/793 408/552/789
+f 471/17/794 808/233/794 810/237/790
+f 473/907/795 469/905/791 809/239/791
+f 734/108/792 736/104/796 414/909/796
+f 735/107/793 412/550/793 416/548/797
+f 475/18/798 806/229/798 808/233/794
+f 477/910/799 473/907/795 807/235/795
+f 418/913/800 414/909/796 738/100/800
+f 737/103/797 416/548/797 420/546/801
+f 479/19/802 804/225/901 806/229/798
+f 481/912/804 477/910/799 805/231/799
+f 738/100/800 740/96/805 422/914/805
+f 739/911/801 420/546/801 424/544/806
+f 804/225/901 479/19/802 354/222/807
+f 803/224/803 357/221/808 481/912/804
+f 740/96/805 742/92/809 426/916/809
+f 741/99/806 424/544/806 428/542/810
+f 354/222/807 482/20/807 360/218/811
+f 357/221/808 361/220/812 483/915/808
+f 742/92/809 744/89/814 430/918/814
+f 743/95/810 428/542/810 432/540/815
+f 360/218/811 484/21/811 363/214/816
+f 361/220/812 365/216/817 485/917/813
+f 744/89/814 746/85/818 434/920/818
+f 745/88/815 432/540/815 436/538/819
+f 363/214/816 486/22/816 367/210/820
+f 365/216/817 369/212/821 487/919/817
+f 746/85/818 748/81/822 438/923/822
+f 747/921/819 436/538/819 440/536/823
+f 490/24/824 371/206/824 367/210/820
+f 491/924/825 489/922/821 369/212/821
+f 748/81/822 750/77/826 442/925/826
+f 749/84/823 440/536/823 444/534/827
+f 492/25/828 375/202/828 371/206/824
+f 493/926/829 491/924/825 373/208/825
+f 750/77/826 752/73/830 446/927/830
+f 751/80/827 444/534/827 448/532/831
+f 494/26/832 379/198/832 375/202/828
+f 495/928/833 493/926/829 377/204/829
+f 752/73/830 754/69/834 450/929/834
+f 452/530/835 755/72/835 448/532/831
+f 496/27/836 383/194/836 379/198/832
+f 497/930/837 495/928/833 381/200/833
+f 754/69/834 756/64/838 454/931/838
+f 755/72/835 452/530/835 456/527/839
+f 498/28/840 387/190/840 383/194/836
+f 499/932/841 497/930/837 385/196/837
+f 756/64/838 758/66/842 458/933/842
+f 757/68/839 456/527/839 460/526/843
+f 500/29/844 391/186/844 387/190/840
+f 501/934/845 499/932/841 389/192/841
+f 758/59/842 760/55/846 462/936/846
+f 759/937/843 460/524/843 464/522/847
+f 502/30/848 395/182/848 391/186/844
+f 503/938/849 501/934/845 393/188/845
+f 466/940/850 462/936/846 762/51/850
+f 468/520/851 763/54/851 464/522/847
+f 504/31/852 399/178/852 395/182/848
+f 505/939/853 503/938/849 397/184/849
+f 762/51/850 764/47/854 470/941/854
+f 763/54/851 468/520/851 472/518/855
+f 506/32/856 403/174/856 399/178/852
+f 507/942/857 505/939/853 401/180/853
+f 764/47/854 766/43/858 474/943/858
+f 765/50/855 472/518/855 476/516/859
+f 508/33/860 407/170/860 403/174/856
+f 509/944/861 507/942/857 405/176/857
+f 766/43/858 768/38/862 478/945/862
+f 767/46/859 476/516/859 480/514/863
+f 510/34/864 411/165/864 407/170/860
+f 513/946/865 509/944/861 409/172/861
+f 768/38/862 706/40/731 355/877/731
+f 769/42/863 480/514/863 359/513/734
+f 511/2/736 413/166/736 411/165/864
+f 417/168/865 415/163/737 512/878/737
diff --git a/09-september/resources/boulder.obj b/09-september/resources/boulder.obj
new file mode 100755
index 0000000..d993ab0
--- /dev/null
+++ b/09-september/resources/boulder.obj
@@ -0,0 +1,1166 @@
+# Blender v2.67 (sub 0) OBJ File: ''
+# www.blender.org
+o Stone_F_3_LOD1
+v -1.916053 -3.630385 1.916053
+v -1.774122 -3.027584 2.466601
+v -2.670772 -3.076572 2.670771
+v -2.880061 -3.357386 2.038919
+v -1.936080 -2.197929 3.002565
+v -3.134844 -2.311625 3.134844
+v -4.026964 -2.620021 2.510522
+v -0.000000 -3.674069 1.907996
+v -0.000001 -3.221349 2.570857
+v -0.910614 -3.116154 2.475319
+v -0.941118 -3.450117 1.768421
+v -0.000000 -2.443571 3.211287
+v -1.037349 -2.350119 3.086367
+v 2.189848 -4.043650 2.189848
+v 2.041765 -3.360931 2.884505
+v 1.027460 -3.437876 2.868851
+v 1.142183 -4.159623 2.218114
+v 2.289629 -2.457712 3.633047
+v 1.177833 -2.584327 3.647763
+v 3.304351 -2.322276 2.105309
+v 3.055634 -2.274841 3.055635
+v 2.832890 -3.202250 2.832890
+v 2.967863 -3.427424 2.095152
+v -4.100050 -2.773015 1.291013
+v -3.162618 -3.678038 1.114685
+v -4.794678 -3.102422 -0.000001
+v -3.473299 -3.967102 -0.000000
+v -2.551345 -4.711632 -0.000001
+v -1.974967 -3.775994 1.033467
+v -1.342576 -4.863437 -0.000001
+v -1.090065 -3.866515 1.090065
+v 0.000000 -4.587823 -0.000001
+v -0.000000 -3.907883 1.104650
+v 1.234499 -4.429379 -0.000001
+v 1.226352 -4.398590 1.226351
+v 2.211653 -4.163794 -0.000001
+v 2.083042 -3.946513 1.081790
+v 3.006132 -3.581049 -0.000000
+v 3.007863 -3.551523 1.068736
+v 3.679332 -2.638325 -0.000000
+v 3.523236 -2.532375 1.146671
+v -4.663065 -3.007899 -1.431903
+v -3.589066 -4.026671 -1.241307
+v -4.159923 -2.674804 -2.585081
+v -3.551812 -3.893219 -2.469140
+v -2.687516 -4.794826 -2.687517
+v -2.763435 -5.020007 -1.386008
+v -1.328313 -4.816418 -2.634399
+v -1.496500 -5.453263 -1.496500
+v 0.000000 -4.501268 -2.420907
+v 0.000000 -4.898719 -1.351362
+v 1.159430 -4.220480 -2.256687
+v 1.267391 -4.558809 -1.267393
+v 1.970464 -3.712511 -1.970464
+v 2.167963 -4.080496 -1.119761
+v 2.618176 -3.148489 -1.871197
+v 2.672010 -3.276953 -0.969015
+v 3.104623 -2.239979 -1.993309
+v 3.093093 -2.352924 -1.039033
+v -3.271620 -2.375141 -3.271621
+v -3.320482 -3.580238 -3.320482
+v -2.344594 -2.498099 -3.731067
+v -2.480156 -3.906940 -3.569014
+v -1.215784 -2.647596 -3.799423
+v -1.207849 -3.934551 -3.476385
+v -0.000000 -2.691176 -3.806350
+v -0.000000 -3.634715 -3.071074
+v 1.148567 -2.535534 -3.530811
+v 1.072443 -3.561728 -3.020347
+v 1.985007 -2.233879 -3.089818
+v 1.858490 -3.132663 -2.598335
+v 2.717236 -2.117692 -2.717235
+v 2.507789 -2.950224 -2.507790
+v -2.005798 9.496864 2.005800
+v -3.590262 8.179170 2.492548
+v -3.380737 7.519215 3.380738
+v -2.462314 8.161996 3.542846
+v -4.511351 6.086253 2.772030
+v -3.652474 5.791484 3.652474
+v -2.421854 5.937723 3.872226
+v -1.308723 6.299657 4.175407
+v -1.229926 8.693329 3.553876
+v 0.000000 6.357834 3.991156
+v -0.000000 8.888184 3.504623
+v -0.000000 10.985978 2.328364
+v -1.155102 10.614158 2.245318
+v 1.230484 6.227292 3.851398
+v 1.186444 8.642007 3.404518
+v 2.165694 5.829069 3.404693
+v 1.930707 7.860015 2.709054
+v 1.953033 9.466584 1.953035
+v 1.252909 10.735368 2.465424
+v 2.956054 5.601676 2.956056
+v 2.766640 7.284450 2.766641
+v 3.563187 5.865902 2.252534
+v 2.906995 7.931705 2.056913
+v -2.293816 10.966983 0.000003
+v -3.173147 8.776424 0.000002
+v -3.295717 8.604621 1.154773
+v -2.065859 10.515332 1.075361
+v -4.073105 6.375723 0.000002
+v -4.593215 6.392972 1.409615
+v 0.000000 12.931432 1.591478
+v -1.466942 12.358363 1.466945
+v 0.000000 14.342896 0.000003
+v -1.744971 13.135221 0.000003
+v 2.607131 10.813407 1.315883
+v 1.768368 12.748035 1.768370
+v 2.827488 11.260423 0.000003
+v 1.769937 13.168368 0.000003
+v 4.311605 6.330076 1.341613
+v 3.477753 8.667175 1.207767
+v 4.659688 6.503766 0.000001
+v 4.288108 9.152349 0.000002
+v -2.503155 9.782269 -2.503151
+v -3.235073 8.050528 -2.266084
+v -3.712446 8.747819 -1.276088
+v -2.615859 10.818212 -1.319756
+v -3.263525 5.796263 -2.088347
+v -3.572301 6.164958 -1.163087
+v 0.000000 13.100103 -1.718517
+v -1.421705 12.299883 -1.421703
+v -0.000000 11.043085 -2.432215
+v -1.228719 10.705389 -2.410980
+v 3.120996 11.096388 -1.544221
+v 1.537507 12.449586 -1.537504
+v 2.442287 9.747341 -2.442284
+v 1.356366 10.863578 -2.698236
+v 4.522304 6.377136 -1.392488
+v 3.878502 8.804877 -1.324430
+v 4.313411 6.040253 -2.663577
+v 3.142899 8.017145 -2.207316
+v -2.177104 5.833910 -3.425515
+v -2.826335 5.566323 -2.826334
+v -2.762691 7.282940 -2.762690
+v -2.144224 7.981304 -3.043936
+v -0.000000 8.739096 -3.062430
+v -1.007499 8.430799 -2.789842
+v -0.000000 6.296713 -3.711135
+v -1.225290 6.222490 -3.829889
+v 2.130118 7.973291 -3.021813
+v 1.125967 8.570626 -3.196775
+v 2.421118 5.937411 -3.870881
+v 1.229298 6.226196 -3.846483
+v 3.251200 5.682119 -3.251198
+v 2.773384 7.287028 -2.773382
+v -2.803517 1.172553 4.560723
+v -4.072896 1.193099 4.072896
+v -3.810574 -0.853687 3.810574
+v -2.316849 -0.871623 3.679116
+v -4.973468 1.171004 3.029232
+v -4.800019 -1.058370 2.939719
+v 0.000000 -1.099875 4.005143
+v -1.190453 -0.998273 3.550861
+v 0.000000 1.129720 4.907054
+v -1.413840 1.141560 4.500068
+v 2.591413 -0.953942 4.173216
+v 1.382793 -1.128851 4.372849
+v 2.610734 1.173876 4.208201
+v 1.453762 1.140962 4.675025
+v 3.735243 -0.880974 2.348038
+v 3.405689 -0.774173 3.405690
+v 4.223934 1.173818 2.619340
+v 3.587192 1.195416 3.587193
+v 4.064046 -1.109102 -0.000000
+v 4.089301 -1.083807 1.316444
+v 4.884167 1.129800 0.000000
+v 4.599715 1.141221 1.436578
+v 3.222341 -0.795522 -2.063025
+v 3.629696 -1.010794 -1.208900
+v 3.675643 1.175878 -2.319497
+v 4.617282 1.141162 -1.440586
+v 2.188590 -0.833168 -3.448305
+v 3.033731 -0.701124 -3.033731
+v 2.342211 1.175721 -3.717174
+v 2.957400 1.198425 -2.957399
+v -0.000000 -1.112108 -4.083237
+v 1.210952 -1.012188 -3.638467
+v 0.000000 1.131142 -4.493519
+v 1.420941 1.141456 -4.531190
+v -2.531963 -0.936117 -4.066232
+v -1.350453 -1.106895 -4.234642
+v -2.438426 1.175060 -3.893116
+v -1.321748 1.142939 -4.096478
+v -4.373033 -0.987231 -2.702449
+v -3.401402 -0.773330 -3.401402
+v -4.108176 1.174253 -2.556035
+v -3.267244 1.196945 -3.267243
+v -5.179070 -1.283801 -0.000000
+v -5.014218 -1.230736 -1.532869
+v -4.908771 1.129714 0.000000
+v -4.476716 1.141640 -1.408511
+v -5.012662 -1.230490 1.532505
+v -5.091325 1.139543 1.548753
+v -3.808316 3.487754 3.808316
+v -2.439959 3.528414 3.898350
+v -4.997580 3.657859 3.041126
+v 0.000000 3.739314 4.247563
+v -1.318340 3.679163 4.090331
+v 2.382792 3.516103 3.793822
+v 1.408322 3.721921 4.482589
+v 4.135642 3.556357 2.569734
+v 3.097726 3.386422 3.097728
+v 4.998064 3.819278 0.000001
+v 4.776843 3.754000 1.475823
+v 4.040967 3.545209 -2.517955
+v 4.724630 3.748308 -1.463844
+v 2.807437 3.607542 -4.570280
+v 3.704641 3.472973 -3.704640
+v 0.000000 3.827823 -5.078245
+v 1.574307 3.800802 -5.206170
+v -2.411557 3.522299 -3.846417
+v -1.382326 3.709572 -4.369264
+v -3.778896 3.514346 -2.374629
+v -3.181887 3.398424 -3.181885
+v -4.749122 3.792755 0.000001
+v -4.114111 3.681755 -1.323795
+v -5.002842 3.778636 1.527665
+vt 0.797339 0.944145
+vt 0.804120 0.966415
+vt 0.775228 0.971191
+vt 0.768051 0.940817
+vt 0.422888 0.065050
+vt 0.383434 0.064168
+vt 0.402450 0.020161
+vt 0.429948 0.026777
+vt 0.257977 0.578822
+vt 0.235327 0.535789
+vt 0.260305 0.556510
+vt 0.286825 0.597852
+vt 0.868575 0.933450
+vt 0.869041 0.966379
+vt 0.833013 0.961638
+vt 0.830821 0.937582
+vt 0.495428 0.075056
+vt 0.456415 0.072415
+vt 0.457447 0.033394
+vt 0.493201 0.028334
+vt 0.939813 0.935370
+vt 0.936916 0.969799
+vt 0.905070 0.971120
+vt 0.907106 0.936102
+vt 0.573069 0.075613
+vt 0.535550 0.072684
+vt 0.528954 0.023273
+vt 0.561137 0.031201
+vt 0.090160 0.107872
+vt 0.063747 0.128539
+vt 0.069596 0.084592
+vt 0.097015 0.068436
+vt 0.593320 0.039128
+vt 0.608480 0.081300
+vt 0.973915 0.936855
+vt 0.968762 0.968478
+vt 0.214713 0.568420
+vt 0.210350 0.515068
+vt 0.167865 0.563608
+vt 0.168226 0.513264
+vt 0.790595 0.859556
+vt 0.793292 0.906310
+vt 0.760874 0.910443
+vt 0.750848 0.869319
+vt 0.827836 0.856132
+vt 0.828821 0.905081
+vt 0.876622 0.859115
+vt 0.871131 0.902032
+vt 0.918550 0.858530
+vt 0.912326 0.901152
+vt 0.953722 0.863400
+vt 0.946893 0.902118
+vt 0.984940 0.869601
+vt 0.979069 0.905233
+vt 0.162604 0.092283
+vt 0.123316 0.096197
+vt 0.124434 0.052280
+vt 0.158983 0.053156
+vt 0.121568 0.563630
+vt 0.126102 0.511460
+vt 0.078655 0.566826
+vt 0.088695 0.518678
+vt 0.789188 0.771322
+vt 0.785093 0.813459
+vt 0.740822 0.828196
+vt 0.753964 0.790730
+vt 0.828732 0.760798
+vt 0.826181 0.804495
+vt 0.873975 0.766916
+vt 0.874812 0.806982
+vt 0.917559 0.775060
+vt 0.921512 0.813321
+vt 0.952239 0.788599
+vt 0.956415 0.823276
+vt 0.981081 0.803700
+vt 0.990812 0.833968
+vt 0.235979 0.103874
+vt 0.201099 0.095616
+vt 0.193532 0.054031
+vt 0.221693 0.063423
+vt 0.038063 0.574365
+vt 0.051287 0.525896
+vt 0.903723 0.086395
+vt 0.894349 0.038473
+vt 0.932327 0.049517
+vt 0.945079 0.095636
+vt 0.767106 0.753264
+vt 0.799552 0.731727
+vt 0.863290 0.079378
+vt 0.856371 0.027430
+vt 0.818669 0.079787
+vt 0.815857 0.031760
+vt 0.831999 0.710190
+vt 0.873567 0.723891
+vt 0.776948 0.081185
+vt 0.775343 0.036090
+vt 0.743123 0.088464
+vt 0.748433 0.047734
+vt 0.915136 0.737591
+vt 0.943243 0.755512
+vt 0.711946 0.100207
+vt 0.721523 0.059378
+vt 0.249854 0.072815
+vt 0.266958 0.112009
+vt 0.971350 0.773432
+vt 0.426501 0.603057
+vt 0.360164 0.613281
+vt 0.393511 0.564802
+vt 0.440592 0.533787
+vt 0.256747 0.867553
+vt 0.297094 0.852586
+vt 0.285803 0.924722
+vt 0.250719 0.946916
+vt 0.428991 0.351112
+vt 0.429726 0.440163
+vt 0.395758 0.416066
+vt 0.392779 0.334441
+vt 0.463107 0.372691
+vt 0.463693 0.464260
+vt 0.505663 0.381250
+vt 0.504535 0.466408
+vt 0.531460 0.577419
+vt 0.480976 0.586585
+vt 0.487672 0.502771
+vt 0.526176 0.497042
+vt 0.546210 0.375491
+vt 0.545376 0.468556
+vt 0.580439 0.359668
+vt 0.573995 0.439243
+vt 0.646015 0.586775
+vt 0.582642 0.576519
+vt 0.564680 0.491312
+vt 0.616448 0.528277
+vt 0.610246 0.338821
+vt 0.602613 0.409930
+vt 0.073129 0.385810
+vt 0.080100 0.463825
+vt 0.045638 0.444300
+vt 0.035510 0.375775
+vt 0.668215 0.565243
+vt 0.708230 0.612168
+vt 0.404051 0.710343
+vt 0.325279 0.719950
+vt 0.326818 0.661759
+vt 0.408910 0.659563
+vt 0.169462 0.878169
+vt 0.215740 0.876665
+vt 0.215635 0.969111
+vt 0.170496 0.966680
+vt 0.533778 0.651832
+vt 0.476508 0.657429
+vt 0.536965 0.716245
+vt 0.475245 0.715405
+vt 0.662700 0.653083
+vt 0.592028 0.649827
+vt 0.668126 0.715895
+vt 0.597291 0.713027
+vt 0.113686 0.394151
+vt 0.114562 0.483349
+vt 0.159479 0.399822
+vt 0.156150 0.487401
+vt 0.748245 0.659094
+vt 0.747608 0.713054
+vt 0.423973 0.844689
+vt 0.359536 0.821095
+vt 0.323740 0.778140
+vt 0.408364 0.776278
+vt 0.082734 0.854822
+vt 0.121890 0.870961
+vt 0.125358 0.964250
+vt 0.095909 0.931223
+vt 0.537687 0.778158
+vt 0.478524 0.776761
+vt 0.536431 0.855051
+vt 0.486341 0.852328
+vt 0.667025 0.770922
+vt 0.597687 0.774520
+vt 0.657343 0.831384
+vt 0.591744 0.848574
+vt 0.206986 0.397387
+vt 0.197738 0.491453
+vt 0.248991 0.385898
+vt 0.234718 0.466345
+vt 0.746971 0.767013
+vt 0.721810 0.818949
+vt 0.906267 0.374916
+vt 0.943591 0.356444
+vt 0.921225 0.425752
+vt 0.891900 0.456772
+vt 0.066459 0.898197
+vt 0.050905 0.830371
+vt 0.449299 0.900840
+vt 0.395331 0.864049
+vt 0.540406 0.938048
+vt 0.503267 0.937631
+vt 0.822147 0.398397
+vt 0.869902 0.391997
+vt 0.862575 0.487791
+vt 0.824985 0.490413
+vt 0.637097 0.904675
+vt 0.577545 0.938465
+vt 0.732077 0.382093
+vt 0.777205 0.395704
+vt 0.787394 0.493034
+vt 0.753838 0.462566
+vt 0.295740 0.370352
+vt 0.271698 0.441237
+vt 0.720281 0.432098
+vt 0.695460 0.360706
+vt 0.696649 0.870884
+vt 0.409030 0.191850
+vt 0.377109 0.180495
+vt 0.364418 0.108175
+vt 0.411558 0.120309
+vt 0.265442 0.707502
+vt 0.264856 0.635425
+vt 0.313344 0.639194
+vt 0.310865 0.709823
+vt 0.497926 0.128083
+vt 0.453570 0.125115
+vt 0.501630 0.204324
+vt 0.453659 0.201619
+vt 0.580806 0.129330
+vt 0.541362 0.127952
+vt 0.581765 0.201442
+vt 0.545377 0.203762
+vt 0.086825 0.160901
+vt 0.057897 0.172487
+vt 0.083178 0.230889
+vt 0.041640 0.239869
+vt 0.623639 0.123471
+vt 0.620759 0.195592
+vt 0.164962 0.144820
+vt 0.121137 0.147854
+vt 0.168900 0.222365
+vt 0.118928 0.223308
+vt 0.249711 0.153161
+vt 0.210390 0.146614
+vt 0.266525 0.225290
+vt 0.217360 0.223077
+vt 0.737780 0.141296
+vt 0.702370 0.141035
+vt 0.734967 0.215285
+vt 0.686504 0.215174
+vt 0.284062 0.151204
+vt 0.301922 0.225335
+vt 0.823341 0.134433
+vt 0.776129 0.134848
+vt 0.829638 0.213642
+vt 0.775617 0.214655
+vt 0.914218 0.141785
+vt 0.871317 0.136315
+vt 0.920921 0.215088
+vt 0.878394 0.214879
+vt 0.071189 0.624477
+vt 0.024838 0.622835
+vt 0.067612 0.695620
+vt 0.030094 0.692690
+vt 0.957830 0.141755
+vt 0.961894 0.214445
+vt 0.167890 0.623661
+vt 0.117015 0.622349
+vt 0.167384 0.702228
+vt 0.114663 0.699269
+vt 0.218664 0.627111
+vt 0.219151 0.704435
+vt 0.389800 0.252815
+vt 0.420475 0.272480
+vt 0.262923 0.786834
+vt 0.308385 0.780451
+vt 0.503684 0.293051
+vt 0.457704 0.288138
+vt 0.583362 0.280328
+vt 0.547869 0.289580
+vt 0.072315 0.307893
+vt 0.025383 0.307251
+vt 0.617880 0.267713
+vt 0.164422 0.310546
+vt 0.114372 0.308672
+vt 0.264258 0.305758
+vt 0.216355 0.310360
+vt 0.726221 0.298995
+vt 0.670638 0.289313
+vt 0.319782 0.299467
+vt 0.826902 0.307054
+vt 0.773455 0.305823
+vt 0.920441 0.296006
+vt 0.879181 0.303697
+vt 0.073925 0.774898
+vt 0.035350 0.762546
+vt 0.965957 0.287136
+vt 0.166992 0.789707
+vt 0.115901 0.784656
+vt 0.217938 0.790346
+vn -0.000458 -0.893429 0.449171
+vn 0.055300 -0.610248 0.790246
+vn -0.064547 -0.700674 0.710532
+vn -0.277657 -0.861965 0.424146
+vn 0.025117 -0.460402 0.887326
+vn -0.104587 -0.502091 0.858425
+vn -0.608142 -0.647328 0.459395
+vn -0.289193 -0.855617 0.429243
+vn -0.245552 -0.717551 0.651753
+vn -0.101962 -0.740623 0.664083
+vn -0.033235 -0.876217 0.480728
+vn -0.261971 -0.524491 0.810083
+vn -0.156255 -0.494888 0.854762
+vn 0.342174 -0.871334 0.351665
+vn 0.102573 -0.674398 0.731162
+vn -0.173009 -0.675924 0.716330
+vn -0.166478 -0.855678 0.489944
+vn 0.325632 -0.485183 0.811487
+vn -0.139470 -0.545610 0.826319
+vn 0.906308 -0.329997 0.263955
+vn 0.803491 -0.309885 0.508255
+vn 0.626576 -0.546129 0.555956
+vn 0.813562 -0.547014 0.197089
+vn -0.709952 -0.626759 0.321055
+vn -0.382336 -0.828883 0.408338
+vn -0.814814 -0.558031 0.156987
+vn -0.573351 -0.787927 0.224494
+vn -0.352458 -0.828303 0.435469
+vn -0.086520 -0.884274 0.458846
+vn 0.032594 -0.854701 0.518052
+vn -0.024628 -0.854793 0.518357
+vn 0.096988 -0.933134 0.346141
+vn -0.208441 -0.894955 0.394391
+vn 0.194739 -0.978637 0.065432
+vn 0.040742 -0.983490 0.176214
+vn 0.496963 -0.867733 -0.003296
+vn 0.435041 -0.898251 0.061739
+vn 0.696524 -0.688223 -0.202857
+vn 0.717368 -0.689627 0.098910
+vn 0.886502 -0.421735 -0.190344
+vn 0.881283 -0.416364 0.223518
+vn -0.826411 -0.484390 -0.286996
+vn -0.711051 -0.701834 -0.042543
+vn -0.774377 -0.271828 -0.571337
+vn -0.801935 -0.551805 -0.228797
+vn -0.394726 -0.791620 -0.466384
+vn -0.560533 -0.827052 0.041993
+vn 0.144292 -0.793420 -0.591296
+vn 0.031800 -0.997986 -0.054506
+vn 0.282876 -0.783563 -0.553148
+vn 0.309793 -0.948973 -0.058443
+vn 0.424207 -0.766015 -0.482955
+vn 0.356090 -0.923399 -0.143193
+vn 0.601459 -0.666128 -0.440992
+vn 0.680746 -0.688894 -0.248909
+vn 0.763604 -0.608386 -0.216163
+vn 0.790307 -0.543107 -0.283517
+vn 0.901578 -0.336894 -0.271310
+vn 0.865658 -0.401715 -0.298654
+vn -0.525956 -0.037873 -0.849635
+vn -0.607715 -0.305216 -0.733116
+vn -0.258553 -0.158513 -0.952879
+vn -0.160375 -0.420515 -0.892972
+vn -0.052736 -0.259133 -0.964385
+vn 0.141789 -0.503708 -0.852138
+vn 0.178076 -0.333140 -0.925871
+vn 0.234626 -0.590381 -0.772240
+vn 0.389843 -0.265542 -0.881741
+vn 0.369762 -0.569262 -0.734275
+vn 0.453230 -0.309091 -0.836085
+vn 0.466109 -0.544511 -0.697287
+vn 0.662984 -0.315744 -0.678732
+vn 0.584490 -0.535691 -0.609424
+vn -0.662099 0.531449 0.528336
+vn -0.733299 0.610950 0.298227
+vn -0.529954 0.389904 0.753044
+vn -0.349071 0.486038 0.801172
+vn -0.869137 0.273385 0.412061
+vn -0.456679 0.141240 0.878323
+vn -0.212561 0.096683 0.972320
+vn -0.085788 0.121128 0.988891
+vn -0.198065 0.438765 0.876492
+vn 0.081637 0.158208 0.984008
+vn 0.065645 0.357799 0.931455
+vn -0.097903 0.412091 0.905850
+vn -0.416089 0.404096 0.814570
+vn 0.315653 0.213202 0.924589
+vn 0.460677 0.300516 0.835109
+vn 0.524155 0.194861 0.829005
+vn 0.548082 0.347758 0.760674
+vn 0.652943 0.234169 0.720237
+vn 0.362194 0.279733 0.889096
+vn 0.628620 0.117161 0.768822
+vn 0.556627 0.340434 0.757775
+vn 0.712302 0.201483 0.672292
+vn 0.683920 0.373241 0.626820
+vn -0.898923 0.403516 0.170537
+vn -0.919614 0.358196 0.161138
+vn -0.851222 0.520402 0.067568
+vn -0.859615 0.353465 0.368877
+vn -0.932096 0.226386 -0.282693
+vn -0.937284 0.335429 -0.094729
+vn -0.152898 0.584216 0.797021
+vn -0.614521 0.449751 0.648091
+vn -0.052950 0.998535 -0.008454
+vn -0.786981 0.616474 -0.023957
+vn 0.792535 0.242164 0.559618
+vn 0.512070 0.552263 0.657826
+vn 0.866909 0.486557 0.108158
+vn 0.710898 0.693350 -0.117710
+vn 0.835597 0.251198 0.488510
+vn 0.710318 0.302072 0.635731
+vn 0.977508 0.195257 0.079501
+vn 0.917234 0.374706 0.135014
+vn -0.489425 0.345836 -0.800531
+vn -0.781030 0.091250 -0.617756
+vn -0.953734 0.271065 -0.129887
+vn -0.822169 0.540605 -0.178106
+vn -0.879330 0.117069 -0.461562
+vn -0.926145 0.068819 -0.370769
+vn -0.062502 0.631581 -0.772759
+vn -0.601520 0.529069 -0.598498
+vn -0.113804 0.357158 -0.927061
+vn -0.156590 0.351482 -0.923002
+vn 0.763756 0.503464 -0.403912
+vn 0.493301 0.608905 -0.621174
+vn 0.522629 0.231819 -0.820399
+vn 0.212256 0.401868 -0.890744
+vn 0.971954 0.173315 -0.158757
+vn 0.830042 0.298166 -0.471236
+vn 0.766472 0.227760 -0.600513
+vn 0.579852 0.306223 -0.754936
+vn -0.545152 0.209479 -0.811701
+vn -0.770409 0.155217 -0.618336
+vn -0.662282 0.076052 -0.745354
+vn -0.196783 0.199957 -0.959807
+vn -0.200873 0.255379 -0.945708
+vn -0.121433 0.261666 -0.957457
+vn -0.073122 0.354381 -0.932218
+vn -0.210395 0.331217 -0.919767
+vn 0.455153 0.298502 -0.838862
+vn 0.102939 0.265511 -0.958586
+vn 0.420392 0.385266 -0.821467
+vn -0.007019 0.375805 -0.926664
+vn 0.508377 0.318949 -0.799860
+vn 0.546312 0.348216 -0.761742
+vn -0.125095 -0.061159 0.990234
+vn -0.578753 -0.006897 0.815455
+vn -0.331950 -0.338145 0.880581
+vn 0.066713 -0.409223 0.909970
+vn -0.907010 -0.018830 0.420606
+vn -0.823817 -0.285928 0.489425
+vn -0.297433 -0.423383 0.855708
+vn -0.144017 -0.405408 0.902707
+vn -0.114017 -0.075777 0.990570
+vn -0.115726 -0.135960 0.983917
+vn 0.460280 -0.197729 0.865444
+vn 0.005615 -0.312479 0.949889
+vn 0.484573 0.047212 0.873440
+vn 0.267647 -0.030061 0.963012
+vn 0.896084 -0.289865 0.336131
+vn 0.800958 -0.227485 0.553789
+vn 0.882504 -0.054598 0.467116
+vn 0.699026 0.088076 0.709616
+vn 0.939634 -0.289438 -0.182318
+vn 0.930937 -0.305155 0.200507
+vn 0.980529 -0.194555 -0.026490
+vn 0.956969 -0.149785 0.248512
+vn 0.925230 -0.175420 -0.336314
+vn 0.874081 -0.288217 -0.390942
+vn 0.741722 -0.210059 -0.636921
+vn 0.856624 -0.224555 -0.464461
+vn 0.343211 -0.213569 -0.914640
+vn 0.759209 -0.183233 -0.624500
+vn 0.635731 -0.254250 -0.728782
+vn 0.709769 -0.189032 -0.678549
+vn 0.232398 -0.171422 -0.957366
+vn 0.308542 -0.203131 -0.929258
+vn -0.112339 -0.182134 -0.976806
+vn 0.328806 -0.315775 -0.890011
+vn -0.397320 -0.072726 -0.914762
+vn -0.067324 -0.127842 -0.989502
+vn -0.418836 0.034639 -0.907376
+vn -0.234046 -0.022279 -0.971954
+vn -0.751701 -0.000275 -0.659474
+vn -0.591540 -0.011872 -0.806146
+vn -0.820490 0.138951 -0.554491
+vn -0.622639 0.074587 -0.778924
+vn -0.998657 -0.051271 0.000488
+vn -0.954497 -0.020478 -0.297464
+vn -0.978698 0.092044 -0.183416
+vn -0.938444 0.185736 -0.291177
+vn -0.962188 -0.224128 0.154698
+vn -0.999817 0.000000 -0.018433
+vn -0.375439 0.127964 0.917936
+vn -0.130985 0.155187 0.979156
+vn -0.868191 0.104648 0.485061
+vn -0.142186 0.168462 0.975372
+vn -0.135472 0.128697 0.982360
+vn 0.649617 0.189245 0.736290
+vn 0.255135 0.185492 0.948912
+vn 0.667287 0.146306 0.730247
+vn 0.598682 0.172765 0.782098
+vn 0.998871 0.043519 -0.017823
+vn 0.931303 0.091037 0.352641
+vn 0.907346 -0.148503 -0.393200
+vn 0.938169 -0.031648 -0.344707
+vn 0.576159 -0.029176 -0.816797
+vn 0.803064 -0.094638 -0.588305
+vn -0.263741 0.144627 -0.953673
+vn 0.197882 0.091342 -0.975951
+vn -0.565874 0.111332 -0.816919
+vn -0.400647 0.105472 -0.910123
+vn -0.859279 0.203131 -0.469405
+vn -0.712546 0.146855 -0.686026
+vn -0.941923 0.151311 -0.299692
+vn -0.911222 0.177038 -0.371868
+vn -0.990600 0.115970 -0.072146
+s 1
+f 1/1/1 2/2/2 3/3/3
+f 4/4/4 1/1/1 3/3/3
+f 5/5/5 6/6/6 3/7/3
+f 3/7/3 2/8/2 5/5/5
+f 7/9/7 4/10/4 3/11/3
+f 3/11/3 6/12/6 7/9/7
+f 8/13/8 9/14/9 10/15/10
+f 10/15/10 11/16/11 8/13/8
+f 12/17/12 13/18/13 10/19/10
+f 10/19/10 9/20/9 12/17/12
+f 5/5/5 2/8/2 10/19/10
+f 10/19/10 13/18/13 5/5/5
+f 1/1/1 11/16/11 10/15/10
+f 2/2/2 1/1/1 10/15/10
+f 14/21/14 15/22/15 16/23/16
+f 16/23/16 17/24/17 14/21/14
+f 18/25/18 19/26/19 16/27/16
+f 16/27/16 15/28/15 18/25/18
+f 12/17/12 9/20/9 16/27/16
+f 16/27/16 19/26/19 12/17/12
+f 8/13/8 17/24/17 16/23/16
+f 16/23/16 9/14/9 8/13/8
+f 20/29/20 21/30/21 22/31/22
+f 22/31/22 23/32/23 20/29/20
+f 18/25/18 15/28/15 22/33/22
+f 22/33/22 21/34/21 18/25/18
+f 14/21/14 23/35/23 22/36/22
+f 22/36/22 15/22/15 14/21/14
+f 7/9/7 24/37/24 25/38/25
+f 25/38/25 4/10/4 7/9/7
+f 26/39/26 27/40/27 25/38/25
+f 25/38/25 24/37/24 26/39/26
+f 28/41/28 29/42/29 25/43/25
+f 25/43/25 27/44/27 28/41/28
+f 1/1/1 4/4/4 25/43/25
+f 29/42/29 1/1/1 25/43/25
+f 28/41/28 30/45/30 31/46/31
+f 31/46/31 29/42/29 28/41/28
+f 32/47/32 33/48/33 31/46/31
+f 31/46/31 30/45/30 32/47/32
+f 8/13/8 11/16/11 31/46/31
+f 31/46/31 33/48/33 8/13/8
+f 1/1/1 29/42/29 31/46/31
+f 11/16/11 1/1/1 31/46/31
+f 32/47/32 34/49/34 35/50/35
+f 35/50/35 33/48/33 32/47/32
+f 36/51/36 37/52/37 35/50/35
+f 35/50/35 34/49/34 36/51/36
+f 14/21/14 17/24/17 35/50/35
+f 35/50/35 37/52/37 14/21/14
+f 8/13/8 33/48/33 35/50/35
+f 35/50/35 17/24/17 8/13/8
+f 36/51/36 38/53/38 39/54/39
+f 39/54/39 37/52/37 36/51/36
+f 40/55/40 41/56/41 39/57/39
+f 39/57/39 38/58/38 40/55/40
+f 20/29/20 23/32/23 39/57/39
+f 39/57/39 41/56/41 20/29/20
+f 14/21/14 37/52/37 39/54/39
+f 39/54/39 23/35/23 14/21/14
+f 26/39/26 42/59/42 43/60/43
+f 43/60/43 27/40/27 26/39/26
+f 44/61/44 45/62/45 43/60/43
+f 43/60/43 42/59/42 44/61/44
+f 46/63/46 47/64/47 43/65/43
+f 43/65/43 45/66/45 46/63/46
+f 28/41/28 27/44/27 43/65/43
+f 43/65/43 47/64/47 28/41/28
+f 46/63/46 48/67/48 49/68/49
+f 49/68/49 47/64/47 46/63/46
+f 50/69/50 51/70/51 49/68/49
+f 49/68/49 48/67/48 50/69/50
+f 32/47/32 30/45/30 49/68/49
+f 49/68/49 51/70/51 32/47/32
+f 28/41/28 47/64/47 49/68/49
+f 49/68/49 30/45/30 28/41/28
+f 50/69/50 52/71/52 53/72/53
+f 53/72/53 51/70/51 50/69/50
+f 54/73/54 55/74/55 53/72/53
+f 53/72/53 52/71/52 54/73/54
+f 36/51/36 34/49/34 53/72/53
+f 53/72/53 55/74/55 36/51/36
+f 32/47/32 51/70/51 53/72/53
+f 53/72/53 34/49/34 32/47/32
+f 54/73/54 56/75/56 57/76/57
+f 57/76/57 55/74/55 54/73/54
+f 58/77/58 59/78/59 57/79/57
+f 57/79/57 56/80/56 58/77/58
+f 40/55/40 38/58/38 57/79/57
+f 57/79/57 59/78/59 40/55/40
+f 36/51/36 55/74/55 57/76/57
+f 57/76/57 38/53/38 36/51/36
+f 44/61/44 60/81/60 61/82/61
+f 61/82/61 45/62/45 44/61/44
+f 62/83/62 63/84/63 61/85/61
+f 61/85/61 60/86/60 62/83/62
+f 46/63/46 45/66/45 61/87/61
+f 61/87/61 63/88/63 46/63/46
+f 62/83/62 64/89/64 65/90/65
+f 65/90/65 63/84/63 62/83/62
+f 66/91/66 67/92/67 65/90/65
+f 65/90/65 64/89/64 66/91/66
+f 50/69/50 48/67/48 65/93/65
+f 65/93/65 67/94/67 50/69/50
+f 46/63/46 63/88/63 65/93/65
+f 65/93/65 48/67/48 46/63/46
+f 66/91/66 68/95/68 69/96/69
+f 69/96/69 67/92/67 66/91/66
+f 70/97/70 71/98/71 69/96/69
+f 69/96/69 68/95/68 70/97/70
+f 54/73/54 52/71/52 69/99/69
+f 69/99/69 71/100/71 54/73/54
+f 50/69/50 67/94/67 69/99/69
+f 69/99/69 52/71/52 50/69/50
+f 70/97/70 72/101/72 73/102/73
+f 73/102/73 71/98/71 70/97/70
+f 58/77/58 56/80/56 73/103/73
+f 73/103/73 72/104/72 58/77/58
+f 54/73/54 71/100/71 73/105/73
+f 73/105/73 56/75/56 54/73/54
+f 74/106/74 75/107/75 76/108/76
+f 76/108/76 77/109/77 74/106/74
+f 78/110/78 79/111/79 76/112/76
+f 76/112/76 75/113/75 78/110/78
+f 80/114/80 77/115/77 76/116/76
+f 76/116/76 79/117/79 80/114/80
+f 80/114/80 81/118/81 82/119/82
+f 82/119/82 77/115/77 80/114/80
+f 83/120/83 84/121/84 82/119/82
+f 82/119/82 81/118/81 83/120/83
+f 85/122/85 86/123/86 82/124/82
+f 82/124/82 84/125/84 85/122/85
+f 74/106/74 77/109/77 82/124/82
+f 82/124/82 86/123/86 74/106/74
+f 83/120/83 87/126/87 88/127/88
+f 88/127/88 84/121/84 83/120/83
+f 89/128/89 90/129/90 88/127/88
+f 88/127/88 87/126/87 89/128/89
+f 91/130/91 92/131/92 88/132/88
+f 88/132/88 90/133/90 91/130/91
+f 85/122/85 84/125/84 88/132/88
+f 88/132/88 92/131/92 85/122/85
+f 89/128/89 93/134/93 94/135/94
+f 94/135/94 90/129/90 89/128/89
+f 95/136/95 96/137/96 94/138/94
+f 94/138/94 93/139/93 95/136/95
+f 91/130/91 90/133/90 94/140/94
+f 94/140/94 96/141/96 91/130/91
+f 97/142/97 98/143/98 99/144/99
+f 99/144/99 100/145/100 97/142/97
+f 101/146/101 102/147/102 99/148/99
+f 99/148/99 98/149/98 101/146/101
+f 78/110/78 75/113/75 99/148/99
+f 99/148/99 102/147/102 78/110/78
+f 74/106/74 100/145/100 99/144/99
+f 99/144/99 75/107/75 74/106/74
+f 85/122/85 103/150/103 104/151/104
+f 104/151/104 86/123/86 85/122/85
+f 105/152/105 106/153/106 104/151/104
+f 104/151/104 103/150/103 105/152/105
+f 97/142/97 100/145/100 104/151/104
+f 104/151/104 106/153/106 97/142/97
+f 74/106/74 86/123/86 104/151/104
+f 104/151/104 100/145/100 74/106/74
+f 91/130/91 107/154/107 108/155/108
+f 108/155/108 92/131/92 91/130/91
+f 109/156/109 110/157/110 108/155/108
+f 108/155/108 107/154/107 109/156/109
+f 105/152/105 103/150/103 108/155/108
+f 108/155/108 110/157/110 105/152/105
+f 85/122/85 92/131/92 108/155/108
+f 108/155/108 103/150/103 85/122/85
+f 95/136/95 111/158/111 112/159/112
+f 112/159/112 96/137/96 95/136/95
+f 113/160/113 114/161/114 112/159/112
+f 112/159/112 111/158/111 113/160/113
+f 109/156/109 107/154/107 112/162/112
+f 112/162/112 114/163/114 109/156/109
+f 91/130/91 96/141/96 112/162/112
+f 112/162/112 107/154/107 91/130/91
+f 115/164/115 116/165/116 117/166/117
+f 117/166/117 118/167/118 115/164/115
+f 119/168/119 120/169/120 117/170/117
+f 117/170/117 116/171/116 119/168/119
+f 101/146/101 98/149/98 117/170/117
+f 117/170/117 120/169/120 101/146/101
+f 97/142/97 118/167/118 117/166/117
+f 117/166/117 98/143/98 97/142/97
+f 105/152/105 121/172/121 122/173/122
+f 122/173/122 106/153/106 105/152/105
+f 123/174/123 124/175/124 122/173/122
+f 122/173/122 121/172/121 123/174/123
+f 115/164/115 118/167/118 122/173/122
+f 122/173/122 124/175/124 115/164/115
+f 97/142/97 106/153/106 122/173/122
+f 122/173/122 118/167/118 97/142/97
+f 109/156/109 125/176/125 126/177/126
+f 126/177/126 110/157/110 109/156/109
+f 127/178/127 128/179/128 126/177/126
+f 126/177/126 125/176/125 127/178/127
+f 123/174/123 121/172/121 126/177/126
+f 126/177/126 128/179/128 123/174/123
+f 105/152/105 110/157/110 126/177/126
+f 126/177/126 121/172/121 105/152/105
+f 113/160/113 129/180/129 130/181/130
+f 130/181/130 114/161/114 113/160/113
+f 131/182/131 132/183/132 130/181/130
+f 130/181/130 129/180/129 131/182/131
+f 127/178/127 125/176/125 130/184/130
+f 130/184/130 132/185/132 127/178/127
+f 109/156/109 114/163/114 130/184/130
+f 130/184/130 125/176/125 109/156/109
+f 133/186/133 134/187/134 135/188/135
+f 135/188/135 136/189/136 133/186/133
+f 119/168/119 116/171/116 135/190/135
+f 135/190/135 134/191/134 119/168/119
+f 115/164/115 136/192/136 135/193/135
+f 135/193/135 116/165/116 115/164/115
+f 123/174/123 137/194/137 138/195/138
+f 138/195/138 124/175/124 123/174/123
+f 139/196/139 140/197/140 138/198/138
+f 138/198/138 137/199/137 139/196/139
+f 133/186/133 136/189/136 138/198/138
+f 138/198/138 140/197/140 133/186/133
+f 115/164/115 124/175/124 138/195/138
+f 138/195/138 136/192/136 115/164/115
+f 127/178/127 141/200/141 142/201/142
+f 142/201/142 128/179/128 127/178/127
+f 143/202/143 144/203/144 142/204/142
+f 142/204/142 141/205/141 143/202/143
+f 139/196/139 137/199/137 142/204/142
+f 142/204/142 144/203/144 139/196/139
+f 123/174/123 128/179/128 142/201/142
+f 142/201/142 137/194/137 123/174/123
+f 131/182/131 145/206/145 146/207/146
+f 146/207/146 132/183/132 131/182/131
+f 143/202/143 141/205/141 146/208/146
+f 146/208/146 145/209/145 143/202/143
+f 127/178/127 132/185/132 146/210/146
+f 146/210/146 141/200/141 127/178/127
+f 147/211/147 148/212/148 149/213/149
+f 149/213/149 150/214/150 147/211/147
+f 151/215/151 152/216/152 149/217/149
+f 149/217/149 148/218/148 151/215/151
+f 7/9/7 6/12/6 149/217/149
+f 149/217/149 152/216/152 7/9/7
+f 5/5/5 150/214/150 149/213/149
+f 149/213/149 6/6/6 5/5/5
+f 12/17/12 153/219/153 154/220/154
+f 154/220/154 13/18/13 12/17/12
+f 155/221/155 156/222/156 154/220/154
+f 154/220/154 153/219/153 155/221/155
+f 147/211/147 150/214/150 154/220/154
+f 154/220/154 156/222/156 147/211/147
+f 5/5/5 13/18/13 154/220/154
+f 154/220/154 150/214/150 5/5/5
+f 18/25/18 157/223/157 158/224/158
+f 158/224/158 19/26/19 18/25/18
+f 159/225/159 160/226/160 158/224/158
+f 158/224/158 157/223/157 159/225/159
+f 155/221/155 153/219/153 158/224/158
+f 158/224/158 160/226/160 155/221/155
+f 12/17/12 19/26/19 158/224/158
+f 158/224/158 153/219/153 12/17/12
+f 20/29/20 161/227/161 162/228/162
+f 162/228/162 21/30/21 20/29/20
+f 163/229/163 164/230/164 162/228/162
+f 162/228/162 161/227/161 163/229/163
+f 159/225/159 157/223/157 162/231/162
+f 162/231/162 164/232/164 159/225/159
+f 18/25/18 21/34/21 162/231/162
+f 162/231/162 157/223/157 18/25/18
+f 40/55/40 165/233/165 166/234/166
+f 166/234/166 41/56/41 40/55/40
+f 167/235/167 168/236/168 166/234/166
+f 166/234/166 165/233/165 167/235/167
+f 163/229/163 161/227/161 166/234/166
+f 166/234/166 168/236/168 163/229/163
+f 20/29/20 41/56/41 166/234/166
+f 166/234/166 161/227/161 20/29/20
+f 58/77/58 169/237/169 170/238/170
+f 170/238/170 59/78/59 58/77/58
+f 171/239/171 172/240/172 170/238/170
+f 170/238/170 169/237/169 171/239/171
+f 167/235/167 165/233/165 170/238/170
+f 170/238/170 172/240/172 167/235/167
+f 40/55/40 59/78/59 170/238/170
+f 170/238/170 165/233/165 40/55/40
+f 70/97/70 173/241/173 174/242/174
+f 174/242/174 72/101/72 70/97/70
+f 175/243/175 176/244/176 174/242/174
+f 174/242/174 173/241/173 175/243/175
+f 171/239/171 169/237/169 174/245/174
+f 174/245/174 176/246/176 171/239/171
+f 58/77/58 72/104/72 174/245/174
+f 174/245/174 169/237/169 58/77/58
+f 66/91/66 177/247/177 178/248/178
+f 178/248/178 68/95/68 66/91/66
+f 179/249/179 180/250/180 178/248/178
+f 178/248/178 177/247/177 179/249/179
+f 175/243/175 173/241/173 178/248/178
+f 178/248/178 180/250/180 175/243/175
+f 70/97/70 68/95/68 178/248/178
+f 178/248/178 173/241/173 70/97/70
+f 62/83/62 181/251/181 182/252/182
+f 182/252/182 64/89/64 62/83/62
+f 183/253/183 184/254/184 182/252/182
+f 182/252/182 181/251/181 183/253/183
+f 179/249/179 177/247/177 182/252/182
+f 182/252/182 184/254/184 179/249/179
+f 66/91/66 64/89/64 182/252/182
+f 182/252/182 177/247/177 66/91/66
+f 44/61/44 185/255/185 186/256/186
+f 186/256/186 60/81/60 44/61/44
+f 187/257/187 188/258/188 186/256/186
+f 186/256/186 185/255/185 187/257/187
+f 183/253/183 181/251/181 186/259/186
+f 186/259/186 188/260/188 183/253/183
+f 62/83/62 60/86/60 186/259/186
+f 186/259/186 181/251/181 62/83/62
+f 26/39/26 189/261/189 190/262/190
+f 190/262/190 42/59/42 26/39/26
+f 191/263/191 192/264/192 190/262/190
+f 190/262/190 189/261/189 191/263/191
+f 187/257/187 185/255/185 190/262/190
+f 190/262/190 192/264/192 187/257/187
+f 44/61/44 42/59/42 190/262/190
+f 190/262/190 185/255/185 44/61/44
+f 7/9/7 152/216/152 193/265/193
+f 193/265/193 24/37/24 7/9/7
+f 151/215/151 194/266/194 193/265/193
+f 193/265/193 152/216/152 151/215/151
+f 191/263/191 189/261/189 193/265/193
+f 193/265/193 194/266/194 191/263/191
+f 26/39/26 24/37/24 193/265/193
+f 193/265/193 189/261/189 26/39/26
+f 80/114/80 79/117/79 195/267/195
+f 195/267/195 196/268/196 80/114/80
+f 78/110/78 197/269/197 195/270/195
+f 195/270/195 79/111/79 78/110/78
+f 151/215/151 148/218/148 195/270/195
+f 195/270/195 197/269/197 151/215/151
+f 147/211/147 196/268/196 195/267/195
+f 195/267/195 148/212/148 147/211/147
+f 155/221/155 198/271/198 199/272/199
+f 199/272/199 156/222/156 155/221/155
+f 83/120/83 81/118/81 199/272/199
+f 199/272/199 198/271/198 83/120/83
+f 80/114/80 196/268/196 199/272/199
+f 199/272/199 81/118/81 80/114/80
+f 147/211/147 156/222/156 199/272/199
+f 199/272/199 196/268/196 147/211/147
+f 159/225/159 200/273/200 201/274/201
+f 201/274/201 160/226/160 159/225/159
+f 89/128/89 87/126/87 201/274/201
+f 201/274/201 200/273/200 89/128/89
+f 83/120/83 198/271/198 201/274/201
+f 201/274/201 87/126/87 83/120/83
+f 155/221/155 160/226/160 201/274/201
+f 201/274/201 198/271/198 155/221/155
+f 163/229/163 202/275/202 203/276/203
+f 203/276/203 164/230/164 163/229/163
+f 95/136/95 93/139/93 203/276/203
+f 203/276/203 202/275/202 95/136/95
+f 89/128/89 200/273/200 203/277/203
+f 203/277/203 93/134/93 89/128/89
+f 159/225/159 164/232/164 203/277/203
+f 203/277/203 200/273/200 159/225/159
+f 167/235/167 204/278/204 205/279/205
+f 205/279/205 168/236/168 167/235/167
+f 113/160/113 111/158/111 205/279/205
+f 205/279/205 204/278/204 113/160/113
+f 95/136/95 202/275/202 205/279/205
+f 205/279/205 111/158/111 95/136/95
+f 163/229/163 168/236/168 205/279/205
+f 205/279/205 202/275/202 163/229/163
+f 171/239/171 206/280/206 207/281/207
+f 207/281/207 172/240/172 171/239/171
+f 131/182/131 129/180/129 207/281/207
+f 207/281/207 206/280/206 131/182/131
+f 113/160/113 204/278/204 207/281/207
+f 207/281/207 129/180/129 113/160/113
+f 167/235/167 172/240/172 207/281/207
+f 207/281/207 204/278/204 167/235/167
+f 175/243/175 208/282/208 209/283/209
+f 209/283/209 176/244/176 175/243/175
+f 143/202/143 145/209/145 209/283/209
+f 209/283/209 208/282/208 143/202/143
+f 131/182/131 206/280/206 209/284/209
+f 209/284/209 145/206/145 131/182/131
+f 171/239/171 176/246/176 209/284/209
+f 209/284/209 206/280/206 171/239/171
+f 179/249/179 210/285/210 211/286/211
+f 211/286/211 180/250/180 179/249/179
+f 139/196/139 144/203/144 211/286/211
+f 211/286/211 210/285/210 139/196/139
+f 143/202/143 208/282/208 211/286/211
+f 211/286/211 144/203/144 143/202/143
+f 175/243/175 180/250/180 211/286/211
+f 211/286/211 208/282/208 175/243/175
+f 183/253/183 212/287/212 213/288/213
+f 213/288/213 184/254/184 183/253/183
+f 133/186/133 140/197/140 213/288/213
+f 213/288/213 212/287/212 133/186/133
+f 139/196/139 210/285/210 213/288/213
+f 213/288/213 140/197/140 139/196/139
+f 179/249/179 184/254/184 213/288/213
+f 213/288/213 210/285/210 179/249/179
+f 187/257/187 214/289/214 215/290/215
+f 215/290/215 188/258/188 187/257/187
+f 119/168/119 134/191/134 215/290/215
+f 215/290/215 214/289/214 119/168/119
+f 133/186/133 212/287/212 215/291/215
+f 215/291/215 134/187/134 133/186/133
+f 183/253/183 188/260/188 215/291/215
+f 215/291/215 212/287/212 183/253/183
+f 191/263/191 216/292/216 217/293/217
+f 217/293/217 192/264/192 191/263/191
+f 101/146/101 120/169/120 217/293/217
+f 217/293/217 216/292/216 101/146/101
+f 119/168/119 214/289/214 217/293/217
+f 217/293/217 120/169/120 119/168/119
+f 187/257/187 192/264/192 217/293/217
+f 217/293/217 214/289/214 187/257/187
+f 151/215/151 197/269/197 218/294/218
+f 218/294/218 194/266/194 151/215/151
+f 78/110/78 102/147/102 218/294/218
+f 218/294/218 197/269/197 78/110/78
+f 101/146/101 216/292/216 218/294/218
+f 218/294/218 102/147/102 101/146/101
+f 191/263/191 194/266/194 218/294/218
+f 218/294/218 216/292/216 191/263/191
diff --git a/09-september/resources/crate.obj b/09-september/resources/crate.obj
new file mode 100644
index 0000000..5954600
--- /dev/null
+++ b/09-september/resources/crate.obj
@@ -0,0 +1,396 @@
+# Blender v2.67 (sub 0) OBJ File: ''
+# www.blender.org
+o Wood_container1
+v -83.000000 -83.000015 95.999985
+v 83.000000 -83.000015 95.999985
+v 83.000000 82.999985 96.000015
+v -83.000000 82.999985 96.000015
+v -83.000000 -82.999985 -96.000015
+v -83.000000 83.000015 -95.999985
+v 83.000000 83.000015 -95.999985
+v 83.000000 -82.999985 -96.000015
+v -83.000000 -96.000015 82.999985
+v -83.000000 -95.999985 -83.000015
+v 83.000000 -95.999985 -83.000015
+v 83.000000 -96.000015 82.999985
+v 96.000000 -83.000015 82.999985
+v 96.000000 -82.999985 -83.000015
+v 96.000000 83.000015 -82.999985
+v 96.000000 82.999985 83.000015
+v 83.000000 95.999985 83.000015
+v 83.000000 96.000015 -82.999985
+v -83.000000 96.000015 -82.999985
+v -83.000000 95.999985 83.000015
+v -96.000000 82.999985 83.000015
+v -96.000000 83.000015 -82.999985
+v -96.000000 -82.999985 -83.000015
+v -96.000000 -83.000015 82.999985
+v -100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 83.000000 -83.000015 99.999985
+v -83.000000 -83.000015 99.999985
+v 100.000000 99.999985 100.000015
+v 83.000000 82.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 100.000015 -99.999985
+v -83.000000 83.000015 -99.999985
+v -83.000000 -82.999985 -100.000015
+v 100.000000 100.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 100.000000 -99.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v -83.000000 -99.999985 -83.000015
+v -83.000000 -100.000015 82.999985
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -100.000015 82.999985
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -83.000015 82.999985
+v 100.000000 83.000015 -82.999985
+v 100.000000 82.999985 83.000015
+v 83.000000 100.000015 -82.999985
+v 83.000000 99.999985 83.000015
+v -83.000000 100.000015 -82.999985
+v -83.000000 99.999985 83.000015
+v -100.000000 83.000015 -82.999985
+v -100.000000 82.999985 83.000015
+v -100.000000 -82.999985 -83.000015
+v -100.000000 -83.000015 82.999985
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -100.000000 99.999985 100.000015
+v -83.000000 99.999985 83.000015
+v -83.000000 99.999985 83.000015
+v -83.000000 99.999985 83.000015
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -100.000000 100.000015 -99.999985
+v -83.000000 100.000015 -82.999985
+v -83.000000 100.000015 -82.999985
+v -83.000000 100.000015 -82.999985
+v 83.000000 100.000015 -82.999985
+v 83.000000 100.000015 -82.999985
+v 83.000000 100.000015 -82.999985
+v 83.000000 99.999985 83.000015
+v 83.000000 99.999985 83.000015
+v 83.000000 99.999985 83.000015
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -99.999985 -83.000015
+v 83.000000 -100.000015 82.999985
+v 83.000000 -100.000015 82.999985
+v 83.000000 -100.000015 82.999985
+v 83.000000 96.000015 -82.999985
+v 83.000000 96.000015 -82.999985
+v -83.000000 96.000015 -82.999985
+v -83.000000 96.000015 -82.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -100.000000 -100.000015 99.999985
+v -83.000000 -100.000015 82.999985
+v -83.000000 -100.000015 82.999985
+v -83.000000 -100.000015 82.999985
+v -96.000000 83.000015 -82.999985
+v -96.000000 83.000015 -82.999985
+v -100.000000 83.000015 -82.999985
+v -100.000000 83.000015 -82.999985
+v -100.000000 83.000015 -82.999985
+v -83.000000 -82.999985 -96.000015
+v -83.000000 -82.999985 -96.000015
+v -83.000000 -82.999985 -100.000015
+v -83.000000 -82.999985 -100.000015
+v -83.000000 -82.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 100.000000 -99.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v 83.000000 -82.999985 -100.000015
+v 83.000000 82.999985 100.000015
+v 83.000000 82.999985 100.000015
+v 83.000000 82.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -83.000000 82.999985 100.000015
+v -96.000000 -82.999985 -83.000015
+v -96.000000 -82.999985 -83.000015
+v -83.000000 95.999985 83.000015
+v -83.000000 95.999985 83.000015
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 100.000000 100.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 83.000000 83.000015 -99.999985
+v 96.000000 82.999985 83.000015
+v 96.000000 82.999985 83.000015
+v 100.000000 82.999985 83.000015
+v 100.000000 82.999985 83.000015
+v 100.000000 82.999985 83.000015
+v 83.000000 -82.999985 -96.000015
+v 83.000000 -82.999985 -96.000015
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -82.999985 -83.000015
+v 100.000000 -83.000015 82.999985
+v 100.000000 -83.000015 82.999985
+v 100.000000 -83.000015 82.999985
+v -83.000000 -99.999985 -83.000015
+v -83.000000 -99.999985 -83.000015
+v -83.000000 -99.999985 -83.000015
+v 96.000000 -83.000015 82.999985
+v 96.000000 -83.000015 82.999985
+v 83.000000 -83.000015 99.999985
+v 83.000000 -83.000015 99.999985
+v 83.000000 -83.000015 99.999985
+v 96.000000 83.000015 -82.999985
+v 96.000000 83.000015 -82.999985
+v 100.000000 83.000015 -82.999985
+v 100.000000 83.000015 -82.999985
+v 100.000000 83.000015 -82.999985
+v -83.000000 -96.000015 82.999985
+v -83.000000 -96.000015 82.999985
+v -83.000000 83.000015 -95.999985
+v -83.000000 83.000015 -95.999985
+v -100.000000 -82.999985 -83.000015
+v -100.000000 -82.999985 -83.000015
+v -100.000000 -82.999985 -83.000015
+v -83.000000 83.000015 -99.999985
+v -83.000000 83.000015 -99.999985
+v -83.000000 83.000015 -99.999985
+v -83.000000 -95.999985 -83.000015
+v -83.000000 -95.999985 -83.000015
+v -96.000000 82.999985 83.000015
+v -96.000000 82.999985 83.000015
+v -96.000000 -83.000015 82.999985
+v -96.000000 -83.000015 82.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v 100.000000 -100.000015 99.999985
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v -100.000000 -99.999985 -100.000015
+v 83.000000 83.000015 -95.999985
+v 83.000000 83.000015 -95.999985
+v 83.000000 82.999985 96.000015
+v 83.000000 82.999985 96.000015
+v -100.000000 82.999985 83.000015
+v -100.000000 82.999985 83.000015
+v -100.000000 82.999985 83.000015
+v -83.000000 -83.000015 99.999985
+v -83.000000 -83.000015 99.999985
+v -83.000000 -83.000015 99.999985
+v 96.000000 -82.999985 -83.000015
+v 96.000000 -82.999985 -83.000015
+v 83.000000 95.999985 83.000015
+v 83.000000 95.999985 83.000015
+v -83.000000 -83.000015 95.999985
+v -83.000000 -83.000015 95.999985
+v -83.000000 82.999985 96.000015
+v -83.000000 82.999985 96.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 100.000000 99.999985 100.000015
+v 83.000000 -95.999985 -83.000015
+v 83.000000 -95.999985 -83.000015
+v -100.000000 -83.000015 82.999985
+v -100.000000 -83.000015 82.999985
+v -100.000000 -83.000015 82.999985
+v 83.000000 -83.000015 95.999985
+v 83.000000 -83.000015 95.999985
+v 83.000000 -96.000015 82.999985
+v 83.000000 -96.000015 82.999985
+vt 0.056200 0.549000
+vt 0.454300 0.549000
+vt 0.454300 0.947100
+vt 0.056200 0.947100
+vt 0.947600 0.452400
+vt 0.947600 0.058200
+vt 0.553400 0.058200
+vt 0.553400 0.550900
+vt 0.947700 0.550900
+vt 0.947700 0.945200
+vt 0.058100 0.452400
+vt 0.058100 0.058200
+vt 0.452300 0.058200
+vt 0.553400 0.945200
+vt 0.013000 0.505800
+vt 0.497500 0.505800
+vt 0.456300 0.547000
+vt 0.497500 0.990300
+vt 0.456300 0.949100
+vt 0.013000 0.990300
+vt 0.054200 0.949100
+vt 0.054200 0.547000
+vt 0.992800 0.497600
+vt 0.992800 0.013100
+vt 0.951600 0.456400
+vt 0.508300 0.013100
+vt 0.549400 0.054200
+vt 0.508300 0.497600
+vt 0.508300 0.505800
+vt 0.992800 0.505800
+vt 0.951600 0.547000
+vt 0.992800 0.990300
+vt 0.951600 0.949100
+vt 0.508300 0.990300
+vt 0.549500 0.949100
+vt 0.549500 0.547000
+vt 0.012900 0.497600
+vt 0.012900 0.013100
+vt 0.054100 0.456400
+vt 0.497400 0.013100
+vt 0.456300 0.054200
+vt 0.497400 0.497600
+vt 0.489900 0.528500
+vt 0.014400 0.528500
+vt 0.014400 0.510300
+vt 0.489900 0.510300
+vt 0.489900 0.528600
+vt 0.014400 0.528600
+vt 0.014400 0.510400
+vt 0.489900 0.510400
+vt 0.553400 0.452400
+vt 0.452300 0.452400
+vt 0.951600 0.054200
+vt 0.549400 0.456400
+vt 0.054100 0.054200
+vt 0.456300 0.456400
+vn 0.000000 0.000000 0.999969
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 -0.999969
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -0.999969 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.999969 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.999969 0.000000
+vn 0.000000 1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.999969 0.000000 0.000000
+s 1
+f 1/1/1 2/2/2 187/3/1
+f 102/2/3 6/3/4 7/4/3
+f 159/5/5 169/6/6 208/7/5
+f 13/8/7 195/9/8 154/10/7
+f 17/11/9 18/12/10 19/13/9
+f 21/14/11 97/10/12 24/8/12
+f 90/15/2 175/16/2 151/17/2
+f 177/16/2 204/18/2 115/19/2
+f 205/18/2 59/20/2 32/21/2
+f 57/20/2 89/15/2 28/22/2
+f 33/16/4 65/18/4 105/17/4
+f 67/18/4 37/20/4 38/21/4
+f 125/20/4 39/15/4 131/21/4
+f 108/15/4 180/16/4 104/17/4
+f 25/23/6 181/24/6 42/25/6
+f 183/24/6 110/26/6 79/27/6
+f 109/26/6 26/28/6 43/27/6
+f 178/28/6 92/23/6 94/25/6
+f 176/29/8 107/30/8 45/31/8
+f 111/30/8 126/32/8 156/33/8
+f 128/32/8 203/34/8 135/35/8
+f 207/34/8 179/29/8 144/36/8
+f 29/37/10 127/38/10 50/39/10
+f 129/38/10 34/40/10 51/41/10
+f 66/40/10 31/42/10 71/41/10
+f 60/42/10 206/37/10 76/39/10
+f 58/34/11 68/32/11 189/35/11
+f 69/32/11 182/30/11 100/33/11
+f 184/30/11 91/29/11 164/31/11
+f 93/29/11 61/34/11 211/36/11
+f 213/43/9 199/44/10 193/45/9
+f 153/45/11 116/46/11 214/44/11
+f 117/45/5 119/46/6 201/43/5
+f 200/43/8 202/44/8 120/45/8
+f 36/47/8 167/48/8 161/49/8
+f 168/43/5 130/44/6 185/49/5
+f 132/47/11 112/48/11 186/50/11
+f 114/47/9 106/48/10 103/49/9
+f 95/47/8 146/48/8 10/49/8
+f 148/43/1 80/44/2 11/45/1
+f 81/49/11 83/50/11 209/48/11
+f 84/49/3 96/50/4 160/47/3
+f 143/43/9 140/44/10 14/45/9
+f 142/49/1 47/50/2 15/47/1
+f 158/49/5 48/50/6 16/47/5
+f 137/49/3 145/50/4 150/47/3
+f 77/43/11 73/44/11 197/46/11
+f 75/49/1 70/50/2 87/47/1
+f 72/49/8 62/50/8 20/47/8
+f 64/47/3 78/48/4 198/49/3
+f 54/47/5 53/48/6 22/49/5
+f 101/47/1 55/48/2 121/49/1
+f 165/49/9 210/50/10 173/47/9
+f 212/43/3 191/44/4 172/49/3
+f 4/4/2 1/1/1 187/3/1
+f 138/1/4 102/2/3 7/4/3
+f 12/51/6 159/5/5 208/7/5
+f 133/14/8 13/8/7 154/10/7
+f 123/52/10 17/11/9 19/13/9
+f 97/10/12 23/9/11 24/8/12
+f 192/22/2 90/15/2 151/17/2
+f 27/17/2 177/16/2 115/19/2
+f 30/19/2 205/18/2 32/21/2
+f 118/21/2 57/20/2 28/22/2
+f 65/18/4 166/19/4 105/17/4
+f 35/19/4 67/18/4 38/21/4
+f 39/15/4 40/22/4 131/21/4
+f 113/22/4 108/15/4 104/17/4
+f 181/24/6 147/53/6 42/25/6
+f 41/53/6 183/24/6 79/27/6
+f 26/28/6 44/54/6 43/27/6
+f 82/54/6 178/28/6 94/25/6
+f 46/36/8 176/29/8 45/31/8
+f 141/31/8 111/30/8 156/33/8
+f 157/33/8 128/32/8 135/35/8
+f 136/35/8 207/34/8 144/36/8
+f 127/38/10 49/55/10 50/39/10
+f 74/55/10 129/38/10 51/41/10
+f 31/42/10 52/56/10 71/41/10
+f 63/56/10 60/42/10 76/39/10
+f 68/32/11 99/33/11 189/35/11
+f 182/30/11 163/31/11 100/33/11
+f 91/29/11 56/36/11 164/31/11
+f 61/34/11 190/35/11 211/36/11
+f 152/46/10 213/43/9 193/45/9
+f 116/46/11 3/43/11 214/44/11
+f 188/44/6 117/45/5 201/43/5
+f 194/46/8 200/43/8 120/45/8
+f 5/50/8 36/47/8 161/49/8
+f 162/50/6 168/43/5 185/49/5
+f 112/48/11 8/49/11 186/50/11
+f 139/50/10 114/47/9 103/49/9
+f 9/50/8 95/47/8 10/49/8
+f 170/46/2 148/43/1 11/45/1
+f 83/50/11 215/47/11 209/48/11
+f 216/48/4 84/49/3 160/47/3
+f 149/46/10 143/43/9 14/45/9
+f 196/48/2 142/49/1 15/47/1
+f 155/48/6 158/49/5 16/47/5
+f 134/48/4 137/49/3 150/47/3
+f 73/44/11 85/45/11 197/46/11
+f 86/48/2 75/49/1 87/47/1
+f 88/48/8 72/49/8 20/47/8
+f 124/50/4 64/47/3 198/49/3
+f 171/50/6 54/47/5 22/49/5
+f 98/50/2 101/47/1 121/49/1
+f 122/48/10 165/49/9 173/47/9
+f 174/50/4 212/43/3 172/49/3
diff --git a/09-september/resources/cube.mtl b/09-september/resources/cube.mtl
new file mode 100644
index 0000000..39ad3d3
--- /dev/null
+++ b/09-september/resources/cube.mtl
@@ -0,0 +1,13 @@
+# Blender MTL File: 'None'
+# Material Count: 1
+
+newmtl Material
+Ns 96.078431
+Ka 1.000000 1.000000 1.000000
+Kd 0.640000 0.640000 0.640000
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.000000
+d 1.000000
+illum 2
+map_Ks .
diff --git a/09-september/resources/cube.obj b/09-september/resources/cube.obj
new file mode 100644
index 0000000..65343b2
--- /dev/null
+++ b/09-september/resources/cube.obj
@@ -0,0 +1,50 @@
+# Blender v2.77 (sub 0) OBJ File: ''
+# www.blender.org
+mtllib cube.mtl
+o Cube
+v 1.000000 -1.000000 -1.000000
+v 1.000000 -1.000000 1.000000
+v -1.000000 -1.000000 1.000000
+v -1.000000 -1.000000 -1.000000
+v 1.000000 1.000000 -0.999999
+v 0.999999 1.000000 1.000001
+v -1.000000 1.000000 1.000000
+v -1.000000 1.000000 -1.000000
+vt 0.0000 0.6667
+vt 0.3333 0.6667
+vt 0.3333 1.0000
+vt 0.0000 1.0000
+vt 0.6667 0.3333
+vt 0.6667 0.6667
+vt 0.3333 0.6667
+vt 0.3333 0.3333
+vt 0.6667 0.3333
+vt 0.3333 0.3333
+vt 0.3333 0.0000
+vt 0.6667 0.0000
+vt 0.0000 0.3333
+vt 0.0000 0.0000
+vt 0.3333 0.0000
+vt 0.3333 0.3333
+vt 1.0000 0.3333
+vt 0.6667 0.3333
+vt 0.6667 0.0000
+vt 1.0000 0.0000
+vt 0.0000 0.3333
+vt 0.3333 0.3333
+vt 0.3333 0.6667
+vt 0.0000 0.6667
+vn 0.0000 -1.0000 0.0000
+vn 0.0000 1.0000 0.0000
+vn 1.0000 0.0000 0.0000
+vn -0.0000 -0.0000 1.0000
+vn -1.0000 -0.0000 -0.0000
+vn 0.0000 0.0000 -1.0000
+usemtl Material
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 5/5/2 8/6/2 7/7/2 6/8/2
+f 1/9/3 5/10/3 6/11/3 2/12/3
+f 2/13/4 6/14/4 7/15/4 3/16/4
+f 3/17/5 7/18/5 8/19/5 4/20/5
+f 5/21/6 1/22/6 4/23/6 8/24/6
diff --git a/09-september/resources/plane3.obj b/09-september/resources/plane3.obj
new file mode 100644
index 0000000..b663241
--- /dev/null
+++ b/09-september/resources/plane3.obj
@@ -0,0 +1,55 @@
+# Blender v2.77 (sub 0) OBJ File: 'plane3.obj'
+# www.blender.org
+mtllib plane3.mtl
+o Cube.001
+v 8.045116 -0.023363 -8.045115
+v 8.045116 -0.023363 8.045116
+v -8.045117 -0.023363 8.045115
+v -8.045114 -0.023363 -8.045119
+v 8.045120 0.023363 -8.045112
+v -8.045115 0.023363 -8.045116
+v -8.045119 0.023363 8.045114
+v 8.045111 0.023363 8.045121
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 0.0000 0.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 0.0000 0.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 0.0000 0.0000
+vt 0.0000 0.0000
+vt 1.0000 1.0000
+vt 1.0000 0.0000
+vt 0.0000 1.0000
+vt 1.0000 1.0000
+vt 1.0000 1.0000
+vt 1.0000 1.0000
+vt 1.0000 0.0000
+vt 1.0000 1.0000
+vn 0.0000 -1.0000 -0.0000
+vn -0.0000 1.0000 0.0000
+vn 1.0000 -0.0001 0.0000
+vn 1.0000 0.0001 0.0000
+vn -0.0000 -0.0001 1.0000
+vn -0.0000 0.0000 1.0000
+vn -1.0000 -0.0000 -0.0000
+vn -1.0000 -0.0001 -0.0000
+vn 0.0000 0.0001 -1.0000
+usemtl Material.001
+s 1
+f 2/1/1 4/2/1 1/3/1
+f 6/4/2 8/5/2 5/6/2
+f 5/7/3 2/8/4 1/3/3
+f 8/9/5 3/10/6 2/11/5
+f 3/12/7 6/13/8 4/2/8
+f 1/14/9 6/15/9 5/6/9
+f 2/1/1 3/16/1 4/2/1
+f 6/4/2 7/17/2 8/5/2
+f 5/7/3 8/18/4 2/8/4
+f 8/9/5 7/17/6 3/10/6
+f 3/12/7 7/19/7 6/13/8
+f 1/14/9 4/20/9 6/15/9
diff --git a/09-september/resources/shaders/particlesShader.frag b/09-september/resources/shaders/particlesShader.frag
new file mode 100644
index 0000000..117128b
--- /dev/null
+++ b/09-september/resources/shaders/particlesShader.frag
@@ -0,0 +1,12 @@
+#version 420
+
+in vec2 Fragment_UV;
+
+out vec4 out_color;
+
+uniform sampler2D Texture;
+
+void main()
+{
+ out_color = texture(Texture, Fragment_UV);
+}
diff --git a/09-september/resources/shaders/particlesShader.vert b/09-september/resources/shaders/particlesShader.vert
new file mode 100644
index 0000000..2b1ad60
--- /dev/null
+++ b/09-september/resources/shaders/particlesShader.vert
@@ -0,0 +1,18 @@
+#version 420
+
+in layout(location=0) vec3 position; /* vertex position in model coordinates */
+in layout(location=1) vec2 offset; /* xy coordinates offset for atlases */
+in layout(location=2) mat4 M_MVP;
+
+out vec2 Fragment_UV; /* UV coordinates for the fragment */
+
+uniform float number_of_rows; /* For texture atlases */
+
+void main()
+{
+ gl_Position = M_MVP * vec4(position, 1.0);
+
+ Fragment_UV = position.xy + vec2(0.5, 0.5);
+ Fragment_UV.y = 1.0 - Fragment_UV.y;
+ Fragment_UV = (Fragment_UV / number_of_rows ) + offset;
+}
diff --git a/09-september/resources/shaders/passShader.frag b/09-september/resources/shaders/passShader.frag
new file mode 100644
index 0000000..554adc5
--- /dev/null
+++ b/09-september/resources/shaders/passShader.frag
@@ -0,0 +1,11 @@
+#version 420
+
+in vec2 Fragment_Uv;
+out vec4 out_color;
+
+uniform sampler2D Texture;
+
+void main()
+{
+ out_color = texture(Texture, Fragment_Uv);
+}
diff --git a/09-september/resources/shaders/passShader.vert b/09-september/resources/shaders/passShader.vert
new file mode 100644
index 0000000..5ac718e
--- /dev/null
+++ b/09-september/resources/shaders/passShader.vert
@@ -0,0 +1,12 @@
+#version 420
+
+in layout(location=0) vec3 Model_Position;
+out vec2 Fragment_Uv;
+
+uniform mat4 M_MVP;
+
+void main()
+{
+ Fragment_Uv = vec2( (Model_Position.x + 1.0)/2.0, (Model_Position.y + 1.0)/2.0 );
+ gl_Position = M_MVP * vec4(Model_Position, 1.0);
+}
diff --git a/09-september/resources/shaders/shader.frag b/09-september/resources/shaders/shader.frag
new file mode 100644
index 0000000..44e579c
--- /dev/null
+++ b/09-september/resources/shaders/shader.frag
@@ -0,0 +1,56 @@
+#version 420
+
+in vec2 Fragment_UV;
+in vec4 Fragment_Color;
+in vec3 toLightVector[4];
+in vec3 toEyeVector;
+
+layout(location = 0) out vec4 out_color;
+
+uniform vec4 lightColor[4];
+uniform vec3 attenuation[4];
+uniform sampler2D Texture;
+uniform sampler2D normalMap;
+
+void main()
+{
+ vec4 totalDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
+ vec4 totalSpecular = vec4(0.0, 0.0, 0.0, 1.0);
+
+ /* We get the normal from the normal map and we transform it into world space */
+ vec3 normal = normalize( (255.0 / 128.0 * texture(normalMap, Fragment_UV) - 1.0).xyz );
+
+ for(int i = 0; i < 4; i++)
+ {
+ /*Light Attenuation*/
+ float dist = length(toLightVector[i]);
+ float attFactor = attenuation[i].x + (attenuation[i].y * dist) + (attenuation[i].z * dist * dist);
+ vec3 unitToLightVector = normalize(toLightVector[i]);
+
+ /*Diffuse lighting*/
+
+ /*La intensidad es el cos entre la normal y el vector hacia la luz*/
+ float brightness = dot(unitToLightVector, normalize(normal));
+ /*No queremos luz negativa ni mayor a 1*/
+ brightness = max(brightness, 0.0);
+ totalDiffuse = totalDiffuse + (brightness * lightColor[i]) / attFactor;
+
+ /* Specular lighting */
+
+ /* Reflejamos el vector hacia la luz (su inverso) en la normal */
+ vec3 Vector_ReflectedLight = reflect(-unitToLightVector, normal);
+
+ /* La luz especular es el cos del angulo entre el vector hacia el ojo y la luz reflectada en la normal */
+ float specularity = clamp( dot(Vector_ReflectedLight, toEyeVector), 0, 1 );
+ float reflectivity = 0.5;
+ /* Que tan grande es el specular highlight */
+ specularity = pow(specularity, 10);
+ totalSpecular = totalSpecular + clamp( reflectivity * specularity * lightColor[i], 0, 1) / attFactor;
+ }
+
+ /* Ambient Light */
+ totalDiffuse = max(totalDiffuse, 0.2);
+
+ /* Juntamos todo para el color final*/
+ out_color = totalDiffuse * texture(Texture, Fragment_UV) + totalSpecular;
+}
diff --git a/09-september/resources/shaders/shader.vert b/09-september/resources/shaders/shader.vert
new file mode 100644
index 0000000..69a30e0
--- /dev/null
+++ b/09-september/resources/shaders/shader.vert
@@ -0,0 +1,52 @@
+#version 420
+
+in layout(location=0) vec3 position;
+in layout(location=1) vec2 Texture_UV;
+in layout(location=2) vec3 normal;
+in layout(location=3) vec3 tangent;
+
+uniform mat4 M_MVP; /* Total Transform matrix */
+uniform mat4 M_model; /* Model to world space transformation matrix */
+
+uniform vec3 lightPosition[4];
+uniform vec3 World_eyePosition;
+
+uniform float number_of_rows;
+uniform vec2 offset;
+
+out vec2 Fragment_UV;
+out vec4 Fragment_Color;
+out vec3 toLightVector[4];
+out vec3 toEyeVector;
+
+void main()
+{
+ /*We add a 0 on the vec4 so we can remove the translation from the matrix
+ (WE DONT WANT THE NORMAL TO BE TRANSLATED) */
+ vec3 n = normalize( (M_model * vec4(normal, 0.0)).xyz );
+ vec3 t = normalize( (M_model * vec4(tangent, 0.0)).xyz );
+
+ /* Orthogonalization */
+ t = normalize(t - dot(t, n) * n);
+
+ vec3 biTangent = normalize( cross(t, n) );
+
+ /* Matrix use by normal mapping */
+ mat3 tbnMatrix = mat3(t, biTangent, n);
+ tbnMatrix = transpose(tbnMatrix);
+
+ vec3 World_Position = vec3(M_model * vec4(position, 1.0));
+
+ for(int i = 0; i < 4; i++)
+ {
+ /* vector que apunta hacia la luz*/
+ toLightVector[i] = tbnMatrix * (lightPosition[i] - World_Position);
+ }
+ /* Vector hacia el ojo*/
+ toEyeVector = normalize( tbnMatrix * (World_eyePosition - World_Position) );
+
+ gl_Position = M_MVP * vec4(position, 1.0);
+
+ Fragment_UV = vec2(Texture_UV.x, 1 - Texture_UV.y); /*Invert y axis*/
+ Fragment_UV = (Fragment_UV / number_of_rows) + offset;
+}
diff --git a/09-september/resources/shaders/shadow_shader.frag b/09-september/resources/shaders/shadow_shader.frag
new file mode 100644
index 0000000..7e29624
--- /dev/null
+++ b/09-september/resources/shaders/shadow_shader.frag
@@ -0,0 +1,5 @@
+#version 420
+
+void main()
+{
+}
diff --git a/09-september/resources/shaders/shadow_shader.vert b/09-september/resources/shaders/shadow_shader.vert
new file mode 100644
index 0000000..f68dd74
--- /dev/null
+++ b/09-september/resources/shaders/shadow_shader.vert
@@ -0,0 +1,10 @@
+#version 420
+
+in layout(location=0) vec3 position; /* vertex position in model coordinates */
+
+uniform mat4 M_MVP;
+
+void main()
+{
+ gl_Position = M_MVP * vec4(position, 1.0);
+}
diff --git a/09-september/resources/shaders/skyboxShader.frag b/09-september/resources/shaders/skyboxShader.frag
new file mode 100644
index 0000000..99dcde3
--- /dev/null
+++ b/09-september/resources/shaders/skyboxShader.frag
@@ -0,0 +1,11 @@
+#version 420
+
+in vec3 Fragment_UV;
+out vec4 out_color;
+
+uniform samplerCube cubeMap;
+
+void main()
+{
+ out_color = texture(cubeMap, Fragment_UV);
+}
diff --git a/09-september/resources/shaders/skyboxShader.vert b/09-september/resources/shaders/skyboxShader.vert
new file mode 100644
index 0000000..3286875
--- /dev/null
+++ b/09-september/resources/shaders/skyboxShader.vert
@@ -0,0 +1,12 @@
+#version 420
+
+in layout(location=0) vec3 position; /* vertex position in model coordinates */
+out vec3 Fragment_UV; /* UV coordinates for the fragment */
+
+uniform mat4 M_MVP;
+
+void main()
+{
+ gl_Position = M_MVP * vec4(position, 1.0);
+ Fragment_UV = position;
+}
diff --git a/09-september/resources/shaders/terrainShader.frag b/09-september/resources/shaders/terrainShader.frag
new file mode 100644
index 0000000..21623bb
--- /dev/null
+++ b/09-september/resources/shaders/terrainShader.frag
@@ -0,0 +1,72 @@
+#version 420
+
+in vec2 Fragment_UV;
+in vec3 normal0;
+in vec3 toLightVector[4];
+in vec3 toEyeVector;
+
+out vec4 out_color;
+
+uniform vec4 lightColor[4];
+uniform vec3 attenuation[4];
+uniform vec3 World_eyePosition;
+
+uniform sampler2D Texture_Background;
+uniform sampler2D Texture_R;
+uniform sampler2D Texture_G;
+uniform sampler2D Texture_B;
+uniform sampler2D Texture_BlendMap;
+
+void main()
+{
+ vec4 totalDiffuse = vec4(0.0, 0.0, 0.0, 1.0);
+ vec4 totalSpecular = vec4(0.0, 0.0, 0.0, 1.0);
+
+ for(int i = 0; i < 4; i++)
+ {
+ /*Light Attenuation*/
+ float dist = length(toLightVector[i]);
+ float attFactor = attenuation[i].x + (attenuation[i].y * dist) + (attenuation[i].z * dist * dist);
+ vec3 unitToLightVector = normalize(toLightVector[i]);
+ /*Diffuse lighting*/
+
+ /*La intensidad es el cos entre la normal y el vector hacia la luz*/
+ float brightness = dot(unitToLightVector, normalize(normal0));
+ /*No queremos luz negativa ni mayor a 1*/
+ brightness = max(brightness, 0.0);
+ totalDiffuse = totalDiffuse + (brightness * lightColor[i]) / attFactor;
+
+ /* Specular lighting */
+
+ /* Reflejamos el vector hacia la luz (su inverso) en la normal */
+ vec3 Vector_ReflectedLight = reflect(-unitToLightVector, normal0);
+
+ /* La luz especular es el cos del angulo entre el vector hacia el ojo y la luz reflectada en la normal */
+ float specularity = clamp( dot(Vector_ReflectedLight, toEyeVector), 0, 1 );
+ float reflectivity = 0.5;
+ /* Que tan grande es el specular highlight */
+ specularity = pow(specularity, 10);
+ totalSpecular = totalSpecular + clamp( reflectivity * specularity * lightColor[i], 0, 1) / attFactor;
+ }
+
+ /* Ambient Light */
+ totalDiffuse = max(totalDiffuse, 0.2);
+
+ /*Terrain color*/
+ /*The color of the current fragment from the blendmap*/
+ vec4 blendMapColor = texture(Texture_BlendMap, Fragment_UV);
+ /*We want the background color when we have black in the blend map*/
+ float backTextureAmount = 1 - (blendMapColor.r + blendMapColor.g + blendMapColor.b);
+ /*So we dont lose image quality from the tiles textures (Fragment_UV make the terrain look less HD)*/
+ vec2 Tiled_UV = Fragment_UV * 50.0f;
+ /*We get the color of each map tile (soil1, soil2, etc)*/
+ vec4 backgroundTextureColor = texture(Texture_Background, Tiled_UV) * backTextureAmount;
+ vec4 rTextureColor = texture(Texture_R, Tiled_UV) * blendMapColor.r;
+ vec4 gTextureColor = texture(Texture_G, Tiled_UV) * blendMapColor.g;
+ vec4 bTextureColor = texture(Texture_B, Tiled_UV) * blendMapColor.b;
+ /*We mix them corresponding with the blendmap*/
+ vec4 totalColor = backgroundTextureColor + rTextureColor + gTextureColor + bTextureColor;
+
+ /*Our final color for the fragment*/
+ out_color = totalDiffuse * totalColor + totalSpecular;
+}
diff --git a/09-september/resources/shaders/terrainShader.vert b/09-september/resources/shaders/terrainShader.vert
new file mode 100644
index 0000000..1850947
--- /dev/null
+++ b/09-september/resources/shaders/terrainShader.vert
@@ -0,0 +1,39 @@
+#version 420
+
+in layout(location=0) vec3 position; /* vertex position in model space */
+in layout(location=1) vec2 Texture_UV;
+in layout(location=2) vec3 normal; /* vertex normal in model space */
+in layout(location=3) vec3 tangent;
+
+uniform mat4 M_MVP; /* Total Transform matrix */
+uniform mat4 M_model; /* Model to world space transformation matrix */
+
+uniform vec3 lightPosition[4];
+uniform vec3 World_eyePosition;
+
+out vec2 Fragment_UV; /* UV coordinates for the fragment */
+out vec3 normal0;
+out vec4 Fragment_Color;
+out vec3 toLightVector[4];
+out vec3 toEyeVector;
+
+void main()
+{
+ vec3 World_Position = vec3(M_model * vec4(position, 1.0));
+
+ for(int i = 0; i < 4; i++)
+ {
+ /* vector que apunta hacia la luz*/
+ toLightVector[i] = lightPosition[i] - World_Position;
+ }
+ /* Vector hacia el ojo*/
+ toEyeVector = normalize(World_eyePosition - World_Position);
+
+ gl_Position = M_MVP * vec4(position, 1.0);
+
+ Fragment_UV = vec2(Texture_UV.x, 1 - Texture_UV.y); /*Invert y axis*/
+
+ /*We add a 0 on the vec4 so we can remove the translation from the matrix
+ (WE DONT WANT THE NORMAL TO BE TRANSLATED) */
+ normal0 = normalize( (M_model * vec4(normal, 0.0)).xyz );
+}
diff --git a/09-september/resources/stall.obj b/09-september/resources/stall.obj
new file mode 100644
index 0000000..210f90b
--- /dev/null
+++ b/09-september/resources/stall.obj
@@ -0,0 +1,1696 @@
+# Blender v2.67 (sub 0) OBJ File: 'stall.blend'
+# www.blender.org
+o Cube
+v 3.227124 -0.065127 -1.000000
+v 3.227124 -0.065127 1.000000
+v -3.227125 -0.065127 1.000000
+v -3.227123 -0.065127 -1.000000
+v 3.227126 1.934873 -0.999999
+v 3.227122 1.934873 1.000001
+v -3.227126 1.934873 1.000000
+v -3.227124 1.934873 -1.000000
+v 3.558682 1.924610 -1.102740
+v 3.558677 1.924610 1.511141
+v -3.558681 1.924610 1.511140
+v -3.558679 1.924610 -1.102740
+v 3.558682 2.083301 -1.102740
+v 3.558677 2.083301 1.511141
+v -3.558681 2.083301 1.511140
+v -3.558679 2.083301 -1.102740
+v 3.227124 -0.065127 -1.000000
+v 3.227126 1.934873 -0.999999
+v 3.227126 1.934873 -0.999999
+v 3.227126 1.934873 -0.999999
+v 3.227124 -0.065127 1.000000
+v 3.227122 1.934873 1.000001
+v 3.227122 1.934873 1.000001
+v 3.227122 1.934873 1.000001
+v -3.227125 -0.065127 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227126 1.934873 1.000000
+v -3.227123 -0.065127 -1.000000
+v -3.227124 1.934873 -1.000000
+v -3.227124 1.934873 -1.000000
+v -3.227124 1.934873 -1.000000
+v 3.558682 1.924610 -1.102740
+v 3.558677 1.924610 1.511141
+v 3.558677 1.924610 1.511141
+v 3.558677 1.924610 1.511141
+v -3.558681 1.924610 1.511140
+v -3.558681 1.924610 1.511140
+v -3.558681 1.924610 1.511140
+v -3.558679 1.924610 -1.102740
+v -3.558679 1.924610 -1.102740
+v 3.558682 2.083301 -1.102740
+v 3.558677 2.083301 1.511141
+v 3.558677 2.083301 1.511141
+v -3.558679 2.083301 -1.102740
+v -3.558679 2.083301 -1.102740
+v -3.558681 2.083301 1.511140
+v -3.558681 2.083301 1.511140
+v -3.975889 5.109764 -0.703744
+v -3.975889 -0.001038 -0.703744
+v 4.035702 -0.001038 -0.703744
+v 4.035702 5.109764 -0.703744
+v 4.136954 -0.001038 -0.645286
+v 4.136954 5.109764 -0.645286
+v 4.136954 -0.001038 -0.528370
+v 4.136954 5.109764 -0.528370
+v 4.035702 -0.001038 -0.469912
+v 4.035702 5.109764 -0.469912
+v 3.934450 -0.001038 -0.528370
+v 3.934450 5.109764 -0.528370
+v 3.934450 -0.001038 -0.645286
+v 3.934450 5.109764 -0.645286
+v -3.874637 -0.001038 -0.645286
+v -3.874637 5.109764 -0.645286
+v -3.874637 -0.001038 -0.528370
+v -3.874637 5.109764 -0.528370
+v -3.975889 -0.001038 -0.469912
+v -3.975889 5.109764 -0.469912
+v -4.077142 -0.001038 -0.528370
+v -4.077142 5.109764 -0.528370
+v -4.077142 -0.001038 -0.645286
+v -4.077142 5.109764 -0.645286
+v -4.518063 -0.025686 3.868089
+v -4.518063 -0.025686 3.580229
+v 4.401308 -0.025686 3.580229
+v 4.401308 -0.025686 3.868089
+v -4.518063 3.617208 3.868089
+v -4.518063 3.617208 3.580229
+v 4.401308 3.617208 3.580229
+v 4.401308 3.617208 3.868089
+v -4.518063 4.016335 3.710218
+v -4.518063 3.792680 3.528995
+v 4.401308 3.792680 3.528995
+v 4.401308 4.016335 3.710218
+v -4.518063 4.490533 3.232638
+v -4.518063 4.260199 3.059984
+v 4.401308 4.260199 3.059984
+v 4.401308 4.490533 3.232638
+v -4.518063 5.251897 -0.749037
+v -4.518063 5.051156 -0.716959
+v 4.401308 5.051156 -0.716959
+v 4.401308 5.251897 -0.749037
+v -4.518063 4.733114 -1.423512
+v -4.518063 4.593092 -1.289192
+v 4.401308 4.593092 -1.289192
+v 4.401308 4.733114 -1.423512
+v -3.874637 5.109764 -0.528370
+v -3.874637 -0.001038 -0.528370
+v 3.934450 5.109764 -0.528370
+v 3.934450 -0.001038 -0.528370
+v 3.077599 2.080430 -1.292466
+v 3.486084 2.080430 0.000798
+v 1.220706 2.080430 0.716330
+v 0.812221 2.080430 -0.576934
+v 3.077599 2.174018 -1.292466
+v 3.486084 2.174018 0.000798
+v 1.220706 2.174018 0.716330
+v 0.812221 2.174018 -0.576934
+v 0.866186 2.174018 -0.491315
+v 1.241163 2.174018 0.695864
+v 1.353509 2.174018 0.660380
+v 0.978532 2.174018 -0.526800
+v 0.866186 2.080430 -0.491315
+v 1.241163 2.080430 0.695864
+v 1.353509 2.080430 0.660380
+v 0.978532 2.080430 -0.526800
+v 0.866186 2.545954 -0.491315
+v 1.241163 2.545954 0.695864
+v 1.353509 2.545954 0.660380
+v 0.978532 2.545954 -0.526800
+v 0.844122 2.174018 -0.561169
+v 0.956468 2.174018 -0.596654
+v 0.844122 2.080430 -0.561169
+v 0.956468 2.080430 -0.596654
+v 0.844122 2.545954 -0.561169
+v 0.956468 2.545954 -0.596654
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.545954 -1.169330
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.545954 -1.239183
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.545954 -0.043953
+v 3.077599 2.174018 -1.292466
+v 3.077599 2.174018 -1.292466
+v 3.486084 2.174018 0.000798
+v 3.486084 2.174018 0.000798
+v 3.486084 2.080430 0.000798
+v 3.486084 2.080430 0.000798
+v 3.077599 2.080430 -1.292466
+v 3.077599 2.080430 -1.292466
+v 1.220706 2.174018 0.716330
+v 1.220706 2.174018 0.716330
+v 1.220706 2.080430 0.716330
+v 1.220706 2.080430 0.716330
+v 0.812221 2.174018 -0.576934
+v 0.812221 2.174018 -0.576934
+v 0.812221 2.080430 -0.576934
+v 0.812221 2.080430 -0.576934
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.978532 2.080430 -0.526800
+v 0.866186 2.080430 -0.491315
+v 0.866186 2.080430 -0.491315
+v 0.866186 2.080430 -0.491315
+v 0.844122 2.080430 -0.561169
+v 0.844122 2.080430 -0.561169
+v 1.241163 2.080430 0.695864
+v 1.241163 2.080430 0.695864
+v 0.866186 2.174018 -0.491315
+v 0.866186 2.174018 -0.491315
+v 0.866186 2.174018 -0.491315
+v 1.241163 2.174018 0.695864
+v 1.241163 2.174018 0.695864
+v 1.241163 2.174018 0.695864
+v 1.353509 2.080430 0.660380
+v 1.353509 2.080430 0.660380
+v 1.353509 2.174018 0.660380
+v 1.353509 2.174018 0.660380
+v 1.353509 2.174018 0.660380
+v 0.978532 2.174018 -0.526800
+v 0.978532 2.174018 -0.526800
+v 0.978532 2.174018 -0.526800
+v 0.866186 2.545954 -0.491315
+v 0.866186 2.545954 -0.491315
+v 0.866186 2.545954 -0.491315
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 0.978532 2.545954 -0.526800
+v 1.241163 2.545954 0.695864
+v 1.241163 2.545954 0.695864
+v 1.353509 2.545954 0.660380
+v 1.353509 2.545954 0.660380
+v 0.956468 2.080430 -0.596654
+v 0.956468 2.080430 -0.596654
+v 0.956468 2.080430 -0.596654
+v 0.844122 2.174018 -0.561169
+v 0.844122 2.174018 -0.561169
+v 0.844122 2.174018 -0.561169
+v 0.956468 2.174018 -0.596654
+v 0.956468 2.174018 -0.596654
+v 0.956468 2.174018 -0.596654
+v 0.844122 2.545954 -0.561169
+v 0.844122 2.545954 -0.561169
+v 0.956468 2.545954 -0.596654
+v 0.956468 2.545954 -0.596654
+v 0.956468 2.545954 -0.596654
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.174018 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.080430 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 3.012783 2.545954 -1.169330
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.080430 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.174018 -1.239183
+v 2.990720 2.545954 -1.239183
+v 2.990720 2.545954 -1.239183
+v 2.990720 2.545954 -1.239183
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.174018 -1.264470
+v 3.070777 2.174018 -1.264470
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.080430 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.174018 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.092841 2.545954 -1.194616
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.080430 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.070777 2.545954 -1.264470
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.174018 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.080430 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.376227 2.545954 -0.018666
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.080430 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.174018 -0.043953
+v 3.456284 2.545954 -0.043953
+v 3.456284 2.545954 -0.043953
+v 1.510815 2.137595 0.037730
+v 1.349035 2.290844 -0.140367
+v 1.591464 2.172901 -0.233612
+v 1.784266 2.190338 -0.024086
+v 1.660990 2.319058 0.198652
+v 1.392003 2.381173 0.126783
+v 1.522500 2.438301 -0.312256
+v 1.791486 2.376186 -0.240387
+v 1.834455 2.466515 0.026763
+v 1.592026 2.584458 0.120008
+v 1.399223 2.567021 -0.089519
+v 1.672674 2.619764 -0.151334
+v 2.497889 2.137595 -0.044384
+v 2.336109 2.290844 -0.222481
+v 2.578538 2.172901 -0.315726
+v 2.771340 2.190338 -0.106200
+v 2.648064 2.319058 0.116538
+v 2.379078 2.381173 0.044669
+v 2.509574 2.438301 -0.394370
+v 2.778560 2.376186 -0.322502
+v 2.821529 2.466515 -0.055351
+v 2.579100 2.584458 0.037894
+v 2.386297 2.567021 -0.171633
+v 2.659748 2.619764 -0.233449
+v 2.006507 2.137595 -0.316138
+v 1.844727 2.290844 -0.494235
+v 2.087156 2.172901 -0.587479
+v 2.279958 2.190338 -0.377954
+v 2.156682 2.319058 -0.155216
+v 1.887695 2.381173 -0.227085
+v 2.018192 2.438301 -0.666124
+v 2.287179 2.376186 -0.594255
+v 2.330147 2.466515 -0.327105
+v 2.087718 2.584458 -0.233860
+v 1.894915 2.567021 -0.443387
+v 2.168366 2.619764 -0.505202
+v 2.833736 2.426006 -0.583306
+v 2.684991 2.845636 -1.079525
+v 2.757221 2.366194 -0.574572
+v 2.608476 2.785824 -1.070790
+v 2.749703 2.246832 -0.600498
+v 2.600958 2.666462 -1.096717
+v 2.818701 2.187281 -0.635161
+v 2.669955 2.606911 -1.131379
+v 2.895216 2.247093 -0.643896
+v 2.746471 2.666724 -1.140114
+v 2.902734 2.366456 -0.617969
+v 2.753989 2.786086 -1.114187
+v 3.047219 2.426006 -0.650736
+v 2.898475 2.845636 -1.146955
+v 2.970704 2.366194 -0.642001
+v 2.821959 2.785824 -1.138220
+v 2.963186 2.246832 -0.667928
+v 2.814442 2.666462 -1.164147
+v 3.032184 2.187281 -0.702591
+v 2.883439 2.606911 -1.198809
+v 3.108700 2.247093 -0.711326
+v 2.959954 2.666724 -1.207544
+v 3.116217 2.366456 -0.685399
+v 2.967472 2.786086 -1.181617
+v -1.172064 2.145742 0.102815
+v -1.274777 2.145742 0.043514
+v -1.274777 2.075523 -0.065804
+v -1.274777 2.111542 -0.065804
+v -1.077392 2.075523 0.048156
+v -1.077392 2.111542 0.048156
+v -1.077392 2.075523 0.276076
+v -1.077392 2.111542 0.276076
+v -1.274777 2.075523 0.390036
+v -1.274777 2.111542 0.390036
+v -1.472162 2.075523 0.276076
+v -1.472162 2.111542 0.276076
+v -1.472162 2.075523 0.048156
+v -1.472162 2.111542 0.048156
+v -1.172064 2.145742 0.221418
+v -1.274777 2.145742 0.280719
+v -1.377490 2.145742 0.221418
+v -1.377490 2.145742 0.102815
+v -1.238618 2.209867 0.141240
+v -1.274777 2.209867 0.120363
+v -1.238618 2.209867 0.182993
+v -1.274777 2.209867 0.203870
+v -1.310936 2.209867 0.182993
+v -1.310936 2.209867 0.141240
+v -1.238618 2.579231 0.141240
+v -1.274777 2.579231 0.120363
+v -1.238618 2.579231 0.182993
+v -1.274777 2.579231 0.203870
+v -1.310936 2.579231 0.182993
+v -1.310936 2.579231 0.141240
+v -1.188232 2.648486 0.112150
+v -1.274777 2.648486 0.062183
+v -1.188232 2.648486 0.212083
+v -1.274777 2.648486 0.262050
+v -1.361322 2.648486 0.212083
+v -1.361322 2.648486 0.112150
+v -1.124406 2.740827 0.075299
+v -1.274777 2.740827 -0.011518
+v -1.124406 2.740827 0.248933
+v -1.274777 2.740827 0.335750
+v -1.425149 2.740827 0.248933
+v -1.425149 2.740827 0.075299
+v -1.080861 2.912683 0.050158
+v -1.274777 2.912683 -0.061799
+v -1.080861 2.912683 0.274074
+v -1.274777 2.912683 0.386032
+v -1.468694 2.912683 0.274074
+v -1.468694 2.912683 0.050158
+v -1.080861 3.117886 0.050158
+v -1.274777 3.117886 -0.061799
+v -1.080861 3.117886 0.274074
+v -1.274777 3.117886 0.386032
+v -1.468694 3.117886 0.274074
+v -1.468694 3.117886 0.050158
+v -1.099921 3.127254 0.059737
+v -1.278856 3.127254 -0.043571
+v -1.099921 3.127254 0.266354
+v -1.278856 3.127254 0.369662
+v -1.457792 3.127254 0.266354
+v -1.457792 3.127254 0.059737
+v -1.278856 2.680948 0.163046
+v -1.922013 2.145742 -0.643475
+v -2.024726 2.145742 -0.702776
+v -2.024726 2.075523 -0.812093
+v -2.024726 2.111542 -0.812093
+v -1.827342 2.075523 -0.698134
+v -1.827342 2.111542 -0.698134
+v -1.827342 2.075523 -0.470213
+v -1.827342 2.111542 -0.470213
+v -2.024726 2.075523 -0.356253
+v -2.024726 2.111542 -0.356253
+v -2.222111 2.075523 -0.470213
+v -2.222111 2.111542 -0.470213
+v -2.222111 2.075523 -0.698134
+v -2.222111 2.111542 -0.698134
+v -1.922013 2.145742 -0.524872
+v -2.024726 2.145742 -0.465571
+v -2.127439 2.145742 -0.524872
+v -2.127439 2.145742 -0.643475
+v -1.988567 2.209867 -0.605050
+v -2.024726 2.209867 -0.625927
+v -1.988567 2.209867 -0.563297
+v -2.024726 2.209867 -0.542420
+v -2.060886 2.209867 -0.563297
+v -2.060886 2.209867 -0.605050
+v -1.988567 2.579231 -0.605050
+v -2.024726 2.579231 -0.625927
+v -1.988567 2.579231 -0.563297
+v -2.024726 2.579231 -0.542420
+v -2.060886 2.579231 -0.563297
+v -2.060886 2.579231 -0.605050
+v -1.938182 2.648486 -0.634140
+v -2.024726 2.648486 -0.684107
+v -1.938182 2.648486 -0.534207
+v -2.024726 2.648486 -0.484240
+v -2.111271 2.648486 -0.534207
+v -2.111271 2.648486 -0.634140
+v -1.874355 2.740827 -0.670991
+v -2.024726 2.740827 -0.757808
+v -1.874355 2.740827 -0.497356
+v -2.024726 2.740827 -0.410539
+v -2.175098 2.740827 -0.497356
+v -2.175098 2.740827 -0.670991
+v -1.830810 2.912683 -0.696131
+v -2.024726 2.912683 -0.808089
+v -1.830810 2.912683 -0.472216
+v -2.024726 2.912683 -0.360258
+v -2.218643 2.912683 -0.472216
+v -2.218643 2.912683 -0.696131
+v -1.830810 3.117886 -0.696131
+v -2.024726 3.117886 -0.808089
+v -1.830810 3.117886 -0.472216
+v -2.024726 3.117886 -0.360258
+v -2.218643 3.117886 -0.472216
+v -2.218643 3.117886 -0.696131
+v -1.849871 3.127254 -0.686552
+v -2.028805 3.127254 -0.789860
+v -1.849871 3.127254 -0.479936
+v -2.028805 3.127254 -0.376628
+v -2.207741 3.127254 -0.479936
+v -2.207741 3.127254 -0.686552
+v -2.028805 2.680948 -0.583244
+v -3.080822 2.145742 0.848455
+v -3.183535 2.145742 0.789153
+v -3.183535 2.075523 0.679836
+v -3.183535 2.111542 0.679836
+v -2.986151 2.075523 0.793796
+v -2.986151 2.111542 0.793796
+v -2.986151 2.075523 1.021716
+v -2.986151 2.111542 1.021716
+v -3.183535 2.075523 1.135676
+v -3.183535 2.111542 1.135676
+v -3.380919 2.075523 1.021716
+v -3.380919 2.111542 1.021716
+v -3.380919 2.075523 0.793796
+v -3.380919 2.111542 0.793796
+v -3.080822 2.145742 0.967057
+v -3.183535 2.145742 1.026358
+v -3.286248 2.145742 0.967057
+v -3.286248 2.145742 0.848455
+v -3.147376 2.209867 0.886879
+v -3.183535 2.209867 0.866003
+v -3.147376 2.209867 0.928633
+v -3.183535 2.209867 0.949509
+v -3.219694 2.209867 0.928633
+v -3.219694 2.209867 0.886879
+v -3.147376 2.579231 0.886879
+v -3.183535 2.579231 0.866003
+v -3.147376 2.579231 0.928633
+v -3.183535 2.579231 0.949509
+v -3.219694 2.579231 0.928633
+v -3.219694 2.579231 0.886879
+v -3.096991 2.648486 0.857789
+v -3.183535 2.648486 0.807823
+v -3.096991 2.648486 0.957723
+v -3.183535 2.648486 1.007689
+v -3.270080 2.648486 0.957723
+v -3.270080 2.648486 0.857789
+v -3.033164 2.740827 0.820939
+v -3.183534 2.740827 0.734122
+v -3.033164 2.740827 0.994573
+v -3.183534 2.740827 1.081390
+v -3.333907 2.740827 0.994573
+v -3.333907 2.740827 0.820939
+v -2.989619 2.912683 0.795798
+v -3.183534 2.912683 0.683840
+v -2.989619 2.912683 1.019714
+v -3.183534 2.912683 1.131672
+v -3.377452 2.912683 1.019714
+v -3.377452 2.912683 0.795798
+v -2.989619 3.117886 0.795798
+v -3.183534 3.117886 0.683840
+v -2.989619 3.117886 1.019714
+v -3.183534 3.117886 1.131672
+v -3.377452 3.117886 1.019714
+v -3.377452 3.117886 0.795798
+v -3.008679 3.127254 0.805377
+v -3.187614 3.127254 0.702069
+v -3.008679 3.127254 1.011994
+v -3.187614 3.127254 1.115302
+v -3.366550 3.127254 1.011994
+v -3.366550 3.127254 0.805377
+v -3.187614 2.680948 0.908685
+v 4.401308 3.617208 3.580229
+v 4.401308 -0.025686 3.580229
+v 4.401308 3.792680 3.528995
+v 4.401308 4.260199 3.059984
+v 4.401308 5.051156 -0.716959
+v 4.401308 4.593092 -1.289192
+vt 0.905299 0.942320
+vt 0.533523 0.942320
+vt 0.905299 0.919749
+vt 0.890688 0.972537
+vt 0.606224 0.972537
+vt 0.905301 0.957852
+vt 0.863038 0.512341
+vt 0.863038 0.667779
+vt 0.707599 0.667779
+vt 0.915821 0.578064
+vt 0.915821 0.985620
+vt 0.508265 0.985620
+vt 0.707599 0.979117
+vt 0.707599 0.823679
+vt 0.863038 0.979117
+vt 0.863038 0.668010
+vt 0.863038 0.823448
+vt 0.707599 0.823448
+vt 0.606226 0.942743
+vt 0.890679 0.942743
+vt 0.533523 0.957429
+vt 0.700713 0.854870
+vt 0.985176 0.854869
+vt 0.905300 0.896755
+vt 0.636824 0.703297
+vt 0.921287 0.703296
+vt 0.935900 0.776011
+vt 0.535960 0.512341
+vt 0.707368 0.512341
+vt 0.535960 0.715489
+vt 0.533523 0.896755
+vt 0.905300 0.919326
+vt 0.999789 0.869555
+vt 0.999789 0.892126
+vt 0.599209 0.831876
+vt 0.912899 0.831876
+vt 0.599209 0.854446
+vt 0.710700 0.504901
+vt 0.710700 0.981434
+vt 0.702383 0.504933
+vt 0.699950 0.504898
+vt 0.699800 0.981445
+vt 0.691482 0.981475
+vt 0.691633 0.504928
+vt 0.680581 0.981472
+vt 0.702383 0.981467
+vt 0.691482 0.504933
+vt 0.674847 0.504998
+vt 0.674847 0.981532
+vt 0.663946 0.981532
+vt 0.680731 0.504924
+vt 0.672263 0.981502
+vt 0.691482 0.981467
+vt 0.683164 0.504966
+vt 0.683164 0.981499
+vt 0.672414 0.504954
+vt 0.664096 0.504984
+vt 0.708268 0.504868
+vt 0.708118 0.981416
+vt 0.719169 0.504872
+vt 0.719019 0.981419
+vt 0.719017 0.504868
+vt 0.719018 0.981402
+vt 0.657579 0.583164
+vt 0.894968 0.583164
+vt 0.894968 0.599545
+vt 0.746642 0.950201
+vt 0.875496 0.950201
+vt 0.875496 0.966582
+vt 0.894968 0.624058
+vt 0.657579 0.624058
+vt 0.894968 0.607677
+vt 0.875496 0.983360
+vt 0.746642 0.983360
+vt 0.875496 0.966979
+vt 0.528328 0.755451
+vt 0.765717 0.755451
+vt 0.765717 0.884305
+vt 0.528328 0.755055
+vt 0.528328 0.517666
+vt 0.657182 0.517666
+vt 0.875496 0.755055
+vt 0.657579 0.755055
+vt 0.657579 0.689953
+vt 0.746642 0.983757
+vt 0.964561 0.983757
+vt 0.964561 0.990147
+vt 0.888717 0.600889
+vt 0.888718 0.607280
+vt 0.875895 0.600889
+vt 0.957855 0.949804
+vt 0.739939 0.949804
+vt 0.957855 0.933423
+vt 0.895502 0.534047
+vt 0.889111 0.534047
+vt 0.889111 0.517666
+vt 0.528328 0.950201
+vt 0.746245 0.950201
+vt 0.746245 0.966582
+vt 0.657579 0.600889
+vt 0.875499 0.600890
+vt 0.875499 0.607280
+vt 0.765717 0.884702
+vt 0.765717 0.891093
+vt 0.752895 0.891092
+vt 0.889006 0.755451
+vt 0.895396 0.755451
+vt 0.895396 0.820553
+vt 0.657579 0.517666
+vt 0.875496 0.517666
+vt 0.657579 0.582767
+vt 0.895502 0.582767
+vt 0.889112 0.582767
+vt 0.895502 0.566386
+vt 0.882219 0.755451
+vt 0.888609 0.755451
+vt 0.882219 0.820553
+vt 0.881822 0.886448
+vt 0.881822 0.899271
+vt 0.766114 0.899271
+vt 0.888715 0.517666
+vt 0.888715 0.582767
+vt 0.875892 0.517666
+vt 0.881822 0.820950
+vt 0.881822 0.886052
+vt 0.766114 0.886052
+vt 0.895231 0.641232
+vt 0.895231 0.657614
+vt 0.882409 0.641232
+vt 0.901828 0.891002
+vt 0.889006 0.891002
+vt 0.889006 0.886449
+vt 0.893665 0.738673
+vt 0.893665 0.755055
+vt 0.889112 0.738673
+vt 0.984897 0.624454
+vt 0.984897 0.640836
+vt 0.869190 0.624454
+vt 0.984897 0.673175
+vt 0.984897 0.689556
+vt 0.869190 0.689556
+vt 0.881822 0.755451
+vt 0.881822 0.820553
+vt 0.766114 0.755451
+vt 0.984897 0.659956
+vt 0.984897 0.672778
+vt 0.869190 0.672778
+vt 0.875892 0.755055
+vt 0.875893 0.689953
+vt 0.888715 0.689953
+vt 0.869190 0.657614
+vt 0.869190 0.641232
+vt 0.882012 0.641232
+vt 0.657579 0.689556
+vt 0.657579 0.624454
+vt 0.868793 0.624454
+vt 0.893559 0.820950
+vt 0.893559 0.886052
+vt 0.889006 0.820950
+vt 0.889111 0.544658
+vt 0.901934 0.544658
+vt 0.889111 0.549212
+vt 0.528328 0.949804
+vt 0.528328 0.884702
+vt 0.739542 0.949804
+vt 0.882219 0.886051
+vt 0.882219 0.820950
+vt 0.886772 0.820950
+vt 0.889111 0.565989
+vt 0.889112 0.549608
+vt 0.893665 0.549608
+vt 0.528328 0.976483
+vt 0.528328 0.971929
+vt 0.739540 0.971929
+vt 0.528328 0.971533
+vt 0.528328 0.966979
+vt 0.739540 0.966979
+vt 0.739939 0.916248
+vt 0.739939 0.899867
+vt 0.951152 0.916248
+vt 0.739939 0.933026
+vt 0.739939 0.916645
+vt 0.951152 0.916645
+vt 0.288599 0.586905
+vt 0.263686 0.622200
+vt 0.255994 0.605150
+vt 0.308778 0.621073
+vt 0.416738 0.556495
+vt 0.402006 0.581949
+vt 0.401971 0.548587
+vt 0.410397 0.513377
+vt 0.328955 0.603326
+vt 0.288644 0.660434
+vt 0.256022 0.650593
+vt 0.361632 0.586905
+vt 0.401971 0.598571
+vt 0.381766 0.626266
+vt 0.329010 0.596747
+vt 0.336674 0.625139
+vt 0.328982 0.648769
+vt 0.401943 0.644014
+vt 0.328982 0.642190
+vt 0.423079 0.513377
+vt 0.431506 0.548587
+vt 0.361587 0.660434
+vt 0.431470 0.581949
+vt 0.058872 0.514455
+vt 0.033648 0.579711
+vt 0.060007 0.526490
+vt 0.057959 0.590632
+vt 0.101326 0.507643
+vt 0.098280 0.547934
+vt 0.058446 0.652807
+vt 0.059718 0.615219
+vt 0.102501 0.569863
+vt 0.125087 0.582568
+vt 0.097551 0.631974
+vt 0.100043 0.648601
+vt 0.288599 0.513377
+vt 0.263686 0.548671
+vt 0.255994 0.531621
+vt 0.308778 0.547544
+vt 0.431506 0.630024
+vt 0.416774 0.655477
+vt 0.416738 0.622116
+vt 0.425165 0.586905
+vt 0.328955 0.529797
+vt 0.288644 0.586905
+vt 0.256022 0.577064
+vt 0.361632 0.513377
+vt 0.401971 0.525042
+vt 0.381766 0.552738
+vt 0.329010 0.523218
+vt 0.336674 0.551611
+vt 0.328982 0.575240
+vt 0.401943 0.570485
+vt 0.328982 0.568661
+vt 0.408312 0.586905
+vt 0.416738 0.622115
+vt 0.401971 0.630023
+vt 0.361588 0.586905
+vt 0.416703 0.655477
+vt 0.373139 0.405595
+vt 0.266846 0.405755
+vt 0.372364 0.382592
+vt 0.265891 0.382261
+vt 0.380766 0.365849
+vt 0.274024 0.364779
+vt 0.390004 0.372272
+vt 0.283166 0.370938
+vt 0.390970 0.395797
+vt 0.284319 0.394978
+vt 0.382504 0.412368
+vt 0.276129 0.412304
+vt 0.387980 0.449935
+vt 0.281849 0.450540
+vt 0.387016 0.426417
+vt 0.280686 0.426474
+vt 0.395511 0.409928
+vt 0.288902 0.409221
+vt 0.405043 0.417158
+vt 0.298351 0.416223
+vt 0.406207 0.441227
+vt 0.299725 0.440869
+vt 0.397635 0.457505
+vt 0.291436 0.457923
+vt 0.125099 0.179064
+vt 0.140481 0.179064
+vt 0.135498 0.187381
+vt 0.147570 0.174628
+vt 0.118010 0.174628
+vt 0.162351 0.169957
+vt 0.162351 0.174628
+vt 0.148172 0.179064
+vt 0.138205 0.187381
+vt 0.110516 0.153916
+vt 0.102583 0.168696
+vt 0.102583 0.154518
+vt 0.147570 0.169957
+vt 0.127375 0.187381
+vt 0.130082 0.187381
+vt 0.130082 0.235286
+vt 0.118010 0.169957
+vt 0.103229 0.174628
+vt 0.094650 0.124355
+vt 0.102583 0.109575
+vt 0.098455 0.131444
+vt 0.103229 0.169957
+vt 0.110516 0.124355
+vt 0.106711 0.131444
+vt 0.117408 0.179064
+vt 0.094650 0.153916
+vt 0.098455 0.146827
+vt 0.127375 0.235286
+vt 0.126310 0.244268
+vt 0.138205 0.235286
+vt 0.135498 0.235286
+vt 0.119829 0.244268
+vt 0.110270 0.256245
+vt 0.139270 0.244268
+vt 0.144050 0.256245
+vt 0.121530 0.256245
+vt 0.147311 0.278534
+vt 0.145751 0.244268
+vt 0.155310 0.256245
+vt 0.118269 0.278534
+vt 0.147311 0.305148
+vt 0.101543 0.235066
+vt 0.072502 0.235066
+vt 0.073503 0.236281
+vt 0.103749 0.278534
+vt 0.118269 0.305148
+vt 0.161831 0.278534
+vt 0.161831 0.305148
+vt 0.102583 0.110094
+vt 0.110377 0.124615
+vt 0.109611 0.125616
+vt 0.110377 0.153656
+vt 0.102583 0.168177
+vt 0.109611 0.152414
+vt 0.116063 0.235066
+vt 0.100301 0.236281
+vt 0.057981 0.235066
+vt 0.086902 0.178396
+vt 0.060104 0.236281
+vt 0.113699 0.236281
+vt 0.102583 0.123753
+vt 0.533523 0.919749
+vt 0.533523 0.957852
+vt 0.707599 0.512341
+vt 0.508265 0.578064
+vt 0.863038 0.823679
+vt 0.707599 0.668010
+vt 0.905292 0.957429
+vt 0.622211 0.776012
+vt 0.707368 0.715489
+vt 0.533523 0.919326
+vt 0.912899 0.854447
+vt 0.663946 0.504998
+vt 0.657579 0.599545
+vt 0.746642 0.966582
+vt 0.657579 0.607677
+vt 0.746642 0.966979
+vt 0.528328 0.884305
+vt 0.657182 0.755055
+vt 0.875496 0.689953
+vt 0.746642 0.990146
+vt 0.875896 0.607280
+vt 0.739939 0.933423
+vt 0.895502 0.517666
+vt 0.528328 0.966582
+vt 0.657579 0.607279
+vt 0.752895 0.884702
+vt 0.889006 0.820553
+vt 0.875496 0.582767
+vt 0.889111 0.566386
+vt 0.888609 0.820553
+vt 0.766114 0.886448
+vt 0.875892 0.582767
+vt 0.766114 0.820950
+vt 0.882409 0.657614
+vt 0.901828 0.886449
+vt 0.889112 0.755055
+vt 0.869190 0.640836
+vt 0.869190 0.673175
+vt 0.766114 0.820553
+vt 0.869190 0.659956
+vt 0.888715 0.755055
+vt 0.882012 0.657614
+vt 0.868793 0.689556
+vt 0.889006 0.886052
+vt 0.901934 0.549212
+vt 0.739542 0.884702
+vt 0.886772 0.886051
+vt 0.893665 0.565989
+vt 0.739540 0.976483
+vt 0.739540 0.971533
+vt 0.951152 0.899867
+vt 0.951152 0.933026
+vt 0.106711 0.146827
+vt 0.103749 0.305148
+vt 0.102419 0.112218
+vt 0.102419 0.165813
+vt 0.176655 0.902678
+vt 0.177195 0.893095
+vt 0.017048 0.894869
+vt 0.175049 0.789769
+vt 0.175642 0.911615
+vt 0.019454 0.789409
+vt 0.172299 0.777935
+vt 0.019488 0.777616
+vt 0.194225 0.892858
+vt 0.188367 0.779011
+vt 0.220229 0.892814
+vt 0.185989 0.902579
+vt 0.183371 0.911603
+vt 0.212963 0.780571
+vt 0.379965 0.900404
+vt 0.183492 0.789933
+vt 0.210776 0.911687
+vt 0.218479 0.901319
+vt 0.367145 0.793339
+vt 0.391357 0.794319
+vt 0.213720 0.792797
+vt 0.370492 0.908704
+vt 0.367608 0.800840
+vt 0.406722 0.906137
+vt 0.410730 0.918007
+vt 0.394868 0.799588
+vt 0.378842 0.909853
+vt 0.013364 0.906932
+vt 0.017669 0.909263
+vt 0.396496 0.908115
+vn -1.000000 0.000000 0.000000
+vn 0.030915 -0.999512 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn -0.999969 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.030915 -0.999512 0.000000
+vn 0.000000 -0.995025 0.099399
+vn 0.707327 -0.135258 -0.693808
+vn 0.000000 -0.999786 -0.020051
+vn 0.000000 0.999969 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.707083 0.000000 -0.707083
+vn 0.000000 -0.191351 -0.981506
+vn 0.000000 0.000000 -0.999969
+vn -0.866024 0.000000 0.499985
+vn 0.866024 0.000000 -0.499985
+vn 0.866024 0.000000 0.499985
+vn -0.866024 0.000000 -0.499985
+vn -0.499985 0.000000 0.866024
+vn 0.499985 0.000000 0.866024
+vn 0.953551 0.000000 -0.301187
+vn 0.301187 0.000000 0.953551
+vn -0.953551 0.000000 0.301187
+vn -0.301187 0.000000 -0.953551
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -0.999969 0.000000
+vn 0.301157 0.000000 0.953551
+vn -0.953551 0.000000 0.301157
+vn 0.953551 0.000000 -0.301157
+vn -0.298288 -0.888577 0.348430
+vn -0.894589 -0.323740 -0.307993
+vn -0.001007 -0.758446 -0.651692
+vn -0.736198 0.009186 0.676656
+vn 0.709586 -0.694174 0.120579
+vn 0.255226 -0.219733 0.941557
+vn -0.709586 0.694174 -0.120579
+vn -0.255226 0.219733 -0.941557
+vn 0.736198 -0.009186 -0.676656
+vn 0.894589 0.323740 0.307993
+vn 0.001007 0.758446 0.651692
+vn 0.298288 0.888577 -0.348430
+vn 0.251289 0.471114 0.845485
+vn -0.060549 0.978484 -0.197150
+vn -0.463698 0.077792 0.882565
+vn -0.814905 0.548326 -0.187719
+vn -0.577136 -0.550829 0.602893
+vn -0.871090 -0.080203 -0.484451
+vn 0.060549 -0.978484 0.197150
+vn -0.251289 -0.471114 -0.845485
+vn 0.814905 -0.548326 0.187719
+vn 0.463698 -0.077792 -0.882565
+vn 0.871090 0.080203 0.484451
+vn 0.577136 0.550829 -0.602893
+vn 0.369091 0.904630 0.213080
+vn 0.369091 0.904630 -0.213080
+vn 0.756615 0.486465 -0.436842
+vn -0.741844 0.515915 -0.428297
+vn -0.741844 0.515915 0.428297
+vn -0.369091 0.904630 -0.213080
+vn 0.000000 -0.609973 -0.792383
+vn 0.000000 0.515915 -0.856624
+vn 0.741844 0.515915 -0.428297
+vn 0.000000 0.904630 -0.426191
+vn 0.000000 0.486465 -0.873653
+vn 0.686239 -0.609973 -0.396191
+vn 0.741844 0.515915 0.428297
+vn 0.000000 0.486465 0.873653
+vn 0.756615 0.486465 0.436842
+vn 0.799799 -0.383435 0.461776
+vn 0.686239 -0.609973 0.396191
+vn 0.000000 0.515915 0.856624
+vn -0.369091 0.904630 0.213080
+vn 0.000000 -0.609973 0.792383
+vn -0.686239 -0.609973 0.396191
+vn -0.686239 -0.609973 -0.396191
+vn 0.000000 0.904630 0.426191
+vn -0.756615 0.486465 -0.436842
+vn 0.000000 -0.383435 0.923551
+vn 0.671407 -0.631581 0.387646
+vn 0.000000 -0.383435 -0.923551
+vn -0.756615 0.486465 0.436842
+vn -0.799799 -0.383435 0.461776
+vn 0.799799 -0.383435 -0.461776
+vn -0.799799 -0.383435 -0.461776
+vn 0.000000 -0.631581 0.775292
+vn 0.000000 -0.437361 0.899258
+vn 0.671407 -0.631581 -0.387646
+vn -0.671407 -0.631581 -0.387646
+vn -0.671407 -0.631581 0.387646
+vn -0.778771 -0.437361 -0.449629
+vn -0.778771 -0.437361 0.449629
+vn -0.857967 -0.135868 -0.495346
+vn 0.000000 -0.631581 -0.775292
+vn 0.000000 -0.437361 -0.899258
+vn 0.778771 -0.437361 -0.449629
+vn -0.857967 -0.135868 0.495346
+vn -0.779931 0.421735 -0.462386
+vn 0.778771 -0.437361 0.449629
+vn 0.857967 -0.135868 0.495346
+vn 0.857967 -0.135868 -0.495346
+vn -0.787530 0.409497 0.460494
+vn -0.009552 0.999756 -0.018677
+vn 0.000000 -0.135868 0.990722
+vn 0.765709 0.473769 0.434980
+vn 0.000000 -0.135868 -0.990722
+vn 0.010376 0.459670 -0.887997
+vn 0.761406 0.479019 -0.436720
+vn 0.012177 0.444380 0.895718
+vn -0.108676 0.993500 -0.033326
+vn -0.111728 0.992309 0.052675
+vn -0.008026 0.998871 0.046297
+vn -0.051759 0.997345 -0.051119
+vn -0.043825 0.995819 0.080111
+vn 0.000000 0.486465 -0.873684
+vn 0.671438 -0.631581 0.387646
+vn 0.756615 0.486496 -0.436842
+vn 0.756615 0.486496 0.436842
+vn -0.051790 0.997345 -0.051088
+vn 0.667287 0.139409 0.731620
+vn 0.707083 0.000000 0.707083
+vn -0.740379 -0.095126 -0.665365
+vn 0.000000 -0.141545 -0.989929
+vn -0.707083 0.000000 -0.707083
+vn -0.667287 0.139409 0.731620
+vn -0.707083 0.000000 0.707083
+vn 0.663778 0.411603 0.624439
+vn -0.663778 0.411603 0.624439
+vn 0.646870 0.674490 0.355785
+vn 0.000000 -0.510300 -0.859981
+vn -0.646870 0.674490 0.355785
+vn 0.625416 0.759117 -0.180425
+vn -0.767602 -0.327036 -0.551164
+vn 0.000000 -0.879910 -0.475112
+vn 0.999969 0.000000 0.000000
+vn -0.625416 0.759117 -0.180425
+vn -0.571825 0.061678 -0.818018
+vn -0.777123 -0.553728 -0.298990
+vn 0.000000 -0.972655 0.232154
+vn -0.816797 -0.561113 0.133915
+vn 0.571825 0.061678 -0.818018
+vn 0.726402 -0.475723 -0.495926
+vn -0.582202 -0.811274 -0.053255
+vn 0.000000 -0.780663 0.624897
+s 1
+f 41/1/1 38/2/1 45/3/1
+f 31/4/2 27/5/2 40/6/2
+f 1/7/3 5/8/3 6/9/3
+f 21/10/4 22/11/4 7/12/4
+f 25/13/1 26/14/5 29/15/1
+f 18/16/6 17/17/6 4/18/6
+f 23/19/7 19/20/7 10/21/7
+f 20/22/8 32/23/8 33/24/9
+f 28/25/10 24/26/10 34/27/10
+f 13/28/11 16/29/12 14/30/12
+f 35/31/3 33/24/9 42/32/13
+f 33/24/9 12/33/14 46/34/15
+f 39/35/4 36/36/4 48/37/4
+f 67/38/4 68/39/4 69/40/16
+f 51/41/6 52/42/6 54/43/17
+f 53/44/17 54/43/17 56/45/18
+f 69/40/16 70/46/16 71/47/19
+f 63/48/17 64/49/17 66/50/3
+f 55/51/18 56/45/18 58/52/4
+f 71/47/19 72/53/19 50/54/6
+f 50/54/6 49/55/6 64/49/17
+f 57/56/4 58/52/4 59/57/20
+f 61/58/19 62/59/19 51/41/6
+f 100/60/1 99/61/1 61/58/19
+f 98/62/21 97/63/21 68/39/4
+f 105/64/22 106/65/22 102/66/22
+f 147/67/23 107/68/23 103/69/23
+f 153/70/24 108/71/24 155/72/24
+f 157/73/25 145/74/25 159/75/25
+f 152/76/26 150/77/26 156/78/27
+f 158/79/12 154/80/12 148/81/12
+f 180/82/22 183/83/22 189/84/22
+f 116/85/27 115/86/27 114/87/26
+f 117/88/12 120/89/12 125/90/11
+f 110/91/24 109/92/24 170/93/24
+f 111/94/28 175/95/28 171/96/28
+f 112/97/22 182/98/22 179/99/22
+f 186/100/12 118/101/12 119/102/12
+f 162/103/26 165/104/26 123/105/27
+f 176/106/28 181/107/28 196/108/28
+f 172/109/24 177/110/24 187/111/24
+f 121/112/25 122/113/25 168/114/25
+f 203/115/25 200/116/25 208/117/25
+f 209/118/12 190/119/12 218/120/12
+f 173/121/29 188/122/29 201/123/29
+f 192/124/23 184/125/23 127/126/23
+f 167/127/29 174/128/29 169/129/29
+f 214/130/26 222/131/26 243/132/26
+f 131/133/25 130/134/25 137/135/25
+f 198/136/25 204/137/25 223/138/25
+f 185/139/23 163/140/23 128/141/23
+f 205/142/25 210/143/25 225/144/25
+f 164/145/26 199/146/26 224/147/27
+f 135/148/30 237/149/30 231/150/30
+f 133/151/30 134/152/30 244/153/30
+f 238/154/22 241/155/22 144/156/22
+f 227/157/25 229/158/25 232/159/25
+f 230/160/12 219/161/12 246/162/12
+f 220/163/24 212/164/24 141/165/24
+f 252/166/23 248/167/23 257/168/23
+f 247/169/23 140/170/23 143/171/23
+f 215/172/26 235/173/27 254/174/26
+f 242/175/12 221/176/12 253/177/11
+f 213/178/24 216/179/24 249/180/24
+f 236/181/22 239/182/22 258/183/22
+f 261/184/31 262/185/32 263/186/33
+f 262/185/32 261/184/31 266/187/34
+f 261/188/31 263/189/33 264/190/35
+f 261/188/31 264/190/35 265/191/36
+f 261/184/31 265/192/36 266/187/34
+f 262/185/32 266/187/34 271/193/37
+f 263/186/33 262/185/32 267/194/38
+f 264/195/35 263/196/33 268/197/39
+f 265/198/36 264/195/35 269/199/40
+f 266/187/34 265/192/36 270/200/41
+f 262/185/32 271/193/37 267/194/38
+f 263/196/33 267/201/38 268/197/39
+f 264/195/35 268/197/39 269/199/40
+f 265/198/36 269/199/40 270/202/41
+f 266/187/34 270/200/41 271/193/37
+f 267/203/38 271/204/37 272/188/42
+f 268/197/39 267/201/38 272/205/42
+f 269/199/40 268/197/39 272/205/42
+f 270/202/41 269/199/40 272/205/42
+f 271/204/37 270/206/41 272/188/42
+f 273/207/31 274/208/32 275/209/33
+f 274/208/32 273/207/31 278/210/34
+f 273/207/31 275/209/33 276/211/35
+f 273/207/31 276/211/35 277/212/36
+f 273/207/31 277/212/36 278/210/34
+f 274/208/32 278/210/34 283/213/37
+f 275/209/33 274/208/32 279/214/38
+f 276/211/35 275/209/33 280/215/39
+f 277/212/36 276/211/35 281/216/40
+f 278/210/34 277/212/36 282/217/41
+f 274/208/32 283/213/37 279/214/38
+f 275/209/33 279/214/38 280/215/39
+f 276/211/35 280/215/39 281/216/40
+f 277/212/36 281/216/40 282/217/41
+f 278/210/34 282/217/41 283/213/37
+f 279/214/38 283/213/37 284/218/42
+f 280/215/39 279/214/38 284/218/42
+f 281/216/40 280/215/39 284/218/42
+f 282/217/41 281/216/40 284/218/42
+f 283/213/37 282/217/41 284/218/42
+f 285/219/31 286/220/32 287/221/33
+f 286/220/32 285/219/31 290/222/34
+f 285/223/31 287/224/33 288/225/35
+f 285/223/31 288/225/35 289/226/36
+f 285/219/31 289/227/36 290/222/34
+f 286/220/32 290/222/34 295/228/37
+f 287/221/33 286/220/32 291/229/38
+f 288/230/35 287/231/33 292/232/39
+f 289/233/36 288/230/35 293/234/40
+f 290/222/34 289/227/36 294/235/41
+f 286/220/32 295/228/37 291/229/38
+f 287/231/33 291/236/38 292/232/39
+f 288/230/35 292/232/39 293/234/40
+f 289/233/36 293/234/40 294/237/41
+f 290/222/34 294/235/41 295/228/37
+f 291/238/38 295/239/37 296/240/42
+f 292/232/39 291/236/38 296/241/42
+f 293/234/40 292/232/39 296/241/42
+f 294/237/41 293/234/40 296/241/42
+f 295/239/37 294/242/41 296/240/42
+f 297/243/43 298/244/44 299/245/45
+f 299/245/45 300/246/46 301/247/47
+f 301/247/47 302/248/48 303/249/49
+f 303/249/49 304/250/50 305/251/51
+f 302/248/48 306/252/52 304/250/50
+f 307/253/53 308/254/54 297/243/43
+f 305/251/51 306/252/52 307/253/53
+f 297/243/43 299/245/45 307/253/53
+f 309/255/43 310/256/44 311/257/45
+f 311/257/45 312/258/46 313/259/47
+f 313/259/47 314/260/48 315/261/49
+f 315/261/49 316/262/50 317/263/51
+f 314/260/48 318/264/52 316/262/50
+f 319/265/53 320/266/54 309/255/43
+f 317/263/51 318/264/52 319/265/53
+f 309/255/43 311/257/45 319/265/53
+f 335/267/55 321/268/56 339/269/57
+f 334/270/58 332/271/59 338/268/60
+f 323/272/61 324/273/62 326/270/63
+f 322/274/64 338/268/60 340/275/65
+f 326/276/63 324/277/62 322/278/64
+f 325/279/66 326/270/63 328/271/67
+f 342/280/68 341/281/69 347/282/70
+f 328/271/67 326/270/63 321/268/56
+f 327/283/71 328/271/67 330/284/72
+f 332/285/59 330/286/72 337/287/73
+f 321/268/56 322/274/64 339/269/57
+f 329/288/74 330/284/72 331/283/75
+f 330/286/72 328/289/67 335/290/55
+f 333/279/76 334/270/58 323/272/61
+f 331/283/75 332/271/59 333/279/76
+f 336/291/77 335/267/55 341/281/69
+f 324/277/62 334/292/58 338/293/60
+f 323/277/61 325/276/66 333/292/76
+f 337/267/73 336/291/77 342/280/68
+f 338/268/60 337/267/73 344/269/78
+f 348/294/79 347/282/70 353/295/80
+f 339/269/57 340/275/65 346/296/81
+f 340/275/65 344/269/78 346/296/81
+f 343/281/82 342/280/68 349/282/83
+f 341/281/69 339/269/57 345/297/84
+f 344/269/78 343/281/82 350/297/85
+f 354/298/86 353/295/80 360/299/87
+f 345/297/84 346/296/81 351/300/88
+f 346/296/81 350/297/85 356/300/89
+f 349/282/83 348/294/79 355/295/90
+f 347/282/70 345/297/84 351/300/88
+f 350/297/85 349/282/83 356/300/89
+f 362/301/91 361/302/92 368/303/93
+f 351/300/88 352/304/94 358/305/95
+f 352/304/94 356/300/89 358/305/95
+f 355/295/90 354/298/86 361/302/92
+f 353/295/80 351/300/88 357/301/96
+f 356/300/89 355/295/90 362/301/91
+f 368/303/93 367/306/97 374/307/98
+f 360/299/87 359/302/99 365/306/100
+f 357/301/96 358/305/95 363/303/101
+f 358/305/95 362/301/91 368/303/93
+f 361/302/92 360/299/87 367/306/97
+f 359/302/99 357/301/96 363/303/101
+f 374/308/98 373/309/102 379/310/103
+f 366/311/104 365/306/100 371/312/105
+f 363/303/101 364/313/106 370/314/107
+f 364/313/106 368/303/93 370/314/107
+f 367/306/97 366/311/104 373/312/102
+f 365/306/100 363/303/101 369/307/108
+f 372/315/109 371/316/105 377/317/110
+f 369/318/108 370/319/107 375/320/111
+f 370/321/107 374/308/98 380/322/112
+f 373/309/102 372/323/109 379/310/103
+f 371/309/105 369/308/108 375/322/111
+f 380/322/112 379/310/103 381/324/12
+f 378/325/113 377/310/110 381/324/12
+f 375/322/111 376/326/114 381/324/12
+f 376/326/114 380/322/112 381/324/12
+f 379/310/103 378/325/113 381/324/12
+f 377/310/110 375/322/111 381/324/12
+f 396/267/55 382/268/56 400/269/57
+f 395/270/58 393/271/59 399/268/60
+f 384/272/61 385/273/62 387/270/63
+f 383/274/64 399/268/60 401/275/115
+f 387/276/63 385/277/62 383/278/64
+f 386/279/66 387/270/63 389/271/67
+f 403/280/68 402/281/69 408/282/70
+f 389/271/67 387/270/63 382/268/56
+f 388/283/71 389/271/67 391/284/72
+f 393/285/59 391/286/72 398/287/73
+f 382/268/56 383/274/64 400/269/57
+f 390/288/74 391/284/72 392/283/75
+f 391/286/72 389/289/67 397/327/77
+f 394/279/76 395/270/58 384/272/61
+f 392/283/75 393/271/59 394/279/76
+f 397/291/77 396/267/55 402/281/69
+f 385/277/62 395/292/58 383/278/64
+f 384/277/61 386/276/66 394/292/76
+f 398/267/73 397/291/77 404/281/82
+f 399/268/60 398/267/73 405/269/78
+f 409/294/79 408/282/70 414/295/116
+f 400/269/57 401/275/115 407/296/81
+f 401/275/115 405/269/78 407/296/81
+f 404/281/82 403/280/68 410/282/83
+f 402/281/69 400/269/57 406/297/84
+f 405/269/78 404/281/82 411/297/85
+f 415/298/86 414/295/116 420/302/99
+f 406/297/84 407/296/81 412/300/88
+f 407/296/81 411/297/85 417/300/89
+f 410/282/83 409/294/79 416/295/90
+f 408/282/70 406/297/84 412/300/88
+f 411/297/85 410/282/83 417/300/89
+f 423/301/91 422/302/92 429/303/93
+f 412/300/88 413/304/94 419/305/95
+f 413/304/94 417/300/89 423/301/91
+f 416/295/90 415/298/86 422/302/92
+f 414/295/116 412/300/88 418/301/96
+f 417/300/89 416/295/90 423/301/91
+f 429/303/93 428/306/97 435/307/98
+f 421/299/87 420/302/99 426/306/100
+f 418/301/96 419/305/95 425/313/106
+f 419/305/95 423/301/91 425/313/106
+f 422/302/92 421/299/87 428/306/97
+f 420/302/99 418/301/96 424/303/101
+f 435/308/98 434/309/102 440/310/103
+f 427/311/104 426/306/100 432/312/105
+f 424/303/101 425/313/106 431/314/107
+f 425/313/106 429/303/93 431/314/107
+f 428/306/97 427/311/104 434/312/102
+f 426/306/100 424/303/101 430/307/108
+f 433/315/109 432/316/105 438/317/110
+f 430/318/108 431/319/107 436/320/111
+f 431/321/107 435/308/98 441/322/112
+f 434/309/102 433/323/109 440/310/103
+f 432/309/105 430/308/108 436/322/111
+f 441/322/112 440/310/103 442/324/12
+f 439/325/113 438/310/110 442/324/12
+f 436/322/111 437/326/114 442/324/12
+f 437/326/114 441/322/112 442/324/12
+f 440/310/103 439/325/113 442/324/12
+f 438/310/110 436/322/111 442/324/12
+f 457/267/55 443/268/56 461/269/117
+f 456/270/58 454/271/59 460/268/60
+f 445/272/61 446/273/62 448/270/63
+f 444/274/64 460/268/60 462/275/65
+f 448/276/63 446/277/62 444/278/64
+f 447/279/66 448/270/63 450/271/67
+f 464/280/68 463/281/118 469/282/70
+f 450/271/67 448/270/63 443/268/56
+f 449/283/71 450/271/67 452/284/72
+f 454/285/59 452/286/72 459/287/73
+f 443/268/56 444/274/64 461/269/117
+f 451/288/74 452/284/72 453/283/75
+f 452/286/72 450/289/67 458/327/77
+f 455/279/76 456/270/58 445/272/61
+f 453/283/75 454/271/59 455/279/76
+f 458/291/77 457/267/55 463/281/118
+f 446/277/62 456/292/58 444/278/64
+f 445/277/61 447/276/66 455/292/76
+f 459/267/73 458/291/77 464/280/68
+f 460/268/60 459/267/73 466/269/78
+f 470/294/79 469/282/70 475/295/80
+f 461/269/117 462/275/65 468/296/81
+f 462/275/65 466/269/78 468/296/81
+f 465/281/82 464/280/68 471/282/83
+f 463/281/118 461/269/117 467/297/84
+f 466/269/78 465/281/82 472/297/85
+f 476/298/86 475/295/80 482/299/87
+f 467/297/84 468/296/81 473/300/88
+f 468/296/81 472/297/85 478/300/89
+f 471/282/83 470/294/79 477/295/90
+f 469/282/70 467/297/84 473/300/88
+f 472/297/85 471/282/83 478/300/89
+f 484/301/91 483/302/92 490/303/93
+f 473/300/88 474/304/94 480/305/95
+f 474/304/94 478/300/89 480/305/95
+f 477/295/90 476/298/86 483/302/92
+f 475/295/80 473/300/88 479/301/96
+f 478/300/89 477/295/90 484/301/91
+f 490/303/93 489/306/97 496/307/98
+f 482/299/87 481/302/99 487/306/100
+f 479/301/96 480/305/95 485/303/101
+f 480/305/95 484/301/91 486/313/106
+f 483/302/92 482/299/87 489/306/97
+f 481/302/99 479/301/96 485/303/101
+f 496/308/98 495/309/102 501/310/103
+f 488/311/104 487/306/100 493/312/105
+f 485/303/101 486/313/106 492/314/107
+f 486/313/106 490/303/93 492/314/107
+f 489/306/97 488/311/104 495/312/102
+f 487/306/100 485/303/101 491/307/108
+f 494/315/109 493/316/105 499/317/110
+f 491/318/108 492/319/107 497/320/111
+f 492/321/107 496/308/98 502/322/112
+f 495/309/102 494/323/109 501/310/103
+f 493/309/105 491/308/108 497/322/111
+f 502/322/112 501/310/103 503/324/11
+f 500/325/119 499/310/110 503/324/11
+f 497/322/111 498/326/114 503/324/11
+f 498/326/114 502/322/112 503/324/11
+f 501/310/103 500/325/119 503/324/11
+f 499/310/110 497/322/111 503/324/11
+f 38/2/1 47/328/1 45/3/1
+f 27/5/2 37/329/2 40/6/2
+f 2/330/3 1/7/3 6/9/3
+f 3/331/4 21/10/4 7/12/4
+f 26/14/5 8/332/5 29/15/1
+f 30/333/6 18/16/6 4/18/6
+f 19/20/7 9/334/7 10/21/7
+f 32/23/8 12/33/14 33/24/9
+f 11/335/10 28/25/10 34/27/10
+f 16/29/12 15/336/12 14/30/12
+f 43/337/3 35/31/3 42/32/13
+f 42/32/13 33/24/9 46/34/15
+f 36/36/4 44/338/4 48/37/4
+f 68/39/4 70/46/16 69/40/16
+f 53/44/17 51/41/6 54/43/17
+f 55/51/18 53/44/17 56/45/18
+f 70/46/16 72/53/19 71/47/19
+f 65/339/3 63/48/17 66/50/3
+f 57/56/4 55/51/18 58/52/4
+f 72/53/19 49/55/6 50/54/6
+f 63/48/17 50/54/6 64/49/17
+f 58/52/4 60/50/20 59/57/20
+f 62/59/19 52/42/6 51/41/6
+f 99/61/1 62/59/19 61/58/19
+f 67/38/4 98/62/21 68/39/4
+f 101/340/22 105/64/22 102/66/22
+f 149/341/23 147/67/23 103/69/23
+f 108/71/24 104/342/24 155/72/24
+f 145/74/25 151/343/25 159/75/25
+f 160/344/26 152/76/26 156/78/27
+f 146/345/12 158/79/12 148/81/12
+f 195/346/22 180/82/22 189/84/22
+f 113/347/26 116/85/27 114/87/26
+f 120/89/12 126/348/12 125/90/11
+f 109/92/24 166/349/24 170/93/24
+f 178/350/28 111/94/28 171/96/28
+f 161/351/22 112/97/22 179/99/22
+f 191/352/12 186/100/12 119/102/12
+f 124/353/26 162/103/26 123/105/27
+f 193/354/28 176/106/28 196/108/28
+f 177/110/24 194/355/24 187/111/24
+f 122/113/25 197/356/25 168/114/25
+f 200/116/25 206/357/25 208/117/25
+f 228/358/11 209/118/12 218/120/12
+f 188/122/29 207/359/29 201/123/29
+f 129/360/23 192/124/23 127/126/23
+f 174/128/29 202/361/29 169/129/29
+f 234/362/26 214/130/26 243/132/26
+f 130/134/25 136/363/25 137/135/25
+f 204/137/25 226/364/25 223/138/25
+f 211/365/23 185/139/23 128/141/23
+f 210/143/25 132/366/25 225/144/25
+f 217/367/26 164/145/26 224/147/27
+f 138/368/30 135/148/30 231/150/30
+f 233/369/30 133/151/30 244/153/30
+f 256/370/22 238/154/22 144/156/22
+f 229/158/25 245/371/25 232/159/25
+f 219/161/12 240/372/12 246/162/12
+f 212/164/24 139/373/24 141/165/24
+f 259/374/23 252/166/23 257/168/23
+f 142/375/23 247/169/23 143/171/23
+f 250/376/26 215/172/26 254/174/26
+f 260/377/11 242/175/12 253/177/11
+f 216/179/24 251/378/24 249/180/24
+f 255/379/22 236/181/22 258/183/22
+f 298/244/44 300/246/46 299/245/45
+f 300/246/46 302/248/48 301/247/47
+f 302/248/48 304/250/50 303/249/49
+f 304/250/50 306/252/52 305/251/51
+f 302/248/48 300/246/46 306/252/52
+f 300/246/46 298/244/44 306/252/52
+f 298/244/44 308/254/54 306/252/52
+f 308/254/54 298/244/44 297/243/43
+f 306/252/52 308/254/54 307/253/53
+f 299/245/45 301/247/47 307/253/53
+f 301/247/47 303/249/49 305/251/51
+f 307/253/53 301/247/47 305/251/51
+f 310/256/44 312/258/46 311/257/45
+f 312/258/46 314/260/48 313/259/47
+f 314/260/48 316/262/50 315/261/49
+f 316/262/50 318/264/52 317/263/51
+f 314/260/48 320/266/54 318/264/52
+f 312/258/46 310/256/44 314/260/48
+f 310/256/44 320/266/54 314/260/48
+f 320/266/54 310/256/44 309/255/43
+f 318/264/52 320/266/54 319/265/53
+f 311/257/45 313/259/47 319/265/53
+f 313/259/47 315/261/49 317/263/51
+f 319/265/53 313/259/47 317/263/51
+f 341/281/69 335/267/55 339/269/57
+f 332/271/59 337/267/73 338/268/60
+f 325/279/66 323/272/61 326/270/63
+f 338/268/60 344/269/78 340/275/65
+f 321/380/56 326/276/63 322/278/64
+f 327/283/71 325/279/66 328/271/67
+f 348/294/79 342/280/68 347/282/70
+f 335/267/55 328/271/67 321/268/56
+f 329/288/74 327/283/71 330/284/72
+f 330/286/72 336/327/77 337/287/73
+f 322/274/64 340/275/65 339/269/57
+f 330/284/72 332/271/59 331/283/75
+f 336/327/77 330/286/72 335/290/55
+f 334/270/58 324/273/62 323/272/61
+f 332/271/59 334/270/58 333/279/76
+f 342/280/68 336/291/77 341/281/69
+f 322/278/64 324/277/62 338/293/60
+f 325/276/66 327/289/71 333/292/76
+f 327/289/71 329/286/74 331/285/75
+f 333/292/76 327/289/71 331/285/75
+f 343/281/82 337/267/73 342/280/68
+f 337/267/73 343/281/82 344/269/78
+f 354/298/86 348/294/79 353/295/80
+f 345/297/84 339/269/57 346/296/81
+f 344/269/78 350/297/85 346/296/81
+f 342/280/68 348/294/79 349/282/83
+f 347/282/70 341/281/69 345/297/84
+f 343/281/82 349/282/83 350/297/85
+f 353/295/80 359/302/99 360/299/87
+f 346/296/81 352/304/94 351/300/88
+f 352/304/94 346/296/81 356/300/89
+f 348/294/79 354/298/86 355/295/90
+f 353/295/80 347/282/70 351/300/88
+f 349/282/83 355/295/90 356/300/89
+f 361/302/92 367/306/97 368/303/93
+f 357/301/96 351/300/88 358/305/95
+f 356/300/89 362/301/91 358/305/95
+f 354/298/86 360/299/87 361/302/92
+f 359/302/99 353/295/80 357/301/96
+f 355/295/90 361/302/92 362/301/91
+f 367/306/97 373/312/102 374/307/98
+f 366/311/104 360/299/87 365/306/100
+f 358/305/95 364/313/106 363/303/101
+f 364/313/106 358/305/95 368/303/93
+f 360/299/87 366/311/104 367/306/97
+f 365/306/100 359/302/99 363/303/101
+f 380/322/112 374/308/98 379/310/103
+f 372/381/109 366/311/104 371/312/105
+f 369/307/108 363/303/101 370/314/107
+f 368/303/93 374/307/98 370/314/107
+f 366/311/104 372/381/109 373/312/102
+f 371/312/105 365/306/100 369/307/108
+f 378/382/113 372/315/109 377/317/110
+f 370/319/107 376/383/114 375/320/111
+f 376/326/114 370/321/107 380/322/112
+f 372/323/109 378/325/113 379/310/103
+f 377/310/110 371/309/105 375/322/111
+f 402/281/69 396/267/55 400/269/57
+f 393/271/59 398/267/73 399/268/60
+f 386/279/66 384/272/61 387/270/63
+f 399/268/60 405/269/78 401/275/115
+f 382/380/56 387/276/63 383/278/64
+f 388/283/71 386/279/66 389/271/67
+f 409/294/79 403/280/68 408/282/70
+f 396/267/55 389/271/67 382/268/56
+f 390/288/74 388/283/71 391/284/72
+f 391/286/72 397/327/77 398/287/73
+f 383/274/64 401/275/115 400/269/57
+f 391/284/72 393/271/59 392/283/75
+f 389/289/67 396/290/55 397/327/77
+f 395/270/58 385/273/62 384/272/61
+f 393/271/59 395/270/58 394/279/76
+f 403/280/68 397/291/77 402/281/69
+f 395/292/58 399/293/60 383/278/64
+f 386/276/66 388/289/71 394/292/76
+f 388/289/71 390/286/74 392/285/75
+f 394/292/76 388/289/71 392/285/75
+f 397/291/77 403/280/68 404/281/82
+f 398/267/73 404/281/82 405/269/78
+f 415/298/86 409/294/79 414/295/116
+f 406/297/84 400/269/57 407/296/81
+f 405/269/78 411/297/85 407/296/81
+f 403/280/68 409/294/79 410/282/83
+f 408/282/70 402/281/69 406/297/84
+f 404/281/82 410/282/83 411/297/85
+f 421/299/87 415/298/86 420/302/99
+f 407/296/81 413/304/94 412/300/88
+f 413/304/94 407/296/81 417/300/89
+f 409/294/79 415/298/86 416/295/90
+f 414/295/116 408/282/70 412/300/88
+f 410/282/83 416/295/90 417/300/89
+f 422/302/92 428/306/97 429/303/93
+f 418/301/96 412/300/88 419/305/95
+f 419/305/95 413/304/94 423/301/91
+f 415/298/86 421/299/87 422/302/92
+f 420/302/99 414/295/116 418/301/96
+f 416/295/90 422/302/92 423/301/91
+f 428/306/97 434/312/102 435/307/98
+f 427/311/104 421/299/87 426/306/100
+f 424/303/101 418/301/96 425/313/106
+f 423/301/91 429/303/93 425/313/106
+f 421/299/87 427/311/104 428/306/97
+f 426/306/100 420/302/99 424/303/101
+f 441/322/112 435/308/98 440/310/103
+f 433/381/109 427/311/104 432/312/105
+f 430/307/108 424/303/101 431/314/107
+f 429/303/93 435/307/98 431/314/107
+f 427/311/104 433/381/109 434/312/102
+f 432/312/105 426/306/100 430/307/108
+f 439/382/113 433/315/109 438/317/110
+f 431/319/107 437/383/114 436/320/111
+f 437/326/114 431/321/107 441/322/112
+f 433/323/109 439/325/113 440/310/103
+f 438/310/110 432/309/105 436/322/111
+f 463/281/118 457/267/55 461/269/117
+f 454/271/59 459/267/73 460/268/60
+f 447/279/66 445/272/61 448/270/63
+f 460/268/60 466/269/78 462/275/65
+f 443/380/56 448/276/63 444/278/64
+f 449/283/71 447/279/66 450/271/67
+f 470/294/79 464/280/68 469/282/70
+f 457/267/55 450/271/67 443/268/56
+f 451/288/74 449/283/71 452/284/72
+f 452/286/72 458/327/77 459/287/73
+f 444/274/64 462/275/65 461/269/117
+f 452/284/72 454/271/59 453/283/75
+f 450/289/67 457/290/55 458/327/77
+f 456/270/58 446/273/62 445/272/61
+f 454/271/59 456/270/58 455/279/76
+f 464/280/68 458/291/77 463/281/118
+f 456/292/58 460/293/60 444/278/64
+f 447/276/66 449/289/71 455/292/76
+f 449/289/71 451/286/74 453/285/75
+f 455/292/76 449/289/71 453/285/75
+f 465/281/82 459/267/73 464/280/68
+f 459/267/73 465/281/82 466/269/78
+f 476/298/86 470/294/79 475/295/80
+f 467/297/84 461/269/117 468/296/81
+f 466/269/78 472/297/85 468/296/81
+f 464/280/68 470/294/79 471/282/83
+f 469/282/70 463/281/118 467/297/84
+f 465/281/82 471/282/83 472/297/85
+f 475/295/80 481/302/99 482/299/87
+f 468/296/81 474/304/94 473/300/88
+f 474/304/94 468/296/81 478/300/89
+f 470/294/79 476/298/86 477/295/90
+f 475/295/80 469/282/70 473/300/88
+f 471/282/83 477/295/90 478/300/89
+f 483/302/92 489/306/97 490/303/93
+f 479/301/96 473/300/88 480/305/95
+f 478/300/89 484/301/91 480/305/95
+f 476/298/86 482/299/87 483/302/92
+f 481/302/99 475/295/80 479/301/96
+f 477/295/90 483/302/92 484/301/91
+f 489/306/97 495/312/102 496/307/98
+f 488/311/104 482/299/87 487/306/100
+f 480/305/95 486/313/106 485/303/101
+f 484/301/91 490/303/93 486/313/106
+f 482/299/87 488/311/104 489/306/97
+f 487/306/100 481/302/99 485/303/101
+f 502/322/112 496/308/98 501/310/103
+f 494/381/109 488/311/104 493/312/105
+f 491/307/108 485/303/101 492/314/107
+f 490/303/93 496/307/98 492/314/107
+f 488/311/104 494/381/109 495/312/102
+f 493/312/105 487/306/100 491/307/108
+f 500/382/119 494/315/109 499/317/110
+f 492/319/107 498/383/114 497/320/111
+f 498/326/114 492/321/107 502/322/112
+f 494/323/109 500/325/119 501/310/103
+f 499/310/110 493/309/105 497/322/111
+f 504/384/3 80/385/120 76/386/121
+f 78/387/122 79/388/123 74/389/124
+f 80/385/120 77/390/125 73/391/126
+f 77/390/125 78/387/122 73/391/126
+f 77/390/125 80/385/120 84/392/127
+f 81/393/128 84/392/127 88/394/129
+f 80/385/120 504/384/3 506/395/3
+f 79/388/123 78/387/122 83/396/130
+f 78/387/122 77/390/125 81/393/128
+f 85/397/131 88/394/129 92/398/132
+f 82/399/133 81/393/128 85/397/131
+f 83/396/130 82/399/133 87/400/134
+f 84/392/127 506/395/3 507/401/135
+f 89/402/136 92/398/132 93/403/137
+f 87/400/134 86/404/138 91/405/139
+f 88/394/129 507/401/135 92/398/132
+f 86/404/138 85/397/131 90/406/140
+f 96/407/141 95/408/142 93/403/137
+f 90/406/140 89/402/136 94/409/143
+f 91/405/139 90/406/140 94/409/143
+f 92/398/132 508/410/3 96/407/141
+f 75/411/3 504/384/3 76/386/121
+f 79/388/123 505/412/6 74/389/124
+f 76/386/121 80/385/120 73/391/126
+f 78/387/122 74/389/124 73/391/126
+f 81/393/128 77/390/125 84/392/127
+f 85/397/131 81/393/128 88/394/129
+f 84/392/127 80/385/120 506/395/3
+f 78/387/122 82/399/133 83/396/130
+f 82/399/133 78/387/122 81/393/128
+f 89/402/136 85/397/131 92/398/132
+f 86/404/138 82/399/133 85/397/131
+f 82/399/133 86/404/138 87/400/134
+f 88/394/129 84/392/127 507/401/135
+f 92/398/132 96/407/141 93/403/137
+f 86/404/138 90/406/140 91/405/139
+f 507/401/135 508/410/3 92/398/132
+f 85/397/131 89/402/136 90/406/140
+f 95/408/142 94/409/143 93/403/137
+f 89/402/136 93/403/137 94/409/143
+f 509/413/144 91/405/139 94/409/143
+f 508/410/3 95/408/142 96/407/141
diff --git a/09-september/resources/textures/back.png b/09-september/resources/textures/back.png
new file mode 100644
index 0000000..3fd0158
--- /dev/null
+++ b/09-september/resources/textures/back.png
Binary files differ
diff --git a/09-september/resources/textures/barrel.png b/09-september/resources/textures/barrel.png
new file mode 100644
index 0000000..baf502b
--- /dev/null
+++ b/09-september/resources/textures/barrel.png
Binary files differ
diff --git a/09-september/resources/textures/blendmap.png b/09-september/resources/textures/blendmap.png
new file mode 100644
index 0000000..4789845
--- /dev/null
+++ b/09-september/resources/textures/blendmap.png
Binary files differ
diff --git a/09-september/resources/textures/bottom.png b/09-september/resources/textures/bottom.png
new file mode 100644
index 0000000..8f9c0f2
--- /dev/null
+++ b/09-september/resources/textures/bottom.png
Binary files differ
diff --git a/09-september/resources/textures/boulder.png b/09-september/resources/textures/boulder.png
new file mode 100755
index 0000000..e2cb9d1
--- /dev/null
+++ b/09-september/resources/textures/boulder.png
Binary files differ
diff --git a/09-september/resources/textures/boulderNormal.png b/09-september/resources/textures/boulderNormal.png
new file mode 100755
index 0000000..cc6069a
--- /dev/null
+++ b/09-september/resources/textures/boulderNormal.png
Binary files differ
diff --git a/09-september/resources/textures/bricks.png b/09-september/resources/textures/bricks.png
new file mode 100644
index 0000000..25e3eeb
--- /dev/null
+++ b/09-september/resources/textures/bricks.png
Binary files differ
diff --git a/09-september/resources/textures/bricks2.png b/09-september/resources/textures/bricks2.png
new file mode 100644
index 0000000..cf44650
--- /dev/null
+++ b/09-september/resources/textures/bricks2.png
Binary files differ
diff --git a/09-september/resources/textures/bricks2_normal.png b/09-september/resources/textures/bricks2_normal.png
new file mode 100644
index 0000000..72b6a2d
--- /dev/null
+++ b/09-september/resources/textures/bricks2_normal.png
Binary files differ
diff --git a/09-september/resources/textures/bricks_normal.png b/09-september/resources/textures/bricks_normal.png
new file mode 100644
index 0000000..a2ee2b4
--- /dev/null
+++ b/09-september/resources/textures/bricks_normal.png
Binary files differ
diff --git a/09-september/resources/textures/default_normal_map.png b/09-september/resources/textures/default_normal_map.png
new file mode 100644
index 0000000..9dfd3a4
--- /dev/null
+++ b/09-september/resources/textures/default_normal_map.png
Binary files differ
diff --git a/09-september/resources/textures/fire.png b/09-september/resources/textures/fire.png
new file mode 100755
index 0000000..e2498d9
--- /dev/null
+++ b/09-september/resources/textures/fire.png
Binary files differ
diff --git a/09-september/resources/textures/front.png b/09-september/resources/textures/front.png
new file mode 100644
index 0000000..fbff722
--- /dev/null
+++ b/09-september/resources/textures/front.png
Binary files differ
diff --git a/09-september/resources/textures/heightmap.png b/09-september/resources/textures/heightmap.png
new file mode 100644
index 0000000..12741e5
--- /dev/null
+++ b/09-september/resources/textures/heightmap.png
Binary files differ
diff --git a/09-september/resources/textures/left.png b/09-september/resources/textures/left.png
new file mode 100644
index 0000000..374322a
--- /dev/null
+++ b/09-september/resources/textures/left.png
Binary files differ
diff --git a/09-september/resources/textures/normal_map.png b/09-september/resources/textures/normal_map.png
new file mode 100644
index 0000000..d96a41c
--- /dev/null
+++ b/09-september/resources/textures/normal_map.png
Binary files differ
diff --git a/09-september/resources/textures/particleAtlas.png b/09-september/resources/textures/particleAtlas.png
new file mode 100755
index 0000000..c202947
--- /dev/null
+++ b/09-september/resources/textures/particleAtlas.png
Binary files differ
diff --git a/09-september/resources/textures/particleStar.png b/09-september/resources/textures/particleStar.png
new file mode 100755
index 0000000..0ce7e6f
--- /dev/null
+++ b/09-september/resources/textures/particleStar.png
Binary files differ
diff --git a/09-september/resources/textures/right.png b/09-september/resources/textures/right.png
new file mode 100644
index 0000000..89fbb5f
--- /dev/null
+++ b/09-september/resources/textures/right.png
Binary files differ
diff --git a/09-september/resources/textures/smoke.png b/09-september/resources/textures/smoke.png
new file mode 100755
index 0000000..eef2e19
--- /dev/null
+++ b/09-september/resources/textures/smoke.png
Binary files differ
diff --git a/09-september/resources/textures/soil1.png b/09-september/resources/textures/soil1.png
new file mode 100644
index 0000000..227e96c
--- /dev/null
+++ b/09-september/resources/textures/soil1.png
Binary files differ
diff --git a/09-september/resources/textures/soil2.png b/09-september/resources/textures/soil2.png
new file mode 100644
index 0000000..5fc40e2
--- /dev/null
+++ b/09-september/resources/textures/soil2.png
Binary files differ
diff --git a/09-september/resources/textures/soil3.png b/09-september/resources/textures/soil3.png
new file mode 100644
index 0000000..2c1c431
--- /dev/null
+++ b/09-september/resources/textures/soil3.png
Binary files differ
diff --git a/09-september/resources/textures/soil4.png b/09-september/resources/textures/soil4.png
new file mode 100644
index 0000000..8d3a4d3
--- /dev/null
+++ b/09-september/resources/textures/soil4.png
Binary files differ
diff --git a/09-september/resources/textures/stall.png b/09-september/resources/textures/stall.png
new file mode 100644
index 0000000..d4d6f6e
--- /dev/null
+++ b/09-september/resources/textures/stall.png
Binary files differ
diff --git a/09-september/resources/textures/top.png b/09-september/resources/textures/top.png
new file mode 100644
index 0000000..f92e8f7
--- /dev/null
+++ b/09-september/resources/textures/top.png
Binary files differ
diff --git a/09-september/tomcat/gui/widget.c b/09-september/tomcat/gui/widget.c
new file mode 100644
index 0000000..507173a
--- /dev/null
+++ b/09-september/tomcat/gui/widget.c
@@ -0,0 +1,12 @@
+#include "widget.h"
+#include <stdlib.h>
+
+widget_t *Widget_CreateImage(Texture *texture, int x, int y, int w, int h)
+{
+ return NULL;
+}
+
+void Widget_Destroy(widget_t *widget)
+{
+ free(widget);
+}
diff --git a/09-september/tomcat/gui/widget.h b/09-september/tomcat/gui/widget.h
new file mode 100644
index 0000000..1b1c62d
--- /dev/null
+++ b/09-september/tomcat/gui/widget.h
@@ -0,0 +1,13 @@
+#ifndef WIDGET_H
+#define WIDGET_H
+
+#include "GL/glew.h"
+#include "../renderer/renderer_types.h"
+
+typedef struct
+{
+ int x, y, w, h;
+ Texture *texture;
+} widget_t;
+
+#endif // WIDGET_H
diff --git a/09-september/tomcat/input.c b/09-september/tomcat/input.c
new file mode 100644
index 0000000..8384ceb
--- /dev/null
+++ b/09-september/tomcat/input.c
@@ -0,0 +1,21 @@
+#include "input.h"
+
+static bool key_buffer[MAX_KEY_BUFFER_SIZE] = { false };
+
+void Input_PressKey(unsigned int key)
+{
+ if(key > 256 || key < 0) return;
+ key_buffer[key] = true;
+}
+
+void Input_ReleaseKey(unsigned int key)
+{
+ if(key > 256 || key < 0) return;
+ key_buffer[key] = false;
+}
+
+bool Input_isKeyPressed(unsigned int key)
+{
+ if(key > 256 || key < 0) return false;
+ return key_buffer[key];
+}
diff --git a/09-september/tomcat/input.h b/09-september/tomcat/input.h
new file mode 100644
index 0000000..92876ca
--- /dev/null
+++ b/09-september/tomcat/input.h
@@ -0,0 +1,11 @@
+#ifndef INPUT_H
+#define INPUT_H
+
+#include <stdbool.h>
+#define MAX_KEY_BUFFER_SIZE 256
+
+void Input_PressKey(unsigned int key);
+void Input_ReleaseKey(unsigned int key);
+bool Input_isKeyPressed(unsigned int key);
+
+#endif // INPUT_H
diff --git a/09-september/tomcat/math/math_util.c b/09-september/tomcat/math/math_util.c
new file mode 100644
index 0000000..1285f3d
--- /dev/null
+++ b/09-september/tomcat/math/math_util.c
@@ -0,0 +1,10 @@
+#include "math_util.h"
+
+float baryCentric(Vec3 *p1, Vec3 *p2, Vec3 *p3, Vec2 *pos)
+{
+ float det = (p2->z - p3->z) * (p1->x - p3->x) + (p3->x - p2->x) * (p1->z - p3->z);
+ float l1 = ((p2->z - p3->z) * (pos->x - p3->x) + (p3->x - p2->x) * (pos->y - p3->z)) / det;
+ float l2 = ((p3->z - p1->z) * (pos->x - p3->x) + (p1->x - p3->x) * (pos->y - p3->z)) / det;
+ float l3 = 1.0f - l1 - l2;
+ return l1 * p1->y + l2 * p2->y + l3 * p3->y;
+}
diff --git a/09-september/tomcat/math/math_util.h b/09-september/tomcat/math/math_util.h
new file mode 100644
index 0000000..5582dc7
--- /dev/null
+++ b/09-september/tomcat/math/math_util.h
@@ -0,0 +1,8 @@
+#ifndef MATH_UTIL_H
+#define MATH_UTIL_H
+
+#include "vector.h"
+
+extern float baryCentric(Vec3 *p1, Vec3 *p2, Vec3 *p3, Vec2 *pos);
+
+#endif // MATH_UTIL_H
diff --git a/09-september/tomcat/math/matrix4x4.c b/09-september/tomcat/math/matrix4x4.c
new file mode 100644
index 0000000..d4bea71
--- /dev/null
+++ b/09-september/tomcat/math/matrix4x4.c
@@ -0,0 +1,326 @@
+#include "matrix4x4.h"
+#include "../util/util.h"
+#include <SDL2/SDL.h>
+
+void mat4_identity(Mat4 *a)
+{
+ int i;
+ for(i = 0; i < 4*4; i++)
+ {
+ a->data[i] = 0.0f;
+ }
+ a->data[0 + 0 * 4] = 1.0f;
+ a->data[1 + 1 * 4] = 1.0f;
+ a->data[2 + 2 * 4] = 1.0f;
+ a->data[3 + 3 * 4] = 1.0f;
+}
+
+/** TODO: Preprocess these operation (1 + 1 * 4) -> 5 **/
+Mat4 mat4_inverse(const Mat4 *a)
+{
+ Mat4 inv;
+ int i;
+
+ /** Remember that inverted matrix is (1/det) * cofactor(transposed) **/
+ inv.data[0 + 0 * 4] = (a->data[1 + 1 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 1 * 4] * a->data[3 + 2 * 4] * a->data[1 + 3 * 4] +
+ a->data[3 + 1 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 1 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[1 + 1 * 4] -
+ a->data[3 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 1 * 4]);
+
+ inv.data[0 + 1 * 4] = -(a->data[0 + 1 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 1 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 1 * 4] * a->data[0 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 1 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 1 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[2 + 1 * 4]);
+
+ inv.data[0 + 2 * 4] = (a->data[0 + 1 * 4] * a->data[1 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[1 + 1 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 1 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[3 + 1 * 4] -
+ a->data[1 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 1 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 1 * 4]);
+
+ inv.data[0 + 3 * 4] = -(a->data[0 + 1 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] +
+ a->data[1 + 1 * 4] * a->data[2 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[2 + 1 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 1 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[0 + 1 * 4] -
+ a->data[2 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 1 * 4]);
+
+ inv.data[1 + 0 * 4] = -(a->data[1 + 0 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 2 * 4] * a->data[1 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[1 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[1 + 1 * 4] = (a->data[0 + 0 * 4] * a->data[2 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 2 * 4] * a->data[2 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[2 + 2 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 2 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[1 + 2 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 2 * 4] * a->data[3 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[3 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[3 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[3 + 2 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 + 4] * a->data[0 + 2 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[1 + 3 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 2 * 4] * a->data[2 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[2 + 2 * 4] * a->data[0 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[0 + 2 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 2 * 4] * a->data[2 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 2 * 4] * a->data[0 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[0 + 2 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[2 + 0 * 4] = (a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[1 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 3 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 1 * 4] * a->data[1 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[2 + 1 * 4] = -(a->data[0 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[2 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[2 + 2 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[3 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 3 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 3 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[2 + 3 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 3 * 4] +
+ a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[0 + 3 * 4] +
+ a->data[2 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 3 * 4] -
+ a->data[0 + 3 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4] -
+ a->data[1 + 3 * 4] * a->data[2 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[2 + 3 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[3 + 0 * 4] = -(a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 2 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[1 + 2 * 4] +
+ a->data[3 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 2 * 4] -
+ a->data[1 + 2 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 2 * 4] * a->data[3 + 1 * 4] * a->data[1 + 0 * 4] -
+ a->data[3 + 2 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[3 + 1 * 4] = (a->data[0 + 0 * 4] * a->data[2 + 1 * 4] * a->data[3 + 2 * 4] +
+ a->data[2 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 2 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[2 + 2 * 4] -
+ a->data[0 + 2 * 4] * a->data[2 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[2 + 2 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 2 * 4] * a->data[0 + 1 * 4] * a->data[2 + 0 * 4]);
+
+ inv.data[3 + 2 * 4] = -(a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[3 + 2 * 4] +
+ a->data[1 + 0 * 4] * a->data[3 + 1 * 4] * a->data[0 + 2 * 4] +
+ a->data[3 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 2 * 4] -
+ a->data[0 + 2 * 4] * a->data[1 + 1 * 4] * a->data[3 + 0 * 4] -
+ a->data[1 + 2 * 4] * a->data[3 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[3 + 2 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ inv.data[3 + 3 * 4] = (a->data[0 + 0 * 4] * a->data[1 + 1 * 4] * a->data[2 + 2 * 4] +
+ a->data[1 + 0 * 4] * a->data[2 + 1 * 4] * a->data[0 + 2 * 4] +
+ a->data[2 + 0 * 4] * a->data[0 + 1 * 4] * a->data[1 + 2 * 4] -
+ a->data[0 + 2 * 4] * a->data[1 + 1 * 4] * a->data[2 + 0 * 4] -
+ a->data[1 + 2 * 4] * a->data[2 + 1 * 4] * a->data[0 + 0 * 4] -
+ a->data[2 + 2 * 4] * a->data[0 + 1 * 4] * a->data[1 + 0 * 4]);
+
+ /** Remember that our matrix is already transposed and we also got the minors(inside each "inv" entry),
+ so we just use them. We use a->data[0 + 1 * 4] * inv.data[1 + 0 * 4] becouse inv.data is transposed **/
+ float det = a->data[0 + 0 * 4] * inv.data[0 + 0 * 4] + a->data[0 + 1 * 4] * inv.data[1 + 0 * 4] +
+ a->data[0 + 2 * 4] * inv.data[2 + 0 * 4] + a->data[0 + 3 * 4] * inv.data[3 + 0 * 4];
+
+ if(det == 0.0f)
+ return *a;
+
+ det = 1.0f / det;
+
+ for(i = 0; i < 16; i++)
+ inv.data[i] *= det;
+
+ return inv;
+}
+
+Mat4 mat4_mul(const Mat4 *a, const Mat4 *b)
+{
+ int i, j, k;
+ GLfloat sum = 0.0f;
+ Mat4 c;
+ mat4_identity(&c);
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 4; j++){
+ for(k = 0; k < 4; k++){
+ sum += a->data[i + k * 4] * b->data[k + j * 4];
+ }
+ c.data[i + j * 4] = sum;
+ sum = 0.0f;
+ }
+
+ return c;
+}
+
+Mat4 mat4_translate(const Vec3 *a)
+{
+ Mat4 b;
+ mat4_identity(&b);
+ b.data[0 + 3 * 4] = a->x;
+ b.data[1 + 3 * 4] = a->y;
+ b.data[2 + 3 * 4] = a->z;
+ return b;
+}
+
+Mat4 mat4_scale(GLfloat x, GLfloat y, GLfloat z)
+{
+ Mat4 b;
+ mat4_identity(&b);
+ b.data[0 + 0 * 4] = x;
+ b.data[1 + 1 * 4] = y;
+ b.data[2 + 2 * 4] = z;
+ return b;
+}
+
+Mat4 mat4_rotate(GLfloat degrees, const Vec3 *a)
+{
+ Mat4 b;
+ mat4_identity(&b);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees)), o = 1-c;
+ b.data[0 + 0 * 4] = a->x * a->x * o + c;
+ b.data[0 + 1 * 4] = a->x * a->y * o - a->z * s;
+ b.data[0 + 2 * 4] = a->x * a->z * o + a->y * s;
+
+ b.data[1 + 0 * 4] = a->x * a->y * o + a->z * s;
+ b.data[1 + 1 * 4] = a->y * a->y * o + c;
+ b.data[1 + 2 * 4] = a->y * a->z * o - a->x * s;
+
+ b.data[2 + 0 * 4] = a->x * a->z * o - a->y * s;
+ b.data[2 + 1 * 4] = a->y * a->z * o + a->x * s;
+ b.data[2 + 2 * 4] = a->z * a->z * o + c;
+ return b;
+}
+
+Mat4 mat4_rotate_x(GLfloat degrees)
+{
+ Mat4 a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[1 + 1 * 4] = c;
+ a.data[2 + 1 * 4] = s;
+ a.data[1 + 2 * 4] = -s;
+ a.data[2 + 2 * 4] = c;
+ return a;
+}
+
+Mat4 mat4_rotate_y(GLfloat degrees)
+{
+ Mat4 a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[0 + 0 * 4] = c;
+ a.data[2 + 0 * 4] = -s;
+ a.data[0 + 2 * 4] = s;
+ a.data[2 + 2 * 4] = c;
+ return a;
+}
+
+Mat4 mat4_rotate_z(GLfloat degrees)
+{
+ Mat4 a;
+ mat4_identity(&a);
+ GLfloat c = SDL_cosf(toRadians(degrees)), s = SDL_sinf(toRadians(degrees));
+ a.data[0 + 0 * 4] = c;
+ a.data[1 + 0 * 4] = s;
+ a.data[0 + 1 * 4] = -s;
+ a.data[1 + 1 * 4] = c;
+ return a;
+}
+
+Mat4 mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar)
+{
+ Mat4 a;
+ GLubyte i, j;
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 4; j++)
+ a.data[i + j * 4] = 0.0f;
+ fov = toRadians(fov); // To radians
+
+ a.data[0 + 0 * 4] = ( (1.0f / SDL_tanf( fov/2.0f )) / aspect);
+ a.data[1 + 1 * 4] = (1.0f / SDL_tanf( fov/2.0f ));
+ a.data[2 + 2 * 4] = -( (zFar + zNear) / (zFar - zNear) );
+ a.data[2 + 3 * 4] = -( ( 2.0f * zFar * zNear) / (zFar - zNear) );
+ a.data[3 + 2 * 4] = -1.0f;
+
+ return a;
+}
+
+Mat4
+mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat near, GLfloat far)
+{
+ Mat4 a;
+ mat4_identity(&a);
+ a.data[0 + 0 * 4] = 2.0f / (right - left);
+ a.data[1 + 1 * 4] = 2.0f / (top - bottom);
+ a.data[2 + 2 * 4] = 2.0f / (near - far);
+
+ a.data[0 + 3 * 4] = (left + right) / (left - right);
+ a.data[1 + 3 * 4] = (bottom + top) / (bottom - top);
+ a.data[2 + 3 * 4] = (far + near) / (far - near);
+
+ return a;
+}
+
+Mat4 mat4_lookAt(Vec3 *eye, Vec3 *center, Vec3 *up)
+{
+ Vec3 temp = vec3_sub(center, eye);
+
+ Vec3 f = vec3_normalize(&temp);
+ Vec3 u = vec3_normalize(up);
+ temp = vec3_cross_mul(&f, &u);
+ Vec3 s = vec3_normalize(&temp);
+ u = vec3_cross_mul(&s, &f);
+
+ Mat4 a;
+ mat4_identity(&a);
+
+ a.data[0 + 0 * 4] = s.x;
+ a.data[0 + 1 * 4] = s.y;
+ a.data[0 + 2 * 4] = s.z;
+ a.data[1 + 0 * 4] = u.x;
+ a.data[1 + 1 * 4] = u.y;
+ a.data[1 + 2 * 4] = u.z;
+ a.data[2 + 0 * 4] =-f.x;
+ a.data[2 + 1 * 4] =-f.y;
+ a.data[2 + 2 * 4] =-f.z;
+ a.data[0 + 3 * 4] =-vec3_dot_mul(&s, eye);
+ a.data[1 + 3 * 4] =-vec3_dot_mul(&u, eye);
+ a.data[2 + 3 * 4] = vec3_dot_mul(&f, eye);
+
+ return a;
+}
+
+Vec3 mat4_mul_vec3(const Mat4 *a, const Vec3 *b)
+{
+ Vec3 c;
+ c.x = a->data[0 + 0 * 4] * b->x + a->data[0 + 1 * 4] * b->y + a->data[0 + 2 * 4] * b->z + a->data[0 + 3 * 4];
+ c.y = a->data[1 + 0 * 4] * b->x + a->data[1 + 1 * 4] * b->y + a->data[1 + 2 * 4] * b->z + a->data[1 + 3 * 4];
+ c.z = a->data[2 + 0 * 4] * b->x + a->data[2 + 1 * 4] * b->y + a->data[2 + 2 * 4] * b->z + a->data[2 + 3 * 4];
+ return c;
+}
+
+Vec4 mat4_mul_vec4(const Mat4 *a, const Vec4 *b)
+{
+ Vec4 c;
+ c.x = a->data[0 + 0 * 4] * b->x + a->data[0 + 1 * 4] * b->y + a->data[0 + 2 * 4] * b->z + a->data[0 + 3 * 4] * b->w;
+ c.y = a->data[1 + 0 * 4] * b->x + a->data[1 + 1 * 4] * b->y + a->data[1 + 2 * 4] * b->z + a->data[1 + 3 * 4] * b->w;
+ c.z = a->data[2 + 0 * 4] * b->x + a->data[2 + 1 * 4] * b->y + a->data[2 + 2 * 4] * b->z + a->data[2 + 3 * 4] * b->w;
+ c.w = a->data[3 + 0 * 4] * b->x + a->data[3 + 1 * 4] * b->y + a->data[3 + 2 * 4] * b->z + a->data[3 + 3 * 4] * b->w;
+ return c;
+}
diff --git a/09-september/tomcat/math/matrix4x4.h b/09-september/tomcat/math/matrix4x4.h
new file mode 100644
index 0000000..74918fe
--- /dev/null
+++ b/09-september/tomcat/math/matrix4x4.h
@@ -0,0 +1,39 @@
+#ifndef MATRIX4X4_H
+#define MATRIX4X4_H
+
+#include <GL/glew.h>
+#include "vector.h"
+
+/* accesing data: row + column * width */
+typedef struct
+{
+ GLfloat data[16];
+} Mat4;
+
+extern void mat4_identity(Mat4 *a);
+extern Mat4 mat4_inverse(const Mat4 *a);
+extern Mat4 mat4_mul(const Mat4 *a, const Mat4 *b);
+
+extern Mat4 mat4_translate(const Vec3 *a);
+extern Mat4 mat4_scale(GLfloat x, GLfloat y, GLfloat z);
+extern Mat4 mat4_rotate_x(GLfloat degrees);
+extern Mat4 mat4_rotate_y(GLfloat degrees);
+extern Mat4 mat4_rotate_z(GLfloat degrees);
+extern Mat4 mat4_rotate(GLfloat degrees, const Vec3 *a);
+
+extern Mat4
+mat4_perspective(GLfloat fov, GLfloat aspect, GLfloat zNear, GLfloat zFar);
+
+extern Mat4
+mat4_orthographic(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat near, GLfloat far);
+
+extern Mat4
+mat4_lookAt(Vec3 *eye, Vec3 *center, Vec3 *up);
+
+extern Vec3
+mat4_mul_vec3(const Mat4 *a, const Vec3 *b);
+
+extern Vec4
+mat4_mul_vec4(const Mat4 *a, const Vec4 *b);
+
+#endif // MATRIX4X4_H
diff --git a/09-september/tomcat/math/vector.c b/09-september/tomcat/math/vector.c
new file mode 100644
index 0000000..230de51
--- /dev/null
+++ b/09-september/tomcat/math/vector.c
@@ -0,0 +1,177 @@
+#include "vector.h"
+#include <SDL2/SDL.h>
+
+Vec4 vec4_add(const Vec4 *a, const Vec4 *b)
+{
+ Vec4 c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ c.z = a->z + b->z;
+ c.w = a->w + b->w;
+ return c;
+}
+
+Vec4 vec4_sub(const Vec4 *a, const Vec4 *b)
+{
+ Vec4 c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ c.z = a->z - b->z;
+ c.w = a->w - b->w;
+ return c;
+}
+
+Vec4 vec4_scalar_mul(const Vec4 *a, GLfloat scalar)
+{
+ Vec4 c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ c.z = a->z * scalar;
+ c.w = a->w * scalar;
+ return c;
+}
+
+GLfloat vec4_dot_mul(const Vec4 *a, const Vec4 *b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) + (a->w * b->w) );
+}
+
+GLfloat vec4_length(Vec4 *a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f) + SDL_pow(a->w, 2.0f) );
+}
+
+GLfloat vec4_length2(Vec4 *a)
+{
+ return ( SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f) + SDL_pow(a->w, 2.0f) );
+}
+
+Vec4 vec4_normalize(Vec4 *a)
+{
+ Vec4 b;
+ GLfloat length = vec4_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ b.z = a->z / length;
+ b.w = a->w / length;
+ return b;
+}
+
+Vec3 vec3_add(const Vec3 *a, const Vec3 *b)
+{
+ Vec3 c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ c.z = a->z + b->z;
+ return c;
+}
+
+Vec3 vec3_sub(const Vec3 *a, const Vec3 *b)
+{
+ Vec3 c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ c.z = a->z - b->z;
+ return c;
+}
+
+Vec3 vec3_scalar_mul(const Vec3 *a, GLfloat scalar)
+{
+ Vec3 c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ c.z = a->z * scalar;
+ return c;
+}
+
+GLfloat vec3_dot_mul(const Vec3 *a, const Vec3 *b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) + (a->z * b->z) );
+}
+
+
+Vec3 vec3_cross_mul(const Vec3 *a, const Vec3 *b)
+{
+ Vec3 c;
+ c.x = (a->y * b->z) - (a->z * b->y);
+ c.y = (a->z * b->x) - (a->x * b->z);
+ c.z = (a->x * b->y) - (a->y * b->x);
+ return c;
+}
+
+GLfloat vec3_length(Vec3 *a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f));
+}
+
+GLfloat vec3_length2(Vec3 *a)
+{
+ return ( SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) + SDL_pow(a->z, 2.0f) );
+}
+
+Vec3 vec3_normalize(Vec3 *a)
+{
+ Vec3 b;
+ GLfloat length = vec3_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ b.z = a->z / length;
+ return b;
+}
+
+Vec2 vec2_add(const Vec2 *a, const Vec2 *b)
+{
+ Vec2 c;
+ c.x = a->x + b->x;
+ c.y = a->y + b->y;
+ return c;
+}
+
+Vec2 vec2_sub(const Vec2 *a, const Vec2 *b)
+{
+ Vec2 c;
+ c.x = a->x - b->x;
+ c.y = a->y - b->y;
+ return c;
+}
+
+Vec2 vec2_scalar_mul(const Vec2 *a, GLfloat scalar)
+{
+ Vec2 c;
+ c.x = a->x * scalar;
+ c.y = a->y * scalar;
+ return c;
+}
+
+GLfloat vec2_dot_mul(const Vec2 *a, const Vec2 *b)
+{
+ return ( (a->x * b->x) + (a->y * b->y) );
+}
+
+
+Vec2 vec2_cross_mul(const Vec2 *a, const Vec2 *b)
+{
+ Vec2 c;
+ c.x = (a->x * b->y) - (a->y * b->x);
+ c.y = (a->y * b->x) - (a->x * b->y);
+ return c;
+}
+
+GLfloat vec2_length(Vec2 *a)
+{
+ return SDL_sqrtf(SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) );
+}
+
+GLfloat vec2_length2(Vec2 *a)
+{
+ return ( SDL_pow(a->x, 2.0f) + SDL_pow(a->y, 2.0f) );
+}
+
+Vec2 vec2_normalize(Vec2 *a)
+{
+ Vec2 b;
+ GLfloat length = vec2_length(a);
+ b.x = a->x / length;
+ b.y = a->y / length;
+ return b;
+}
diff --git a/09-september/tomcat/math/vector.h b/09-september/tomcat/math/vector.h
new file mode 100644
index 0000000..173fc11
--- /dev/null
+++ b/09-september/tomcat/math/vector.h
@@ -0,0 +1,47 @@
+#ifndef VECTOR4F_H
+#define VECTOR4F_H
+
+#include <GL/glew.h>
+
+typedef struct _Vec4
+{
+ GLfloat x, y, z, w;
+} Vec4;
+
+extern Vec4 vec4_add(const Vec4 *a, const Vec4 *b);
+extern Vec4 vec4_sub(const Vec4 *a, const Vec4 *b);
+extern Vec4 vec4_scalar_mul(const Vec4 *a, GLfloat scalar);
+extern GLfloat vec4_dot_mul(const Vec4 *a, const Vec4 *b);
+extern GLfloat vec4_length(Vec4 *a);
+extern GLfloat vec4_length2(Vec4 *a);
+extern Vec4 vec4_normalize(Vec4 *a);
+
+typedef struct _Vec3
+{
+ GLfloat x, y, z;
+} Vec3;
+
+extern Vec3 vec3_add(const Vec3 *a, const Vec3 *b);
+extern Vec3 vec3_sub(const Vec3 *a, const Vec3 *b);
+extern Vec3 vec3_scalar_mul(const Vec3 *a, GLfloat scalar);
+extern GLfloat vec3_dot_mul(const Vec3 *a, const Vec3 *b);
+extern Vec3 vec3_cross_mul(const Vec3 *a, const Vec3 *b);
+extern GLfloat vec3_length(Vec3 *a);
+extern GLfloat vec3_length2(Vec3 *a);
+extern Vec3 vec3_normalize(Vec3 *a);
+
+typedef struct _Vec2
+{
+ GLfloat x, y;
+} Vec2;
+
+extern Vec2 vec2_add(const Vec2 *a, const Vec2 *b);
+extern Vec2 vec2_sub(const Vec2 *a, const Vec2 *b);
+extern Vec2 vec2_scalar_mul(const Vec2 *a, GLfloat scalar);
+extern GLfloat vec2_dot_mul(const Vec2 *a, const Vec2 *b);
+extern Vec2 vec2_cross_mul(const Vec2 *a, const Vec2 *b);
+extern GLfloat vec2_length(Vec2 *a);
+extern GLfloat vec2_length2(Vec2 *a);
+extern Vec2 vec2_normalize(Vec2 *a);
+
+#endif // VECTOR4F_H
diff --git a/09-september/tomcat/not_in_use/fbo.c b/09-september/tomcat/not_in_use/fbo.c
new file mode 100644
index 0000000..5880276
--- /dev/null
+++ b/09-september/tomcat/not_in_use/fbo.c
@@ -0,0 +1,108 @@
+#include "fbo.h"
+#include "renderer.h"
+#include "../util/util.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+Fbo *fbo_new(const char *name, GLint width, GLint height)
+{
+ Fbo *fbo;
+
+ if(strlen(name) >= MAX_PATH_LENGTH)
+ Util_FatalError("Fbo name is too long: %s\n", name);
+
+ if(render.num_fbos >= MAX_FBOS)
+ return NULL;
+
+ fbo = malloc(sizeof(Fbo));
+ memset(fbo, 0, sizeof(Fbo));
+
+ glGenFramebuffers(1, &fbo->frame_buffer);
+
+ return fbo;
+}
+
+void fbo_attach_buffer(Fbo *fbo, GLenum format, int index)
+{
+ GLenum attachment;
+ GLuint *buffer;
+
+ switch(format)
+ {
+ case GL_RGB:
+ case GL_RGBA:
+ fbo->color_format = format;
+ buffer = &fbo->color_buffer[index];
+ attachment = GL_COLOR_ATTACHMENT0 + index;
+ break;
+
+ case GL_DEPTH_COMPONENT:
+ fbo->depth_format = format;
+ buffer = &fbo->depth_buffer;
+ attachment = GL_DEPTH_ATTACHMENT;
+ break;
+
+ default:
+ Util_FatalError("Invalid fbo buffer format\n");
+ }
+
+ if(*buffer == 0)
+ {
+ glGenRenderbuffers(1, buffer);
+ glBindRenderbuffer(GL_RENDERBUFFER, *buffer);
+ glRenderbufferStorage(GL_RENDERBUFFER, format, fbo->width, fbo->height);
+
+ fbo_bind(fbo);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, *buffer);
+ fbo_bind(NULL);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ }
+}
+
+void fbo_attach_texture(Fbo *fbo, Texture *t, GLenum attachment)
+{
+ int index;
+
+ fbo_bind(fbo);
+ if(attachment >= GL_COLOR_ATTACHMENT0 && attachment < GL_COLOR_ATTACHMENT0 + 8)
+ {
+ glFramebufferTexture(GL_FRAMEBUFFER, attachment, t->tex_id, 0);
+ glDrawBuffers(1, &attachment);
+
+ index = attachment - GL_COLOR_ATTACHMENT0;
+ fbo->color_textures[index] = t;
+ }
+
+ fbo_bind(NULL);
+}
+
+void fbo_bind(Fbo *fbo)
+{
+ if(fbo)
+ {
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo->frame_buffer);
+ glViewport(0, 0, fbo->width, fbo->height);
+ }
+ else
+ {
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glViewport(0, 0, render.window->Width, render.window->Height);
+ }
+}
+
+void fbo_purge(Fbo *fbo)
+{
+ int i;
+
+ for(i = 0; i < 8; i++)
+ if(fbo->color_buffer[i])
+ {
+ glDeleteRenderbuffers(1, &fbo->color_buffer[i]);
+ }
+ if(fbo->depth_buffer)
+ glDeleteRenderbuffers(1, &fbo->depth_buffer);
+
+ if(fbo->frame_buffer)
+ glDeleteFramebuffers(1, &fbo->frame_buffer);
+}
diff --git a/09-september/tomcat/not_in_use/fbo.h b/09-september/tomcat/not_in_use/fbo.h
new file mode 100644
index 0000000..244cb7f
--- /dev/null
+++ b/09-september/tomcat/not_in_use/fbo.h
@@ -0,0 +1,35 @@
+#ifndef FBO_H
+#define FBO_H
+
+#include "../shared.h"
+
+struct _Texture;
+
+typedef struct _Fbo
+{
+ char _name[MAX_PATH_LENGTH];
+
+ GLuint frame_buffer; /** Actual fbo object**/
+
+ /** color_texture when you want to render to a
+ texture and color_buffer when you want to render
+ to a RenderBuffer **/
+ struct _Texture *color_textures[8];
+ GLuint color_buffer[8];
+ GLenum color_format;
+
+ struct _Texture *depth_texture;
+ GLuint depth_buffer;
+ GLenum depth_format;
+
+ GLint width;
+ GLint height;
+} Fbo;
+
+extern Fbo *fbo_new(const char *name, GLint width, GLint height);
+extern void fbo_attach_buffer(Fbo *fbo, GLenum format, int index);
+extern void fbo_attach_texture(Fbo *fbo, struct _Texture *t, GLenum attachment);
+extern void fbo_bind(Fbo *fbo);
+extern void fbo_purge(Fbo *fbo);
+
+#endif // FBO_H
diff --git a/09-september/tomcat/particles/particles.c b/09-september/tomcat/particles/particles.c
new file mode 100644
index 0000000..5e99e06
--- /dev/null
+++ b/09-september/tomcat/particles/particles.c
@@ -0,0 +1,153 @@
+#include "particles.h"
+#include "../util/util_time.h"
+#include "../util/util.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+ParticleManager particles;
+
+static int compare_particles(const void *_a, const void *_b);
+
+void Particles_Init()
+{
+ memset( &particles, 0, sizeof(ParticleManager) );
+}
+
+ParticleSystem *Particles_AddSystem()
+{
+ if(particles.num_systems >= MAX_PARTICLES_SYSTEMS)
+ return NULL;
+
+ ParticleSystem *s = malloc( sizeof(ParticleSystem) );
+ particles.systems[particles.num_systems] = s;
+ memset( s, 0, sizeof(ParticleSystem) );
+
+ particles.num_systems += 1;
+
+ return s;
+}
+
+void Particles_RemoveSystem(ParticleSystem *system)
+{
+ int index = &system - particles.systems;
+
+ if(index > MAX_PARTICLES_SYSTEMS || index < 0)
+ {
+ fprintf(stderr, "Invalid particle system!\n");
+ return;
+ }
+ /* TODO: Finish this function */
+}
+
+void Particles_EmitParticle(ParticleSystem *system, Particle *p)
+{
+ if(system->num_particles >= MAX_PARTICLES_PER_SYSTEM)
+ return;
+
+ Particle *dest = &system->particles[system->num_particles];
+ memcpy(dest, p, sizeof(Particle));
+
+ system->num_particles += 1;
+}
+
+void Particles_Update(const Vec3 *camera_position)
+{
+ Particle *c = NULL; /* Current particle */
+ ParticleSystem *s = NULL; /* Current particle system */
+ Texture *t = NULL; /* Texture of the current system */
+ Vec3 d; /* Vector for calculating the distance to the camera */
+ Vec3 velocity;
+
+ int i, j;
+ for(i = 0; i < particles.num_systems; i++)
+ {
+ s = particles.systems[i];
+ t = s->texture;
+
+ /* We ceil it so we dont truncate the decimal part and get always 0 */
+ int particles_to_emit = (int)ceil( s->emit_rate * Time_GetFrameTime() );
+
+ /* Emit the automatically emited particles */
+ for(j = 0; j < particles_to_emit; j++)
+ {
+ velocity.x = Util_RandomF(0.0f, 50.0f);
+ velocity.y = Util_RandomF(0.0f, 50.0f);
+ velocity.z = Util_RandomF(0.0f, 50.0f);
+ velocity = vec3_normalize(&velocity);
+
+ if(s->num_particles >= MAX_PARTICLES_PER_SYSTEM)
+ break; /* So we dont overflow */
+
+ c = &s->particles[s->num_particles ++];
+ memset(c, 0, sizeof(Particle));
+
+ c->life_length = s->life_length;
+ c->position = s->position;
+ c->scale = 10.0f;
+ c->weight = s->weight;
+ c->velocity = vec3_scalar_mul(&velocity, s->speed);
+ }
+
+ for(j = 0; j < s->num_particles; j++)
+ {
+ c = &s->particles[j];
+
+ /* Update each particle -.- */
+ c->velocity.y += c->weight * Time_GetFrameTime();
+ Vec3 velocity = vec3_scalar_mul(&c->velocity, Time_GetFrameTime());
+ c->position = vec3_add(&c->position, &velocity);
+
+ /* Update animations
+ * How far into its life the particle is */
+ float life_factor = c->elapsed_time / c->life_length;
+ /* How many different stages there are */
+ int stage_count = t->number_of_rows * t->number_of_rows;
+ float atlas_progression = life_factor * stage_count;
+ int index = floor(atlas_progression);
+
+ int column = index % t->number_of_rows;
+ int row = index / t->number_of_rows;
+ c->tex_offset.x = (float)column / t->number_of_rows;
+ c->tex_offset.y = (float)row / t->number_of_rows;
+ /* End of animation update */
+
+ c->elapsed_time += Time_GetFrameTime();
+
+ if(c->elapsed_time > c->life_length)
+ {
+ /* "Kill" the particle by overriding it with the last particle on the array */
+ memmove( c, &s->particles[s->num_particles], sizeof(Particle) );
+ s->num_particles -= 1;
+ }
+ else
+ {
+ d = vec3_sub(camera_position, &c->position);
+ c->distance_to_camera = vec3_length2(&d);
+ }
+ }
+ /*Sort all particles on system by distance to camera */
+ qsort(s->particles, s->num_particles, sizeof(Particle), compare_particles);
+ }
+}
+
+void Particles_Shutdown()
+{
+ int i;
+ for(i = 0; i < particles.num_systems; i++)
+ {
+ if(particles.systems[i])
+ free(particles.systems[i]);
+ }
+ memset(&particles, 0, sizeof(ParticleManager));
+}
+
+static int compare_particles(const void *_a, const void *_b)
+{
+ Particle *a = (Particle *)_a;
+ Particle *b = (Particle *)_b;
+
+ if(a->distance_to_camera < b->distance_to_camera) return -1;
+ if(a->distance_to_camera > b->distance_to_camera) return 1;
+ return 0;
+}
diff --git a/09-september/tomcat/particles/particles.h b/09-september/tomcat/particles/particles.h
new file mode 100644
index 0000000..8404ff4
--- /dev/null
+++ b/09-september/tomcat/particles/particles.h
@@ -0,0 +1,62 @@
+#ifndef PARTICLES_H
+#define PARTICLES_H
+
+#include "../renderer/renderer_types.h"
+#include "../math/vector.h"
+
+#define MAX_PARTICLES_PER_SYSTEM 10000
+#define MAX_PARTICLES_SYSTEMS 10
+
+typedef struct _Particle
+{
+ Vec3 position;
+ Vec3 velocity;
+
+ Vec2 tex_offset; /* Used for animating */
+
+ GLfloat weight; /* How does the gravity affect the particle (In theory it should be a vector)*/
+ GLfloat life_length;
+ GLfloat rotation;
+ GLfloat scale;
+ GLfloat distance_to_camera; /* Used for sorting the systems */
+
+ GLfloat elapsed_time;
+} Particle;
+
+typedef struct _ParticleSystem
+{
+ Vec3 position;
+
+ GLint emit_rate;
+ GLfloat speed;
+ GLfloat weight;
+ GLfloat life_length;
+
+ bool additive; /* Additive vs alpha blending */
+
+ Texture *texture;
+ Particle particles[MAX_PARTICLES_PER_SYSTEM];
+ int num_particles;
+
+} ParticleSystem;
+
+typedef struct
+{
+ ParticleSystem *systems[MAX_PARTICLES_SYSTEMS];
+ int num_systems;
+} ParticleManager;
+
+extern ParticleManager particles;
+
+extern void Particles_Init();
+
+extern ParticleSystem *Particles_AddSystem();
+extern void Particles_RemoveSystem(ParticleSystem *system);
+/* Used for manual emission */
+extern void Particles_EmitParticle(ParticleSystem *system, Particle *p);
+/* Removes a particle if it "dies" */
+extern void Particles_Update(const Vec3 *camera_position);
+/* We need to delete all dynamically allocated particles that still remains */
+extern void Particles_Shutdown();
+
+#endif // PARTICLES_H
diff --git a/09-september/tomcat/renderer/camera.c b/09-september/tomcat/renderer/camera.c
new file mode 100644
index 0000000..8a0c620
--- /dev/null
+++ b/09-september/tomcat/renderer/camera.c
@@ -0,0 +1,95 @@
+#include "camera.h"
+
+#include "../util/util_time.h"
+
+static const float movementSpeed = 40.0f;
+
+Camera *camera_new()
+{
+ Camera *camera;
+ camera = malloc( sizeof(Camera) );
+
+ camera->position = (Vec3){ 0.0f, 6.0f, 0.0f };
+ camera->viewDirection = (Vec3){ 0.5f, 0.0f, -1.0f };
+ camera->needsUpdate = true;
+ camera->up = (Vec3){ 0.0f, 1.0f, 0.0f };
+
+ return camera;
+}
+
+void camera_move_up(Camera* camera)
+{
+ Vec3 temp = vec3_scalar_mul(&camera->up, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void camera_move_down(Camera* camera)
+{
+ Vec3 temp = vec3_scalar_mul(&camera->up, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void camera_move_left(Camera* camera)
+{
+ Vec3 strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
+ strafeDirection = vec3_scalar_mul(&strafeDirection, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &strafeDirection);
+}
+
+void camera_move_right(Camera* camera)
+{
+ Vec3 strafeDirection = vec3_cross_mul(&camera->viewDirection, &camera->up);
+ strafeDirection = vec3_scalar_mul(&strafeDirection, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &strafeDirection);
+}
+
+void camera_move_foward(Camera* camera)
+{
+ Vec3 temp = vec3_scalar_mul(&camera->viewDirection, movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void camera_move_backward(Camera* camera)
+{
+ Vec3 temp = vec3_scalar_mul(&camera->viewDirection, -movementSpeed * Time_GetFrameTime());
+ camera->position = vec3_add(&camera->position, &temp);
+}
+
+void camera_mouse_update(Camera *camera, const Vec2 *newMousePosition)
+{
+ Vec2 mouseDelta = vec2_sub(newMousePosition, &camera->mousePosition);
+
+ /* El if evita que el mouse se teletrasporte al cambiar de posicion muy rapido */
+ if(vec2_length(&mouseDelta) > 50.0f){
+ camera->mousePosition = *newMousePosition;
+ return;
+ }
+
+ Vec3 verticalRotation = vec3_cross_mul(&camera->viewDirection, &camera->up);
+
+ Mat4 temp = mat4_rotate(mouseDelta.x * -0.5f, &camera->up);
+
+ camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);
+
+ temp = mat4_rotate(mouseDelta.y * -0.5f, &verticalRotation);
+ camera->viewDirection = mat4_mul_vec3(&temp, &camera->viewDirection);
+
+ camera->mousePosition = *newMousePosition;
+
+ camera->needsUpdate = true;
+}
+
+void camera_free(Camera *camera)
+{
+ free(camera);
+}
+
+Mat4 camera_get_model_to_view_matrix(Camera* camera)
+{
+ if(camera->needsUpdate)
+ {
+ Vec3 temp = vec3_add(&camera->position, &camera->viewDirection);
+ camera->viewMatrix = mat4_lookAt(&camera->position, &temp, &camera->up);
+ }
+ return camera->viewMatrix;
+}
diff --git a/09-september/tomcat/renderer/camera.h b/09-september/tomcat/renderer/camera.h
new file mode 100644
index 0000000..0c63178
--- /dev/null
+++ b/09-september/tomcat/renderer/camera.h
@@ -0,0 +1,32 @@
+#ifndef CAMERA_H
+#define CAMERA_H
+
+#include "../math/matrix4x4.h"
+#include "../math/vector.h"
+#include <stdbool.h>
+
+typedef struct
+{
+ Vec3 position;
+ Vec3 viewDirection;
+ Vec3 up;
+ Mat4 projectionMatrix;
+ Mat4 viewMatrix;
+ Vec2 mousePosition;
+ bool needsUpdate;
+} Camera;
+
+extern Camera *camera_new();
+extern void camera_move_up(Camera *camera);
+extern void camera_move_down(Camera *camera);
+extern void camera_move_left(Camera *camera);
+extern void camera_move_right(Camera *camera);
+extern void camera_move_foward(Camera *camera);
+extern void camera_move_backward(Camera *camera);
+extern void camera_mouse_update(Camera *camera, const Vec2 *newMousePosition);
+extern void camera_free(Camera *camera);
+
+/* Consigue la viewMatrix */
+extern Mat4 camera_get_model_to_view_matrix(Camera *camera);
+
+#endif // CAMERA_H
diff --git a/09-september/tomcat/renderer/entity.c b/09-september/tomcat/renderer/entity.c
new file mode 100644
index 0000000..d5e7429
--- /dev/null
+++ b/09-september/tomcat/renderer/entity.c
@@ -0,0 +1,33 @@
+#include "renderer.h"
+
+Mat4 Entity_GetModelTransform(Entity* entity)
+{
+ Mat4 temp;
+ Mat4 rotation = mat4_rotate_x(entity->rotX);
+ temp = mat4_rotate_y(entity->rotY);
+ rotation = mat4_mul(&rotation, &temp);
+ temp = mat4_rotate_z(entity->rotZ);
+ rotation = mat4_mul(&rotation, &temp);
+
+ temp = mat4_translate(&entity->position);
+
+ Mat4 modelTransform = mat4_mul(&temp, &rotation);
+ temp = mat4_scale(entity->scale[0], entity->scale[1], entity->scale[2]);
+ modelTransform = mat4_mul(&modelTransform, &temp);
+
+ return modelTransform;
+}
+
+Vec2 Entity_GetTexOffset(Entity *entity)
+{
+ /* Offset inside a texture atlas should default to (0, 0)*/
+ Vec2 tex_offset;
+ Texture *t = entity->texture;
+
+ int column = entity->index % t->number_of_rows;
+ int row = entity->index / t->number_of_rows;
+ tex_offset.x = (float)column / t->number_of_rows;
+ tex_offset.y = (float)row / t->number_of_rows;
+
+ return tex_offset;
+}
diff --git a/09-september/tomcat/renderer/mesh.c b/09-september/tomcat/renderer/mesh.c
new file mode 100644
index 0000000..7ef27dc
--- /dev/null
+++ b/09-september/tomcat/renderer/mesh.c
@@ -0,0 +1,146 @@
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "mesh.h"
+#include "renderer.h"
+
+#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)
+
+Mesh *mesh_new(vertex_t* vertices, GLsizeiptr vertexBuffersize,
+ GLushort* indices, GLsizeiptr indexBuffersize)
+{
+ Mesh *mesh;
+ mesh = malloc( sizeof(Mesh) );
+ memset(mesh, 0, sizeof(Mesh) );
+
+ render.meshes[render.num_meshes] = mesh;
+ render.num_meshes += 1;
+
+ mesh->num_indices = ( indexBuffersize / sizeof(GLushort) );
+
+ glGenVertexArrays(1, &mesh->vao);
+ glGenBuffers(1, &mesh->vbo);
+ glGenBuffers(1, &mesh->ebo);
+
+ glBindVertexArray(mesh->vao);
+
+ glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
+ glBufferData(GL_ARRAY_BUFFER, vertexBuffersize, vertices, GL_STATIC_DRAW);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->ebo);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffersize, indices, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+ glEnableVertexAttribArray(1);
+ glEnableVertexAttribArray(2);
+ glEnableVertexAttribArray(3);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, position) );
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, texCoord) );
+ glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, normal) );
+ glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offsetof(vertex_t, tangent) );
+
+ glBindVertexArray(0);
+ return mesh;
+}
+
+Mesh *mesh_make_skybox(float size)
+{
+ Mesh *mesh;
+ mesh = malloc( sizeof(Mesh) );
+ memset(mesh, 0, sizeof(Mesh) );
+
+ render.meshes[render.num_meshes] = mesh;
+ render.num_meshes += 1;
+
+ Vec3 positions[] =
+ {
+ {-size, size, -size}, {-size, -size, -size}, {+size, -size, -size},
+ {+size, -size, -size}, {+size, +size, -size}, {-size, +size, -size},
+
+ {-size, -size, +size}, {-size, -size, -size}, {-size, +size, -size},
+ {-size, +size, -size}, {-size, +size, +size}, {-size, -size, +size},
+
+ {+size, -size, -size}, {+size, -size, +size}, {+size, +size, +size},
+ {+size, +size, +size}, {+size, +size, -size}, {+size, -size, -size},
+
+ {-size, -size, +size}, {-size, +size, +size}, {+size, +size, +size},
+ {+size, +size, +size}, {+size, -size, +size}, {-size, -size, +size},
+
+ {-size, +size, -size}, {+size, +size, -size}, {+size, +size, +size},
+ {+size, +size, +size}, {-size, +size, +size}, {-size, +size, -size},
+
+ {-size, -size, -size}, {-size, -size, +size}, {+size, -size, -size},
+ {+size, -size, -size}, {-size, -size, +size}, {+size, -size, +size}
+ };
+
+ mesh->num_indices = 0;
+ mesh->num_vertices = NUM_ARRAY_ELEMENTS(positions);
+
+ glGenVertexArrays(1, &mesh->vao);
+ glGenBuffers(1, &mesh->vbo);
+ mesh->ebo = 0;
+
+ glBindVertexArray(mesh->vao);
+
+ glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
+
+ glBindVertexArray(0);
+ return mesh;
+}
+
+Mesh *mesh_make_quad()
+{
+ Mesh *mesh;
+ mesh = malloc( sizeof(Mesh) );
+ memset(mesh, 0, sizeof(Mesh) );
+
+ render.meshes[render.num_meshes] = mesh;
+ render.num_meshes += 1;
+
+ Vec3 positions[] =
+ {
+ { -0.5f, +0.5f, +0.0f}, { -0.5f, -0.5f, +0.0f},
+ { +0.5f, +0.5f, +0.0f}, { +0.5f, -0.5f, +0.0f}
+ };
+
+ mesh->num_vertices = NUM_ARRAY_ELEMENTS(positions);
+ mesh->num_indices = 0;
+
+ glGenVertexArrays(1, &mesh->vao);
+ glGenBuffers(1, &mesh->vbo);
+ mesh->ebo = 0;
+
+ glBindVertexArray(mesh->vao);
+
+ glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
+
+ glBindVertexArray(0);
+ return mesh;
+}
+
+void mesh_purge(Mesh *mesh)
+{
+ if(mesh)
+ {
+ if(mesh->vbo)
+ glDeleteBuffers(1, &mesh->vbo);
+ if(mesh->ebo)
+ glDeleteBuffers(1, &mesh->ebo);
+ if(mesh->vao)
+ glDeleteVertexArrays(1, &mesh->vao);
+
+ memset(mesh, 0, sizeof(Mesh));
+ }
+}
diff --git a/09-september/tomcat/renderer/mesh.h b/09-september/tomcat/renderer/mesh.h
new file mode 100644
index 0000000..711a82e
--- /dev/null
+++ b/09-september/tomcat/renderer/mesh.h
@@ -0,0 +1,22 @@
+#ifndef MESH_H
+#define MESH_H
+
+#include "vertex.h"
+
+typedef struct _Mesh
+{
+ GLuint num_indices;
+ GLuint num_vertices;
+ GLuint vbo, ebo, vao;
+} Mesh;
+
+/** Mesh Factory **/
+extern Mesh *mesh_new(vertex_t* vertices, GLsizeiptr vertexBuffersize,
+ GLushort* indices, GLsizeiptr indexBuffersize);
+
+extern Mesh *mesh_make_skybox(float size);
+extern Mesh *mesh_make_quad();
+
+extern void mesh_purge(Mesh *mesh);
+
+#endif // MESH_H
diff --git a/09-september/tomcat/renderer/model.c b/09-september/tomcat/renderer/model.c
new file mode 100644
index 0000000..3c65ad3
--- /dev/null
+++ b/09-september/tomcat/renderer/model.c
@@ -0,0 +1,314 @@
+#include "model.h"
+#include "renderer.h"
+#include "../util/array.h"
+#include "../util/util.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define MAX_HASH_MODELS 1024
+static Model *model_hash_table[MAX_HASH_MODELS];
+
+static const int BUFFER_SIZE = 128;
+
+static Model *_model_alloc(const char *name)
+{
+ if(strlen(name) > MAX_PATH_LENGTH)
+ Util_FatalError("File following model name is too long: %s", name);
+
+ if(render.num_models >= MAX_MODELS)
+ return NULL;
+
+ Model *model;
+
+ unsigned int hash_ = Util_Hash( name );
+ hash_ %= MAX_HASH_MODELS;
+
+ model = malloc( sizeof(Model) );
+ memset(model, 0, sizeof(Model) );
+
+ render.models[render.num_models] = model;
+ render.num_models += 1;
+
+ strcpy(model->_name, name);
+ model->_hash_next = model_hash_table[hash_];
+ model_hash_table[hash_] = model;
+
+ model->_hash = hash_;
+
+ return model;
+}
+
+Model *model_get(const char *name)
+{
+ Model *model;
+
+ unsigned int hash_ = Util_Hash( name );
+ hash_ %= MAX_HASH_MODELS;
+
+ if(model_hash_table[hash_] != NULL)
+ {
+ for(model = model_hash_table[hash_]; model; model = model->_hash_next)
+ {
+ if( model->_hash == hash_ )
+ return model;
+ }
+ }
+
+ return NULL;
+}
+
+typedef struct
+{
+ vertex_t *data;
+ GLushort *indices;
+
+ Array *positions;
+ Array *textures;
+ Array *normals;
+ Array *tangents;
+
+ unsigned int vertex_count, index_count;
+ unsigned int index_pointer;
+
+ GLubyte hasTextCoords, hasNormals;
+} OBJ_Mesh;
+
+static vertex_t *search_index(vertex_t *pkey, vertex_t *pelem, unsigned int vertex_count)
+{
+ int i;
+ for(i = 0; i < vertex_count; i++)
+ {
+ if(pelem[i].position.x == pkey->position.x &&
+ pelem[i].position.y == pkey->position.y &&
+ pelem[i].position.z == pkey->position.z &&
+ pelem[i].texCoord.x == pkey->texCoord.x &&
+ pelem[i].texCoord.y == pkey->texCoord.y &&
+ pelem[i].normal.x == pkey->normal.x &&
+ pelem[i].normal.y == pkey->normal.y &&
+ pelem[i].normal.z == pkey->normal.z)
+ {
+ return &pelem[i];
+ }
+ }
+ return NULL;
+}
+
+static void calculate_tangents(OBJ_Mesh *mesh)
+{
+ int i;
+ for(i = 0; i < mesh->index_count; i += 3)
+ {
+ int i0 = i;
+ int i1 = i + 1;
+ int i2 = i + 2;
+
+ Vec3 *v0 = ( (Vec3 *)mesh->positions->data) + i0;
+ Vec3 *v1 = ( (Vec3 *)mesh->positions->data) + i1;
+ Vec3 *v2 = ( (Vec3 *)mesh->positions->data) + i2;
+
+ Vec2 *uv0 = ( (Vec2 *)mesh->textures->data) + i0;
+ Vec2 *uv1 = ( (Vec2 *)mesh->textures->data) + i1;
+ Vec2 *uv2 = ( (Vec2 *)mesh->textures->data) + i2;
+
+ Vec3 deltaPos1 = vec3_sub(v1, v0);
+ Vec3 deltaPos2 = vec3_sub(v2, v0);
+
+ Vec2 deltaUV1 = vec2_sub(uv1, uv0);
+ Vec2 deltaUV2 = vec2_sub(uv2, uv0);
+
+ GLfloat r = 1.0f / (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x);
+
+ deltaPos1 = vec3_scalar_mul(&deltaPos1, deltaUV2.y);
+ deltaPos2 = vec3_scalar_mul(&deltaPos2, deltaUV1.y);
+
+ Vec3 tangent = vec3_sub(&deltaPos1, &deltaPos2);
+ tangent = vec3_scalar_mul(&tangent, r);
+
+ ( (Vec3 *)mesh->tangents->data)[i2] = tangent;
+ ( (Vec3 *)mesh->tangents->data)[i1] = tangent;
+ ( (Vec3 *)mesh->tangents->data)[i0] = tangent;
+ }
+ /*
+ We normalize the tangents at the end of the parse_obj_index loop
+ for(i = 0; i < mesh.index_count; i++)
+ {
+ mesh.tangents[i] = vec3_normalize(&mesh.tangents[i]);
+ }
+ */
+}
+
+static void parse_obj_index(OBJ_Mesh *mesh, vertex_t *current_vertex)
+{
+ vertex_t *indexOnArray = search_index(current_vertex, mesh->data, mesh->vertex_count);
+
+ /* We check if the vertex was already loaded, so the index points to the created vertex instead of repeating data*/
+ if(indexOnArray == NULL)
+ {
+ mesh->data = (vertex_t*) realloc( mesh->data, sizeof(vertex_t) * (++mesh->vertex_count) );
+
+ /* We make the index point to the last vertex added */
+ mesh->indices[mesh->index_pointer] = mesh->vertex_count - 1;
+
+ mesh->data[mesh->vertex_count - 1] = *current_vertex;
+ }
+ else
+ {
+ GLushort index = (GLushort)(indexOnArray - mesh->data);
+ mesh->data[index].tangent = vec3_add( &mesh->data[index].tangent,
+ &current_vertex->tangent );
+
+ /* We make the index point to the previus vertex added instead of creating a new one */
+ mesh->indices[mesh->index_pointer] = index;
+ }
+
+ mesh->index_pointer += 1;
+}
+
+Model *model_obj_new(const char *path)
+{
+ Model *model;
+ model = model_get(path);
+
+ if(model)
+ return model;
+
+ OBJ_Mesh obj_mesh;
+ memset( &obj_mesh, 0, sizeof(OBJ_Mesh) );
+
+ obj_mesh.positions = array_create( sizeof(Vec3) );
+ obj_mesh.normals = array_create( sizeof(Vec3) );
+ obj_mesh.textures = array_create( sizeof(Vec2) );
+
+ Array *positions = array_create( sizeof(Vec3) );
+ Array *normals = array_create( sizeof(Vec3) );
+ Array *textures = array_create( sizeof(Vec2) );
+
+ vertex_t current_vertex;
+
+ Vec3 current_position;
+ Vec3 current_normal;
+ Vec2 current_texture;
+
+ int count = 0, i;
+ int texture[3], normal[3], verts[3];
+
+ FILE *file = fopen(path, "r");
+ if(file == NULL)
+ Util_FatalError("%s file could not be loaded!", path);
+
+ char buffer[BUFFER_SIZE];
+ while( !feof(file) )
+ {
+ fgets(buffer, BUFFER_SIZE, file);
+ switch(buffer[0])
+ {
+ case 'v':
+ if(buffer[1] == 't')
+ {
+ count = sscanf(buffer, "vt %f %f\n", &current_texture.x, &current_texture.y);
+
+ array_append(textures, &current_texture);
+
+ if(count != 2)
+ Util_FatalError("Bad texture coordinates on .obj file");
+ }
+ else if(buffer[1] == 'n')
+ {
+ count = sscanf(buffer, "vn %f %f %f\n", &current_normal.x,
+ &current_normal.y,
+ &current_normal.z);
+ array_append(normals, &current_normal);
+
+ if(count != 3)
+ Util_FatalError("Bad normals data on .obj file");
+ }
+ else
+ {
+ count = sscanf(buffer, "v %f %f %f\n", &current_position.x,
+ &current_position.y,
+ &current_position.z);
+
+ array_append(positions, &current_position);
+
+ if(count != 3)
+ Util_FatalError("Bad vertices data on .obj file");
+ }
+ break;
+ case 'f':
+ obj_mesh.index_count += 3;
+
+ count = sscanf(buffer, "f %d/%d/%d %d/%d/%d %d/%d/%d\n",
+ &verts[0], &texture[0], &normal[0],
+ &verts[1], &texture[1], &normal[1],
+ &verts[2], &texture[2], &normal[2]);
+
+ if(count != 9)
+ Util_FatalError("Bad face data on .obj file");
+
+ array_append(obj_mesh.positions, &( (Vec3 *)positions->data )[ verts[0] -1 ] );
+ array_append(obj_mesh.positions, &( (Vec3 *)positions->data )[ verts[1] -1 ] );
+ array_append(obj_mesh.positions, &( (Vec3 *)positions->data )[ verts[2] -1 ] );
+
+ array_append(obj_mesh.normals, &( (Vec3 *)normals->data )[ normal[0] - 1 ] );
+ array_append(obj_mesh.normals, &( (Vec3 *)normals->data )[ normal[1] - 1 ] );
+ array_append(obj_mesh.normals, &( (Vec3 *)normals->data )[ normal[2] - 1 ] );
+
+ array_append(obj_mesh.textures, &( (Vec2 *)textures->data )[ texture[0] - 1 ] );
+ array_append(obj_mesh.textures, &( (Vec2 *)textures->data )[ texture[1] - 1 ] );
+ array_append(obj_mesh.textures, &( (Vec2 *)textures->data )[ texture[2] - 1 ] );
+
+ break;
+ default:
+ break;
+ }
+ }
+
+ obj_mesh.indices = malloc( obj_mesh.index_count * sizeof(GLushort) );
+ obj_mesh.tangents = array_create_by_size( sizeof(Vec3), obj_mesh.index_count );
+ calculate_tangents(&obj_mesh);
+
+ for(i = 0; i < obj_mesh.index_count; i++)
+ {
+ current_vertex.position = ( (Vec3 *)obj_mesh.positions->data )[i];
+ current_vertex.texCoord = ( (Vec2 *)obj_mesh.textures->data )[i];
+ current_vertex.normal = ( (Vec3 *)obj_mesh.normals->data )[i];
+ current_vertex.tangent = ( (Vec3 *)obj_mesh.tangents->data )[i];
+
+ parse_obj_index(&obj_mesh, &current_vertex);
+ }
+
+ for(i = 0; i < obj_mesh.vertex_count; i++)
+ {
+ obj_mesh.data[i].tangent = vec3_normalize(&obj_mesh.data[i].tangent);
+ }
+
+ array_free(obj_mesh.positions);
+ array_free(obj_mesh.normals);
+ array_free(obj_mesh.textures);
+ array_free(obj_mesh.tangents);
+
+ array_free(positions);
+ array_free(textures);
+ array_free(normals);
+
+ fclose(file);
+
+ GLsizeiptr vertexBuffersize = obj_mesh.vertex_count * sizeof(vertex_t);
+ GLsizeiptr indexBuffersize = obj_mesh.index_count * sizeof(GLushort);
+
+ model = _model_alloc(path);
+
+ model->mesh = mesh_new(obj_mesh.data, vertexBuffersize, obj_mesh.indices, indexBuffersize);
+
+ free(obj_mesh.data);
+ free(obj_mesh.indices);
+
+ return model;
+}
+
+void model_purge(Model *model)
+{
+ mesh_purge(model->mesh);
+}
diff --git a/09-september/tomcat/renderer/model.h b/09-september/tomcat/renderer/model.h
new file mode 100644
index 0000000..6b514dd
--- /dev/null
+++ b/09-september/tomcat/renderer/model.h
@@ -0,0 +1,21 @@
+#ifndef MODEL_H
+#define MODEL_H
+
+#include "../shared.h"
+#include "mesh.h"
+
+typedef struct _Model
+{
+ Mesh *mesh;
+ /* Material? */
+
+ char _name[MAX_PATH_LENGTH];
+ struct _Model *_hash_next;
+ unsigned int _hash;
+} Model;
+
+extern Model *model_obj_new(const char *path);
+extern Model *model_get(const char *name);
+extern void model_purge(Model *model);
+
+#endif // MODEL_H
diff --git a/09-september/tomcat/renderer/renderer.c b/09-september/tomcat/renderer/renderer.c
new file mode 100644
index 0000000..307c543
--- /dev/null
+++ b/09-september/tomcat/renderer/renderer.c
@@ -0,0 +1,430 @@
+#include "renderer.h"
+#include "../util/util_time.h"
+#include "../util/util.h"
+
+#include <string.h>
+
+#define MAX_LIGHTS 4
+
+Renderer render;
+
+void Render_Init(Window *window)
+{
+ memset( &render, 0, sizeof(Renderer) );
+
+ if(glewInit() != GLEW_OK)
+ Util_FatalError("Glew could no be started!");
+
+ strcpy( render.info.version, (const char *) glGetString(GL_VERSION) );
+ strcpy( render.info.vendor, (const char *) glGetString(GL_VENDOR) );
+ strcpy( render.info.shading_version, (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION) );
+
+ fprintf(stderr, "%s\n", render.info.version);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glClearColor(0.0f, 0.0f, 0.39f, 1.0f);
+
+ //glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+
+ render.default_quad = mesh_make_quad();
+
+ render.default_shader = shader_new("pass_shader", "resources/shaders/passShader.vert",
+ "resources/shaders/passShader.frag");
+ render.default_shader->totalTransform = shader_get_uniform_location(render.default_shader, "M_MVP");
+ render.default_shader->Texture = shader_get_uniform_location(render.default_shader, "Texture");
+
+
+ glBindVertexArray(render.default_quad->vao);
+ glCreateBuffers(1, &render.instance_vbo);
+
+ glBindBuffer(GL_ARRAY_BUFFER, render.instance_vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 18 * 10000, NULL, GL_STREAM_DRAW);
+
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 18 * sizeof(GLfloat), (const void *)(sizeof(float) * 0));
+ glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 18 * sizeof(GLfloat), (const void *)(sizeof(float) * 2) );
+ glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 18 * sizeof(GLfloat), (const void *)(sizeof(float) * 6) );
+ glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 18 * sizeof(GLfloat), (const void *)(sizeof(float) * 10) );
+ glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 18 * sizeof(GLfloat), (const void *)(sizeof(float) * 14) );
+
+ glEnableVertexAttribArray(1);
+ glEnableVertexAttribArray(2);
+ glEnableVertexAttribArray(3);
+ glEnableVertexAttribArray(4);
+ glEnableVertexAttribArray(5);
+
+ glVertexAttribDivisor(1, 1);
+ glVertexAttribDivisor(2, 1);
+ glVertexAttribDivisor(3, 1);
+ glVertexAttribDivisor(4, 1);
+ glVertexAttribDivisor(5, 1);
+
+ glBindVertexArray(0);
+
+ render.window = window;
+ render.shadow_width = 1024;
+ render.shadow_height = 1024;
+
+ /** TEMP **/
+
+ Vec3 center = {0.0f, 0.0f, 0.0f};
+ Vec3 up = {0.0f, 1.0f, 0.0f};
+ render.inv_light_dir = (Vec3){11.54f, 66.74f, 9.93f};
+ Mat4 shadow_ortho_mat = mat4_orthographic(-100.0f, 100.0f, -100.0f, 100.0f, -100.0f, 200.0f);
+ Mat4 shadow_view_mat = mat4_lookAt(&render.inv_light_dir, &center, &up);
+ Mat4 shadow_model;
+ mat4_identity(&shadow_model);
+
+ render.shadow_mvp = mat4_mul(&shadow_ortho_mat, &shadow_view_mat);
+ render.shadow_mvp = mat4_mul(&render.shadow_mvp, &shadow_model);
+
+ render.shadow_shader = shader_new("s_shader", "resources/shaders/shadow_shader.vert",
+ "resources/shaders/shadow_shader.frag");
+ render.shadow_shader->totalTransform = shader_get_uniform_location(render.shadow_shader, "M_MVP");
+
+ /** TEMP **/
+
+ glGenFramebuffers(1, &render.shadow_fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, render.shadow_fbo);
+
+
+ glGenTextures(1, &render.shadow_map);
+ glBindTexture(GL_TEXTURE_2D, render.shadow_map);
+
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, render.shadow_width,
+ render.shadow_height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glGenTextures(1, &render.shadow_color);
+ glBindTexture(GL_TEXTURE_2D, render.shadow_color);
+
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, render.shadow_width,
+ render.shadow_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, render.shadow_map, 0);
+ glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, render.shadow_color, 0);
+
+ //glDrawBuffer(GL_NONE);
+ GLenum draw_buffer = GL_COLOR_ATTACHMENT0;
+ glDrawBuffers(1, &draw_buffer);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+ Util_FatalError("Could not create a frame buffer object\n");
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glViewport(0, 0, render.window->Width, render.window->Height);
+
+ Util_CheckGLError();
+}
+
+void Render_BeginFrame()
+{
+ glClearColor(0.0f, 0.0f, 0.39f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+
+ glBindFramebuffer(GL_FRAMEBUFFER, render.shadow_fbo);
+ glViewport(0, 0, render.shadow_width, render.shadow_height);
+ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+}
+
+void Render_LoadLights(Shader *s, const Light *lights, int n)
+{
+ Vec3 light_positions[MAX_LIGHTS];
+ Vec4 light_colors[MAX_LIGHTS];
+ Vec3 attenuation[MAX_LIGHTS];
+ int i;
+
+ /* Default light in case we are not given enough lights (n < 4) */
+ static const Light defaultLight =
+ {
+ { 0.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f, 0.0f },
+ { 1.0f, 0.0f, 0.0f }
+ };
+
+ for(i = 0; i < MAX_LIGHTS; i++)
+ {
+ if(i < n)
+ {
+ light_positions[i] = lights[i].position;
+ light_colors[i] = lights[i].color;
+ attenuation[i] = lights[i].attenuation;
+ }
+ else
+ {
+ light_positions[i] = defaultLight.position;
+ light_colors[i] = defaultLight.color;
+ attenuation[i] = defaultLight.attenuation;
+ }
+
+ }
+
+ glUniform3fv(s->lightPosition, MAX_LIGHTS, (float *)light_positions);
+ glUniform4fv(s->lightColor, MAX_LIGHTS, (float *)light_colors);
+ glUniform3fv(s->lightAttenuation, MAX_LIGHTS, (float *)attenuation);
+}
+
+/******************************************************************************
+* *
+* Function Name: Render_DrawEntity *
+* *
+* Specific shader layout *
+* -> extra0 texture atlas number of rows *
+* -> extra1 texture atlas xy offset *
+* *
+*******************************************************************************/
+
+void Render_DrawEntity(Shader *s, Mat4 *projectedViewMatrix, Entity *entity)
+{
+ Mesh *mesh = entity->model->mesh;
+ /*We need the model to world matrix in our shader in order to rotate the normals*/
+ Mat4 modelTransform = Entity_GetModelTransform(entity);
+ Mat4 totalMatrix;
+
+ /** TEMP **/
+
+ /** TEMP**/
+
+ glUniformMatrix4fv(s->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(s->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ glUniform1i(s->Texture, 0);
+ texture_bind(entity->texture, 0);
+
+ glUniform1f(s->extra0, entity->texture->number_of_rows);
+ Vec2 tex_offset = Entity_GetTexOffset(entity);
+ glUniform2fv(s->extra1, 1, (float *)&tex_offset);
+
+ glBindVertexArray(mesh->vao);
+ glDrawElements(GL_TRIANGLES, mesh->num_indices, GL_UNSIGNED_SHORT, NULL);
+ glBindVertexArray(0);
+}
+
+/******************************************************************************
+* *
+* Function Name: Render_DrawTerrain *
+* *
+* Specific shader layout *
+* -> extra0 Texture_Background *
+* -> extra1 Texture_R *
+* -> extra2 Texture_G *
+* -> extra3 Texture_B *
+* -> extra4 Texture_BlendMap *
+* *
+*******************************************************************************/
+
+void Render_DrawTerrain(Shader *s, Mat4 *projectedViewMatrix, Terrain *terrain)
+{
+ Mat4 totalMatrix;
+ Mat4 modelTransform;
+
+ /* We need the model to world matrix in our shader in order to rotate the normals */
+ modelTransform = mat4_translate(&terrain->position);
+ glUniformMatrix4fv(s->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(s->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ /** Set textures for the terrain **/
+
+ glUniform1i(s->extra0, 0);
+ glUniform1i(s->extra1, 1);
+ glUniform1i(s->extra2, 2);
+ glUniform1i(s->extra3, 3);
+ glUniform1i(s->extra4, 4);
+
+ texture_bind(terrain->textures.texture[0], 0);
+ texture_bind(terrain->textures.texture[1], 1);
+ texture_bind(terrain->textures.texture[2], 2);
+ texture_bind(terrain->textures.texture[3], 3);
+ texture_bind(terrain->blendmap, 4);
+
+ /**********************************/
+
+ glBindVertexArray(terrain->mesh->vao);
+ glDrawElements(GL_TRIANGLES, terrain->mesh->num_indices, GL_UNSIGNED_SHORT, NULL);
+ glBindVertexArray(0);
+}
+
+void Render_DrawSky(Shader *s, Mat4 *viewMatrix, Mat4 *projectionMatrix, Skybox *sky)
+{
+ Mat4 myViewMatrix = *viewMatrix;
+ Mat4 totalTransform;
+ Mat4 rotateMatrix = mat4_rotate_y(sky->rotation);
+
+ sky->rotation += SKYBOX_ROTATION_SPEED * Time_GetFrameTime();
+
+ /* We don't want to move the skybox around (We want it to stay with the camera in the midle),
+ just rotate it with the camera so we remove the translations components of the matrix */
+
+ myViewMatrix.data[0 + 3 * 4] = 0.0f;
+ myViewMatrix.data[1 + 3 * 4] = 0.0f;
+ myViewMatrix.data[2 + 3 * 4] = 0.0f;
+
+ myViewMatrix = mat4_mul(&myViewMatrix, &rotateMatrix);
+ totalTransform = mat4_mul(projectionMatrix, &myViewMatrix);
+
+ glUniformMatrix4fv(s->totalTransform, 1, GL_FALSE, totalTransform.data );
+
+ texture_bind(sky->texture, 0);
+ glUniform1i(s->Texture, 0);
+
+ glBindVertexArray(sky->cube->vao);
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+ glBindVertexArray(0);
+}
+
+/******************************************************************************
+* *
+* Function Name: Render_DrawParticles *
+* *
+* Specific shader layout *
+* -> extra0 texture atlas number of rows *
+* -> extra1 texture atlas xy offset *
+* *
+*******************************************************************************/
+
+void Render_DrawParticles(Shader *s, Mat4 *viewMatrix, Mat4 *projectionMatrix)
+{
+ Mat4 modelTransform, modelViewMatrix, totalTransform, scale;
+ Particle *c = NULL;
+ ParticleSystem *sys = NULL;
+
+ int num_particles = 0;
+ int i, j;
+
+
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glUniform1i(s->Texture, 0);
+
+ for(i = 0; i < particles.num_systems; i++)
+ {
+ sys = particles.systems[i];
+
+ texture_bind(sys->texture, 0);
+ glUniform1f(s->extra0, sys->texture->number_of_rows);
+
+ /* Orphane the buffer */
+ glBindBuffer(GL_ARRAY_BUFFER, render.instance_vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 18 * MAX_PARTICLES_PER_SYSTEM, NULL, GL_STREAM_DRAW);
+
+ if(sys->additive)
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ else
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for(j = 0; j < sys->num_particles; j++)
+ {
+ c = &sys->particles[j];
+
+ modelTransform = mat4_translate(&c->position);
+ scale = mat4_scale(c->scale, c->scale, c->scale);
+ modelTransform = mat4_mul(&modelTransform, &scale);
+ /*
+ We eliminate the rotation from the view matrix so the particle is always facing the camera,
+ for this we add the transposed matrix from the rotation part of the viewmatrx and put it
+ on the model transform matrix
+ */
+ modelTransform.data[0] = viewMatrix->data[0];
+ modelTransform.data[4] = viewMatrix->data[1];
+ modelTransform.data[8] = viewMatrix->data[2];
+ modelTransform.data[1] = viewMatrix->data[4];
+ modelTransform.data[5] = viewMatrix->data[5];
+ modelTransform.data[9] = viewMatrix->data[6];
+ modelTransform.data[2] = viewMatrix->data[8];
+ modelTransform.data[6] = viewMatrix->data[9];
+ modelTransform.data[10] = viewMatrix->data[10];
+
+ modelViewMatrix = mat4_mul(viewMatrix, &modelTransform);
+ totalTransform = mat4_mul(projectionMatrix, &modelViewMatrix);
+
+ /* Load the texture atlas coods and MVP matrix */
+ glBufferSubData(GL_ARRAY_BUFFER, num_particles * sizeof(GLfloat), sizeof(Vec2), &c->tex_offset);
+ glBufferSubData(GL_ARRAY_BUFFER, (num_particles + 2) * sizeof(GLfloat), sizeof(Mat4), totalTransform.data);
+
+ num_particles += 18;
+ }
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ glBindVertexArray(render.default_quad->vao);
+ glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, num_particles / 18);
+ }
+
+ glBindVertexArray(0);
+
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+}
+
+void Render_EndFrame()
+{
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glViewport(0, 0, render.window->Width, render.window->Height);
+}
+
+void Render_Shutdown()
+{
+ int i;
+
+ glDeleteTextures(1, &render.shadow_map);
+ glDeleteFramebuffers(1, &render.shadow_fbo);
+
+ glDeleteBuffers(1, &render.instance_vbo);
+
+ /* Destroy all created textures */
+ for(i = 0; i < render.num_textures; i++)
+ {
+ texture_purge( render.textures[i] );
+ free(render.textures[i]);
+ }
+
+ /* Destroy all created models */
+ for(i = 0; i < render.num_models; i++)
+ {
+ model_purge(render.models[i]);
+ free(render.models[i]);
+ }
+
+ for(i = 0; i < render.num_meshes; i++)
+ {
+ mesh_purge(render.meshes[i]);
+ free(render.meshes[i]);
+ }
+
+ /* Destroy all created shaders */
+ for(i = 0; i < render.num_shaders; i++)
+ {
+ shader_purge(render.shaders[i]);
+ free(render.shaders[i]);
+ }
+
+ /* Just for checking */
+ printf("%d textures were deleted!\n", render.num_textures);
+ printf("%d models were deleted!\n", render.num_models);
+ printf("%d shaders were deleted!\n", render.num_shaders);
+ printf("%d meshes were deleted!\n", render.num_meshes);
+
+ /* Clear everything */
+ memset( &render, 0, sizeof(Renderer) );
+}
diff --git a/09-september/tomcat/renderer/renderer.h b/09-september/tomcat/renderer/renderer.h
new file mode 100644
index 0000000..791d65d
--- /dev/null
+++ b/09-september/tomcat/renderer/renderer.h
@@ -0,0 +1,86 @@
+#ifndef RENDERER_H
+#define RENDERER_H
+
+#include "../terrain.h"
+#include "../util/array.h"
+#include "vertex.h"
+#include "../particles/particles.h"
+#include "renderer_types.h"
+#include "stdint.h"
+#include "window.h"
+
+#define MAX_STRING_LENGTH 128
+
+#define MAX_TEXTURES 2048
+#define MAX_MODELS 2048
+#define MAX_MESHES 2048
+#define MAX_SHADERS 32
+
+/** Beginning of rendering functions **/
+
+typedef struct _GlInfo
+{
+ char version[MAX_STRING_LENGTH];
+ char shading_version[MAX_STRING_LENGTH];
+ char vendor[MAX_STRING_LENGTH];
+} GlInfo;
+
+typedef struct _Renderer
+{
+ GlInfo info;
+
+ Mesh *default_quad;
+ Shader *default_shader;
+ GLuint instance_vbo;
+
+ Texture *textures[MAX_TEXTURES]; /* All loaded textures */
+ int num_textures;
+
+ Shader *shaders[MAX_SHADERS]; /* All loaded shaders */
+ int num_shaders;
+
+ Model *models[MAX_MODELS]; /* All created shapes */
+ int num_models;
+
+ Mesh *meshes[MAX_MESHES];
+ int num_meshes;
+
+ Window *window;
+
+ GLuint shadow_fbo; /* Frame buffer for shadow mapping */
+ GLuint shadow_map; /* Texture for rendering the shadow map (shadow mapping) */
+ GLuint shadow_color;
+ GLint shadow_width;
+ GLint shadow_height;
+
+ /** TEMP **/
+ Mat4 shadow_mvp;
+ Vec3 inv_light_dir;
+ Shader *shadow_shader;
+
+ /** TEMP **/
+} Renderer;
+extern Renderer render;
+
+extern void Render_Init(Window *window);
+
+extern void Render_BeginFrame();
+
+/* Load lights into the current shader program */
+extern void Render_LoadLights(Shader *shader, const Light *lights, int n);
+
+extern void Render_DrawEntity(Shader *shader, Mat4 *projectedViewMatrix, Entity *entity);
+extern void Render_DrawTerrain(Shader *shader, Mat4 *projectedViewMatrix, Terrain *terrain);
+extern void Render_DrawSky(Shader *shader, Mat4 *viewMatrix, Mat4 *projectionMatrix, Skybox *sky);
+extern void Render_DrawParticles(Shader *shader, Mat4 *viewMatrix, Mat4 *projectionMatrix);
+
+extern void Render_EndFrame();
+
+extern void Render_Shutdown();
+
+extern Mat4 Entity_GetModelTransform(Entity* entity);
+extern Vec2 Entity_GetTexOffset(Entity *entity);
+
+/** End of rendering functions **/
+
+#endif // RENDERER_H
diff --git a/09-september/tomcat/renderer/renderer_types.h b/09-september/tomcat/renderer/renderer_types.h
new file mode 100644
index 0000000..cd07a20
--- /dev/null
+++ b/09-september/tomcat/renderer/renderer_types.h
@@ -0,0 +1,47 @@
+#ifndef RENDERER_TYPES_H
+#define RENDERER_TYPES_H
+
+#define SKYBOX_ROTATION_SPEED 1.0f
+
+#include "../util/str.h"
+#include "../util/array.h"
+
+#include "../math/vector.h"
+#include "../math/matrix4x4.h"
+
+#include "shader.h"
+#include "texture.h"
+#include "model.h"
+
+typedef struct _Material
+{
+ Texture *normal_map;
+ GLfloat shine_damper;
+ GLfloat reflectivity;
+} Material;
+
+typedef struct
+{
+ Texture *texture;
+ Mesh *cube;
+ GLfloat rotation;
+} Skybox;
+
+typedef struct _Entity
+{
+ Model *model;
+ Texture *texture;
+ Vec3 position;
+ float rotX, rotY, rotZ;
+ int index; /* Index inside a texture atlas should default to 0 */
+ float scale[3];
+} Entity;
+
+typedef struct
+{
+ Vec3 position;
+ Vec4 color;
+ Vec3 attenuation;
+} Light;
+
+#endif // RENDERER_TYPES_H
diff --git a/09-september/tomcat/renderer/shader.c b/09-september/tomcat/renderer/shader.c
new file mode 100644
index 0000000..3f6a5d7
--- /dev/null
+++ b/09-september/tomcat/renderer/shader.c
@@ -0,0 +1,187 @@
+#include "renderer.h"
+#include "../util/util.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#define MAX_HASH_SHADER 16
+static Shader *shader_hash_table[MAX_HASH_SHADER];
+
+static void CompileShader(const char *source, GLuint shaderID)
+{
+ glShaderSource(shaderID, 1, &source, 0);
+ glCompileShader(shaderID);
+ GLint error;
+ glGetShaderiv(shaderID, GL_COMPILE_STATUS, &error);
+ if(error != GL_TRUE)
+ {
+ GLint logLenth;
+ glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLenth);
+ GLchar buffer[logLenth];
+ glGetShaderInfoLog(shaderID, logLenth, &logLenth, buffer);
+ glDeleteShader(shaderID);
+ Util_FatalError("Some shader failed to compile:\n%s", buffer);
+ }
+}
+
+Shader *shader_new(const char *name, const char *vertexShaderPath, const char *fragShaderPath)
+{
+ if(strlen(name) >= MAX_PATH_LENGTH)
+ Util_FatalError("File following shader name is too long: %s", name);
+
+ Shader *s;
+ s = shader_get(name);
+ if(s != NULL)
+ return s;
+
+ char *vertexShaderSource = Util_LoadFile(vertexShaderPath);
+ char *fragmentShaderSource = Util_LoadFile(fragShaderPath);
+
+ GLuint vs = 0, fs = 0, program;
+ vs = glCreateShader(GL_VERTEX_SHADER);
+ fs = glCreateShader(GL_FRAGMENT_SHADER);
+
+ if(vs == 0 || fs == 0)
+ Util_FatalError("Shaders could not be created\n");
+
+ program = glCreateProgram();
+
+ CompileShader(vertexShaderSource, vs);
+ CompileShader(fragmentShaderSource, fs);
+
+ glAttachShader(program, vs);
+ glAttachShader(program, fs);
+
+ glLinkProgram(program);
+
+ GLint error;
+ glGetProgramiv(program, GL_LINK_STATUS, &error);
+
+ if(error != GL_TRUE)
+ {
+ GLint logLength;
+ glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
+
+ GLchar buffer[logLength];
+ glGetProgramInfoLog(program, logLength, &logLength, buffer);
+
+ glDeleteProgram(program);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ Util_FatalError("Shader program failed to link!:\n%s", buffer);
+ }
+ /** Free some usless resources **/
+ glDetachShader(program, vs);
+ glDetachShader(program, fs);
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+
+ free(vertexShaderSource);
+ free(fragmentShaderSource);
+
+ /** Alloc the new texture **/
+ s = malloc( sizeof(Shader) );
+ memset(s, 0, sizeof(Shader) );
+ s->id = program;
+
+ /** Register inside the resource manager **/
+ unsigned int hash_ = Util_Hash( name );
+ hash_ %= MAX_HASH_SHADER;
+
+ render.shaders[render.num_shaders] = s;
+ render.num_shaders += 1;
+
+ strcpy(s->name, name);
+ s->_hash_next = shader_hash_table[hash_];
+ shader_hash_table[hash_] = s;
+
+ s->_hash = hash_;
+
+ /** Return the final result **/
+ return s;
+}
+
+Shader *shader_get(const char *name)
+{
+ Shader *s;
+
+ unsigned int hash_ = Util_Hash( name );
+ hash_ %= MAX_HASH_SHADER;
+
+ if(shader_hash_table[hash_] != NULL)
+ {
+ for(s = shader_hash_table[hash_]; s; s = s->_hash_next)
+ {
+ if( s->_hash == hash_ )
+ return s;
+ }
+ }
+ return NULL;
+}
+
+void shader_purge(Shader *shader)
+{
+ /** Purge the opengl data **/
+ if(shader->id != 0)
+ {
+ glUseProgram(0);
+ glDeleteProgram(shader->id);
+ shader->id = 0;
+ }
+}
+
+GLint shader_get_uniform_location( Shader *s, const char *uniformName )
+{
+ GLint u = glGetUniformLocation(s->id, uniformName);
+ if(u == GL_INVALID_INDEX)
+ Util_FatalError("Uniform \"%s\" could not be found!", uniformName);
+ else
+ return u;
+
+ return 0;
+}
+
+GLint shader_get_attrib_location( Shader *s, const char *attributeName )
+{
+ GLint attrLocation = glGetAttribLocation(s->id, attributeName);
+ if(attrLocation < 0)
+ Util_FatalError("Attribute \"%s\" could not be found!\n", attributeName);
+ return attrLocation;
+}
+
+void shader_set_uniform_mat4( Shader *s, const char *name, const float matrix[16] )
+{
+ GLint location = shader_get_uniform_location(s, name);
+ glUniformMatrix4fv(location, 1, GL_FALSE, matrix);
+}
+
+void shader_set_uniform_float( Shader *s, const char *name, const float val )
+{
+ GLint location = shader_get_uniform_location(s, name);
+ glUniform1f(location, val);
+}
+
+void shader_set_uniform_vec2( Shader *s, const char *name, const float vec[2] )
+{
+ GLint location = shader_get_uniform_location(s, name);
+ glUniform2fv(location, 1, vec);
+}
+
+void shader_set_uniform_vec3( Shader *s, const char *name, const float vec[3] )
+{
+ GLint location = shader_get_uniform_location(s, name);
+ glUniform3fv(location, 1, vec);
+}
+
+void shader_set_uniform_vec4( Shader *s, const char *name, const float vec[4] )
+{
+ GLint location = shader_get_uniform_location(s, name);
+ glUniform4fv(location, 1, vec);
+}
+
+void shader_set_uniform_int( Shader *s, const char *name, const int val )
+{
+ GLint location = shader_get_uniform_location(s, name);
+ glUniform1i(location, val);
+}
diff --git a/09-september/tomcat/renderer/shader.h b/09-september/tomcat/renderer/shader.h
new file mode 100644
index 0000000..e4889f3
--- /dev/null
+++ b/09-september/tomcat/renderer/shader.h
@@ -0,0 +1,59 @@
+#ifndef SHADER_H
+#define SHADER_H
+
+#include "../shared.h"
+
+typedef struct _Shader
+{
+ GLuint id;
+ char name[MAX_PATH_LENGTH];
+
+ /* Layout */
+
+ /* Program Attributes */
+ GLint position;
+ GLint uv;
+ GLint normal;
+ GLint tangent;
+
+ /* Program Uniforms */
+ GLint totalTransform;
+ GLint modelToWorld;
+ GLint lightPosition;
+ GLint ambientLight;
+ GLint lightColor;
+ GLint lightAttenuation;
+ GLint World_eyePosition;
+ GLint Texture;
+ GLint Normal_Map;
+
+ /* Program Multi Purpose Uniforms */
+ GLint extra0;
+ GLint extra1;
+ GLint extra2;
+ GLint extra3;
+ GLint extra4;
+ GLint extra5;
+
+ struct _Shader *_hash_next;
+ unsigned int _hash;
+} Shader;
+
+/** Shaders **/
+extern Shader *shader_new(const char *name, const char *vertexShaderPath, const char *fragShaderPath);
+extern Shader *shader_get(const char *name);
+extern void shader_purge(Shader *shader);
+/** **/
+
+/** Shader functions **/
+extern GLint shader_get_uniform_location( Shader *s, const char *uniformName );
+extern GLint shader_get_attrib_location( Shader *s, const char *attributeName );
+extern void shader_set_uniform_mat4( Shader *s, const char *name, const float matrix[16] );
+extern void shader_set_uniform_float( Shader *s, const char *name, const float val );
+extern void shader_set_uniform_vec2( Shader *s, const char *name, const float vec[2] );
+extern void shader_set_uniform_vec3( Shader *s, const char *name, const float vec[3] );
+extern void shader_set_uniform_vec4( Shader *s, const char *name, const float vec[4] );
+extern void shader_set_uniform_int( Shader *s, const char *name, const int val );
+/** **/
+
+#endif // SHADER_H
diff --git a/09-september/tomcat/renderer/texture.c b/09-september/tomcat/renderer/texture.c
new file mode 100644
index 0000000..e653c5a
--- /dev/null
+++ b/09-september/tomcat/renderer/texture.c
@@ -0,0 +1,188 @@
+#include "../util/util.h"
+#include "renderer.h"
+#include "texture.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+
+#define MAX_HASH_TEXTURES 1024
+static Texture *texture_hash_table[MAX_HASH_TEXTURES];
+
+Texture *texture_new(const char *path)
+{
+ return texture_with_name_new(path, path);
+}
+
+Texture *texture_with_name_new(const char *name, const char *path)
+{
+ if(strlen(name) > MAX_PATH_LENGTH)
+ Util_FatalError("File following texture name is too long: %s", name);
+
+ Texture *tex;
+ tex = texture_get(name);
+
+ if(tex != NULL)
+ return tex;
+
+ if(render.num_textures >= MAX_TEXTURES)
+ return NULL;
+
+ /** Alloc the new texture **/
+ tex = malloc( sizeof(Texture) );
+ memset(tex, 0, sizeof(Texture) );
+ tex->number_of_rows = 1;
+ tex->type = GL_TEXTURE_2D;
+
+ SDL_Surface *data = IMG_Load(path);
+
+ if(data == NULL)
+ Util_FatalError("Texture %s could not be found!\n", path);
+
+ glGenTextures(1, &tex->tex_id);
+ glBindTexture(GL_TEXTURE_2D, tex->tex_id);
+
+ SDL_LockSurface(data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
+ SDL_UnlockSurface(data);
+ SDL_FreeSurface(data);
+
+ /** Configure the texture **/
+ glGenerateMipmap(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -2.4);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ /** Register inside the resource manager **/
+ unsigned int hash_ = Util_Hash( name );
+ hash_ %= MAX_HASH_TEXTURES;
+
+ render.textures[render.num_textures] = tex;
+ render.num_textures += 1;
+
+ strcpy(tex->_name, name);
+ tex->_hash_next = texture_hash_table[hash_];
+ texture_hash_table[hash_] = tex;
+
+ tex->hash_ = hash_;
+
+ /** Return the final result **/
+ return tex;
+}
+
+Texture *texture_cubemap_new(const char *paths[6])
+{
+ return texture_cubemap_with_name_new(paths[0], paths);
+}
+
+Texture *texture_cubemap_with_name_new(const char *name, const char *paths[6])
+{
+ Texture *tex;
+ tex = texture_get(name);
+
+ if(tex != NULL)
+ {
+ puts("s");
+ return tex;
+ }
+
+ if(render.num_textures >= MAX_TEXTURES)
+ return NULL;
+
+ /** Alloc the new texture **/
+ tex = malloc( sizeof(Texture) );
+ memset(tex, 0, sizeof(Texture) );
+ tex->number_of_rows = 1;
+ tex->type = GL_TEXTURE_CUBE_MAP;
+
+ glGenTextures(1, &tex->tex_id);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, tex->tex_id);
+
+ SDL_Surface *data;
+
+ int i;
+ for(i = 0; i < 6; i++)
+ {
+ data = IMG_Load(paths[i]);
+
+ if(data == NULL)
+ Util_FatalError("Texture %s could not be found!\n", paths[i]);
+
+ SDL_LockSurface(data);
+ /** All the textures sides are linearly stored so we just add "i" **/
+ glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA,
+ data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
+
+ SDL_UnlockSurface(data);
+ SDL_FreeSurface(data);
+ }
+
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
+
+ /** Register inside the resource manager **/
+ unsigned int hash_ = Util_Hash( name );
+ hash_ %= MAX_HASH_TEXTURES;
+
+ render.textures[render.num_textures] = tex;
+ render.num_textures += 1;
+
+ strcpy(tex->_name, name);
+ tex->_hash_next = texture_hash_table[hash_];
+ texture_hash_table[hash_] = tex;
+
+ tex->hash_ = hash_;
+
+ /** Return the final result **/
+ return tex;
+}
+
+Texture *texture_get(const char *name)
+{
+ Texture *tex;
+
+ unsigned int hash_ = Util_Hash( name );
+ hash_ %= MAX_HASH_TEXTURES;
+
+ if(texture_hash_table[hash_] != NULL)
+ {
+ for(tex = texture_hash_table[hash_]; tex; tex = tex->_hash_next)
+ {
+ if( tex->hash_ == hash_ )
+ return tex;
+ }
+ }
+ return NULL;
+}
+
+void texture_bind(Texture *tex, int slot)
+{
+ glActiveTexture(GL_TEXTURE0 + slot);
+
+ if(tex->type != GL_TEXTURE_2D && tex->type != GL_TEXTURE_CUBE_MAP)
+ return;
+
+
+ glBindTexture(tex->type, tex->tex_id);
+}
+
+void texture_purge(Texture *tex)
+{
+ /** Purge the opengl data **/
+ if(tex->tex_id != 0)
+ {
+ glDeleteTextures(1, &tex->tex_id);
+ tex->tex_id = 0;
+ }
+}
diff --git a/09-september/tomcat/renderer/texture.h b/09-september/tomcat/renderer/texture.h
new file mode 100644
index 0000000..8288c72
--- /dev/null
+++ b/09-september/tomcat/renderer/texture.h
@@ -0,0 +1,30 @@
+#ifndef TEXTURE_H
+#define TEXTURE_H
+
+#include "../shared.h"
+
+typedef struct _Texture
+{
+ GLuint tex_id;
+ GLenum type;
+
+ int number_of_rows; /* used for texture atlases */
+
+ char _name[MAX_PATH_LENGTH];
+ unsigned int hash_;
+ struct _Texture *_hash_next; /* linked list for storing on hash table */
+
+} Texture;
+
+extern Texture *texture_new(const char *name);
+extern Texture *texture_with_name_new(const char *name, const char *path);
+
+extern Texture *texture_cubemap_new(const char *paths[6]);
+extern Texture *texture_cubemap_with_name_new(const char *name, const char *paths[6]);
+
+extern Texture *texture_get(const char *name);
+extern void texture_bind(Texture *tex, int slot);
+
+extern void texture_purge(Texture *tex); /* Clean the texture without freeing the container */
+
+#endif // TEXTURE_H
diff --git a/09-september/tomcat/renderer/vertex.h b/09-september/tomcat/renderer/vertex.h
new file mode 100644
index 0000000..6a79dde
--- /dev/null
+++ b/09-september/tomcat/renderer/vertex.h
@@ -0,0 +1,15 @@
+#ifndef VERTEX_H
+#define VERTEX_H
+
+#include <GL/glew.h>
+#include "../math/vector.h"
+
+typedef struct
+{
+ Vec3 position;
+ Vec2 texCoord;
+ Vec3 normal;
+ Vec3 tangent;
+} vertex_t;
+
+#endif // VERTEX_H
diff --git a/09-september/tomcat/renderer/window.c b/09-september/tomcat/renderer/window.c
new file mode 100644
index 0000000..d5db1eb
--- /dev/null
+++ b/09-september/tomcat/renderer/window.c
@@ -0,0 +1,49 @@
+#include "window.h"
+#include "../util/util.h"
+#include <stdlib.h>
+
+Window* window_new(const char* title, Uint32 width, Uint32 height)
+{
+ Window* window = malloc(sizeof(Window));
+ window->title = title;
+ window->Width = width;
+ window->Height = height;
+
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
+ //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
+
+ window->window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
+ width, height, SDL_WINDOW_OPENGL);
+ if(window->window == NULL)
+ Util_FatalError( "The window could not be created:\n%s", SDL_GetError() );
+
+ window->context = SDL_GL_CreateContext(window->window);
+
+ if(window->context == NULL)
+ Util_FatalError( "Context could not be created:\n%s", SDL_GetError() );
+
+ glViewport(0, 0, width, height);
+
+ return window;
+}
+
+void window_resize(Window* window, Uint32 width, Uint32 height)
+{
+ window->Width = width;
+ window->Height = height;
+ SDL_SetWindowSize(window->window, width, height);
+ glViewport(0, 0, width, height);
+}
+
+void window_update(Window* window)
+{
+ SDL_GL_SwapWindow(window->window);
+}
+
+void window_destroy(Window* window)
+{
+ SDL_GL_DeleteContext(window->context);
+ SDL_DestroyWindow(window->window);
+ free(window);
+}
diff --git a/09-september/tomcat/renderer/window.h b/09-september/tomcat/renderer/window.h
new file mode 100644
index 0000000..608937a
--- /dev/null
+++ b/09-september/tomcat/renderer/window.h
@@ -0,0 +1,20 @@
+#ifndef WINDOW_H
+#define WINDOW_H
+
+#include <SDL2/SDL.h>
+#include <GL/glew.h>
+
+typedef struct
+{
+ SDL_Window* window;
+ SDL_GLContext context;
+ Uint32 Width, Height;
+ const char* title;
+} Window;
+
+extern Window* window_new(const char* title, Uint32 width, Uint32 height);
+extern void window_resize(Window* window, Uint32 width, Uint32 height);
+extern void window_update(Window* window);
+extern void window_destroy(Window* window);
+
+#endif // WINDOW_H
diff --git a/09-september/tomcat/shared.h b/09-september/tomcat/shared.h
new file mode 100644
index 0000000..35fd471
--- /dev/null
+++ b/09-september/tomcat/shared.h
@@ -0,0 +1,13 @@
+#ifndef SHARED_H
+#define SHARED_H
+
+#include "GL/glew.h"
+#define MAX_PATH_LENGTH 64
+
+typedef enum
+{
+ FALSE,
+ TRUE
+} boolean;
+
+#endif // SHARED_H
diff --git a/09-september/tomcat/terrain.c b/09-september/tomcat/terrain.c
new file mode 100644
index 0000000..f23d057
--- /dev/null
+++ b/09-september/tomcat/terrain.c
@@ -0,0 +1,155 @@
+#include "terrain.h"
+#include "math/math_util.h"
+#include "math/vector.h"
+#include "util/util.h"
+#include "renderer/renderer.h"
+
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
+#include <math.h>
+
+#define PLANE_SIZE 128
+#define PLANE_MAX_HEIGHT 10
+
+#define NUM_ARRAY_ELEMENTS(a) sizeof(a) / sizeof(*a)
+
+static float GetHeight(int x, int y, SDL_Surface* surface)
+{
+ if(x < 0 || x >= surface->w || y < 0 || y >= surface->h)
+ return 0.0f;
+
+ Uint32 pixel = ( (Uint32*)surface->pixels )[y * surface->w + x];
+ Uint8 r, g, b;
+ SDL_GetRGB(pixel, surface->format, &r, &g, &b);
+
+ float height = (float)r / 255.0f;
+
+ return height * 40.0f;
+}
+
+static Vec3 GenerateNomal(int x, int y, SDL_Surface* surface)
+{
+ float hLeft = GetHeight(x-1, y, surface);
+ float hRight = GetHeight(x+1, y, surface);
+ float hUp = GetHeight(x, y+1, surface);
+ float hDown = GetHeight(x, y-1, surface);
+
+ Vec3 normal = { hLeft - hRight, 2.0f, hDown - hUp};
+ return vec3_normalize(&normal);
+}
+
+GLfloat Terrain_GetHeightOfTerrain(Terrain *terrain, GLfloat x, GLfloat z)
+{
+ GLfloat terrainX = x - terrain->position.x;
+ GLfloat terrainZ = z - terrain->position.z;
+
+ GLfloat gridSquareSize = (float)terrain->l / ( (float)PLANE_SIZE - 1 );
+
+ GLint gridX = (GLint) floor(terrainX / gridSquareSize);
+ GLint gridZ = (GLint) floor(terrainZ / gridSquareSize);
+
+ if(gridX >= PLANE_SIZE - 1 || gridX < 0 || gridZ >= PLANE_SIZE - 1 || gridZ < 0)
+ {
+ printf("called\n");
+ return 0;
+ }
+
+ GLfloat xCoord = fmod(terrainX, gridSquareSize) / gridSquareSize;
+ GLfloat zCoord = fmod(terrainZ, gridSquareSize) / gridSquareSize;
+ GLfloat answer;
+
+ /* Determine in which triangle of the square are we. "Bary Centric Interpolation"*/
+ if(xCoord <= (1 - zCoord)){
+ /* 0, heights[gridX][gridZ], 0) */
+ Vec3 p1 = { 0, terrain->height[ gridX * PLANE_SIZE + gridZ ], 0 };
+ /* 1, heights[gridX + 1][gridZ], 0) */
+ Vec3 p2 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + gridZ ], 0};
+ /* 0, heights[gridX][gridZ + 1], 1) */
+ Vec3 p3 = { 0, terrain->height[ gridX * PLANE_SIZE + (gridZ + 1) ], 1};
+
+ Vec2 pos = {xCoord, zCoord};
+
+ answer = baryCentric(&p1, &p2, &p3, &pos);
+ } else {
+ /* (1, heights[gridX + 1][gridZ], 0) */
+ Vec3 p1 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + gridZ ], 0 };
+ /* (1, heights[gridX + 1][gridZ + 1], 1) */
+ Vec3 p2 = { 1, terrain->height[ (gridX + 1) * PLANE_SIZE + (gridZ + 1) ], 1};
+ /* (0, heights[gridX][gridZ + 1], 1) */
+ Vec3 p3 = { 0, terrain->height[ gridX * PLANE_SIZE + (gridZ + 1) ], 1};
+ Vec2 pos = {xCoord, zCoord};
+
+ answer = baryCentric(&p1, &p2, &p3, &pos);
+ }
+
+ return answer;
+}
+
+Terrain *Terrain_Create( int w, int l, const char* heightmap_path, Texture *blendmap, TerrainTexturePack *textures )
+{
+ Terrain *terrain = malloc( sizeof(Terrain) );
+ terrain->height = (GLfloat*) malloc( sizeof(GLfloat) * PLANE_SIZE * PLANE_SIZE);
+
+ terrain->blendmap = blendmap;
+ terrain->w = w; terrain->l = l;
+ terrain->textures = *textures;
+
+ SDL_Surface* surface = IMG_Load(heightmap_path);
+ if(surface == NULL)
+ Util_FatalError("Heightmap file could not be loaded\n");
+
+ vertex_t data[PLANE_SIZE * PLANE_SIZE];
+ int x, y;
+ for(x = 0; x < PLANE_SIZE; x++)
+ {
+ for(y = 0; y < PLANE_SIZE; y++)
+ {
+ vertex_t* v = &data[y + x * PLANE_SIZE];
+ v->position = (Vec3){ (float)x / (float)PLANE_SIZE, 0.0f, (float)y / (float)PLANE_SIZE };
+ /* Heightmap cordinates */
+ int image_x = v->position.x * surface->w, image_y = v->position.z * surface->h;
+
+ v->texCoord = (Vec2){ v->position.x, v->position.z };
+ GLfloat height = GetHeight(image_x, image_y, surface);
+ terrain->height[y + x * PLANE_SIZE] = height;
+ v->position.y = height;
+ v->position.x *= w;
+ v->position.z *= l;
+
+ v->normal = GenerateNomal(image_x, image_y, surface);
+ }
+ }
+
+ int runner = 0;
+ GLushort indices[ (PLANE_SIZE-1) * (PLANE_SIZE-1) * 6 ];
+ for(x = 0; x < PLANE_SIZE-1; x++)
+ {
+ for(y = 0; y < PLANE_SIZE-1; y++)
+ {
+ indices[runner++] = PLANE_SIZE * x + y;
+ indices[runner++] = PLANE_SIZE * x + y + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE;
+
+ indices[runner++] = PLANE_SIZE * x + y + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE + 1;
+ indices[runner++] = PLANE_SIZE * x + y + PLANE_SIZE;
+ }
+ }
+
+ GLsizeiptr vertexBufferSize = NUM_ARRAY_ELEMENTS(data) * sizeof(vertex_t);
+ GLsizeiptr indexBufferSize = NUM_ARRAY_ELEMENTS(indices) * sizeof(GLushort);
+
+ SDL_FreeSurface(surface);
+
+ terrain->mesh = mesh_new(data, vertexBufferSize, indices, indexBufferSize);
+ return terrain;
+}
+
+void Terrain_Destroy( Terrain *terrain )
+{
+ if(terrain->height)
+ free(terrain->height);
+
+ free(terrain);
+}
+
diff --git a/09-september/tomcat/terrain.h b/09-september/tomcat/terrain.h
new file mode 100644
index 0000000..b321e5f
--- /dev/null
+++ b/09-september/tomcat/terrain.h
@@ -0,0 +1,27 @@
+#ifndef TERRAIN_H
+#define TERRAIN_H
+
+#include "renderer/renderer_types.h"
+#include "math/vector.h"
+
+typedef struct
+{
+ Texture *texture[4];
+} TerrainTexturePack;
+
+typedef struct
+{
+ Mesh *mesh;
+ Texture *blendmap;
+ TerrainTexturePack textures;
+
+ GLfloat *height;
+ int w, l;
+ Vec3 position;
+} Terrain;
+
+extern Terrain *Terrain_Create( int w, int l, const char* heightmap_path, Texture *blendmap, TerrainTexturePack *textures);
+extern GLfloat Terrain_GetHeightOfTerrain(Terrain *terrain, GLfloat x, GLfloat z);
+extern void Terrain_Destroy( Terrain *terrain );
+
+#endif // TERRAIN_H
diff --git a/09-september/tomcat/util/array.c b/09-september/tomcat/util/array.c
new file mode 100644
index 0000000..13660e0
--- /dev/null
+++ b/09-september/tomcat/util/array.c
@@ -0,0 +1,102 @@
+#include "array.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#define ARRAY_GROWTH_FACTOR 2
+#define MAX(x, y) ( (x > y) ? x : y )
+
+typedef struct _RealArray
+{
+ char *data;
+ unsigned int length; /* Number of elements */
+
+ unsigned int type_size;
+ unsigned int capacity; /* Array capacity in elements number */
+ bool clear;
+} RealArray;
+
+static void array_check_for_expand(RealArray *arr, unsigned int length);
+
+Array *array_create(unsigned int type_size)
+{
+ return array_create_by_size(type_size, 0);
+}
+
+Array *array_create_by_size(unsigned int type_size, unsigned int reserved_size)
+{
+ RealArray *arr = malloc( sizeof(RealArray) );
+ arr->capacity = 0;
+ arr->data = NULL;
+ arr->length = 0;
+ arr->type_size = type_size;
+
+ if(reserved_size != 0)
+ {
+ array_check_for_expand(arr, reserved_size);
+ }
+
+ return (Array *)arr;
+}
+
+void array_append(Array *arr, void *data)
+{
+ RealArray *r_arr = (RealArray *)arr;
+ array_check_for_expand(r_arr, 1);
+
+ memcpy(r_arr->data + r_arr->length * r_arr->type_size, data, r_arr->type_size);
+ r_arr->length += 1;
+}
+
+void array_insert(Array *arr, int index, void *data)
+{
+ RealArray *r_arr = (RealArray *)arr;
+ array_check_for_expand(r_arr, 1);
+
+ /* Shift everything one place */
+ memmove(r_arr->data + (index + 1) * r_arr->type_size,
+ r_arr->data + index * r_arr->type_size,
+ r_arr->length * r_arr->type_size - index * r_arr->type_size);
+
+ /* Insert the new data */
+ memcpy(r_arr->data + index * r_arr->type_size, data, r_arr->type_size);
+
+ r_arr->length += 1;
+}
+
+void array_remove(Array *arr, int index)
+{
+
+}
+
+void array_reserve(Array *arr, unsigned int length)
+{
+
+}
+
+unsigned int array_get_type_size(Array *arr)
+{
+ RealArray *r_arr = (RealArray *)arr;
+ return r_arr->type_size;
+}
+
+void array_free(Array *arr)
+{
+ RealArray *r_arr = (RealArray *)arr;
+
+ free(r_arr->data);
+ free(r_arr);
+}
+
+static void array_check_for_expand(RealArray *arr, unsigned int length)
+{
+ RealArray *r_arr = (RealArray *)arr;
+
+ unsigned int expected_size = r_arr->length + length;
+
+ if(r_arr->capacity < expected_size)
+ {
+ r_arr->capacity = MAX(ARRAY_GROWTH_FACTOR * r_arr->capacity, expected_size);
+ r_arr->data = realloc(r_arr->data, r_arr->capacity * r_arr->type_size);
+ }
+}
diff --git a/09-september/tomcat/util/array.h b/09-september/tomcat/util/array.h
new file mode 100644
index 0000000..1444a74
--- /dev/null
+++ b/09-september/tomcat/util/array.h
@@ -0,0 +1,23 @@
+#ifndef ARRAY_H
+#define ARRAY_H
+
+#include <stdbool.h>
+
+typedef struct
+{
+ char *data;
+ unsigned int length;
+} Array;
+
+extern Array *array_create(unsigned int type_size);
+extern Array *array_create_by_size(unsigned int type_size, unsigned int reserved_size);
+
+extern void array_append(Array *arr, void *data);
+extern void array_insert(Array *arr, int index, void *data);
+extern void array_remove(Array *arr, int index);
+extern void array_reserve(Array *arr, unsigned int length);
+extern unsigned int array_get_type_size(Array *arr);
+
+extern void array_free(Array *arr);
+
+#endif // ARRAY_H
diff --git a/09-september/tomcat/util/str.c b/09-september/tomcat/util/str.c
new file mode 100644
index 0000000..295b390
--- /dev/null
+++ b/09-september/tomcat/util/str.c
@@ -0,0 +1,121 @@
+#include "str.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+/* Note, we add always 1 to length for the \0 character */
+
+static void string_check_for_expand( String *string_, unsigned int length )
+{
+ if(string_->length + length >= string_->allocated_length)
+ {
+ string_->allocated_length = string_->length + length + 1;
+ string_->data = realloc(string_->data, string_->allocated_length * sizeof(char) );
+ }
+}
+
+String *string_create( const char *init )
+{
+ String *str;
+
+ if(init == NULL || *init == '\0')
+ {
+ str = string_create_by_size(1);
+ }
+ else
+ {
+ unsigned int len = strlen(init);
+ str = string_create_by_size(len + 1);
+ string_append(str, init);
+ }
+
+ return str;
+}
+
+String *string_create_by_size( unsigned int reserved_size)
+{
+ String *str = malloc( sizeof(String) );
+
+ str->data = NULL;
+ str->length = 0;
+ str->allocated_length = 0;
+
+ string_check_for_expand(str, reserved_size);
+
+ str->data[0] = 0;
+ return str;
+}
+
+void string_assign( String *string_, const char *val )
+{
+
+}
+
+void string_append( String *string_, const char *val )
+{
+ string_insert(string_, string_->length, val);
+}
+
+void string_append_char( String *string_, char c )
+{
+ string_insert(string_, string_->length, &c);
+}
+
+void string_insert( String *string_, int index, const char *val)
+{
+ if(index > string_->length)
+ return;
+
+ unsigned int length = strlen(val);
+ string_check_for_expand(string_, length);
+
+ if(index == string_->length - 1)
+ {
+ strcpy(string_->data + string_->length, val);
+ }
+ else
+ {
+ memmove(string_->data + index + length,
+ string_->data + index,
+ (string_->length - index) * sizeof(char) );
+
+ memcpy(string_->data + index, val, length * sizeof(char) );
+ }
+
+ string_->length += length;
+ string_->data[string_->length] = '\0';
+}
+
+void string_insert_char( String *string_, int index, char val)
+{
+ string_insert(string_, index, &val);
+}
+
+void string_free( String *string_ )
+{
+ if(string_)
+ {
+ free(string_->data);
+ free(string_);
+ }
+}
+
+unsigned int string_hash( String *string_ )
+{
+ unsigned int hash, i;
+ for(hash = i = 0; i < string_->length; ++i)
+ {
+ hash += string_->data[i];
+ hash += (hash << 10);
+ hash ^= (hash >> 6);
+ }
+ hash += (hash << 3);
+ hash ^= (hash >> 11);
+ hash += (hash << 15);
+ return hash;
+}
+
+bool string_equal( String *a, String *b )
+{
+ return !strcmp(a->data, b->data);
+}
diff --git a/09-september/tomcat/util/str.h b/09-september/tomcat/util/str.h
new file mode 100644
index 0000000..d8182e1
--- /dev/null
+++ b/09-september/tomcat/util/str.h
@@ -0,0 +1,29 @@
+#ifndef STR_H
+#define STR_H
+
+#include <stdbool.h>
+
+typedef struct _String
+{
+ char *data;
+ unsigned int length;
+ unsigned int allocated_length;
+} String;
+
+extern String *string_create( const char *init );
+extern String *string_create_by_size( unsigned int reserved_size);
+
+extern void string_assign( String *string_, const char *val );
+
+extern void string_append( String *string_, const char *val );
+extern void string_append_char( String *string_, char c );
+
+extern void string_insert( String *string_, int index, const char *val);
+extern void string_insert_char( String *string_, int index, char val);
+
+extern void string_free( String *string_ );
+
+extern unsigned int string_hash( String *string_ );
+extern bool string_equal( String *a, String *b );
+
+#endif // STR_H
diff --git a/09-september/tomcat/util/util.c b/09-september/tomcat/util/util.c
new file mode 100644
index 0000000..22eb0fc
--- /dev/null
+++ b/09-september/tomcat/util/util.c
@@ -0,0 +1,138 @@
+#include "util.h"
+
+#include <SDL2/SDL.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+unsigned int Util_Hash( const char *str )
+{
+ unsigned int hash, i, length;
+ length = strlen(str);
+
+ for(hash = i = 0; i < length; ++i)
+ {
+ hash += str[i];
+ hash += (hash << 10);
+ hash ^= (hash >> 6);
+ }
+
+ hash += (hash << 3);
+ hash ^= (hash >> 11);
+ hash += (hash << 15);
+
+ return hash;
+}
+
+void Util_FatalError( const char *fmt, ... )
+{
+ fprintf(stderr, "Fatal Error:\n");
+
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+
+ SDL_Quit();
+ exit(1);
+}
+
+void Util_CheckGLError()
+{
+ GLenum error = glGetError();
+ switch(error)
+ {
+ case GL_INVALID_ENUM:
+ fprintf(stderr, "WARNING: GL_INVALID_ENUM\n");
+ break;
+ case GL_INVALID_VALUE:
+ fprintf(stderr, "WARNING: GL_INVALID_VALUE\n");
+ break;
+ case GL_INVALID_OPERATION:
+ fprintf(stderr, "WARNING: GL_INVALID_OPERATION\n");
+ break;
+ case GL_INVALID_FRAMEBUFFER_OPERATION:
+ fprintf(stderr, "WARNING: GL_INVALID_FRAMEBUFFER_OPERATION\n");
+ break;
+ case GL_OUT_OF_MEMORY:
+ fprintf(stderr, "WARNING: GL_OUT_OF_MEMORY\n");
+ break;
+ case GL_STACK_UNDERFLOW:
+ fprintf(stderr, "WARNING: GL_STACK_UNDERFLOW\n");
+ break;
+ case GL_STACK_OVERFLOW:
+ fprintf(stderr, "WARNING: GL_STACK_OVERFLOW\n");
+ break;
+
+ default:
+ break;
+ }
+}
+
+char *Util_LoadFile( const char *path )
+{
+ FILE* file = fopen( path, "r" );
+
+ if(file == NULL)
+ {
+ Util_FatalError("File %s could not be found!\n", path);
+ }
+
+ fseek( file, 0, SEEK_END );
+ size_t sizeOfFile = ftell( file );
+ fseek( file, 0, SEEK_SET );
+ char* file_data = malloc( sizeof(char) * sizeOfFile + 1 );
+ fread( file_data, sizeof(char), sizeOfFile, file );
+ file_data[sizeOfFile] = '\0';
+ fclose(file);
+ return file_data;
+}
+
+float Util_RandomF(float min, float max)
+{
+ return ( min + (float)rand() ) / ( (float)RAND_MAX / (max-min) );
+}
+
+int Util_RandomI(int min, int max)
+{
+ return ( rand() % (max-min) ) + min;
+}
+
+Vec3
+Util_GetMouseRay(int screenWidth, int screenHeigth, Mat4 *viewMatrix, Mat4 *projectionMatrix,
+ int mouseX, int mouseY)
+{
+ Vec4 eyeCoords;
+ Vec3 mouseRay;
+ /* Normalized device coords NOTE: -y becouse for SDL y = 0 is the top of the screen */
+ GLfloat normalX = ( 2.0f * (GLfloat)mouseX ) / (GLfloat) screenWidth - 1.0f;
+ GLfloat normalY = 1.0f - (2.0f * (GLfloat)mouseY) / (GLfloat) screenHeigth;
+
+ /* clipCoords include 4th component */
+ Vec4 clipCoords = { normalX, normalY, -1.0f, 1.0f };
+
+ /* Remove perpective */
+ {
+ Mat4 invertedProjection = mat4_inverse(projectionMatrix);
+ eyeCoords = mat4_mul_vec4(&invertedProjection, &clipCoords);
+ eyeCoords.z = -1.0f;
+ eyeCoords.w = 0.0f;
+ }
+
+ /* Remove view matrix*/
+ {
+ Mat4 invertedViewMatrix = mat4_inverse(viewMatrix);
+ Vec4 temp = mat4_mul_vec4(&invertedViewMatrix, &eyeCoords);
+
+ mouseRay.x = temp.x;
+ mouseRay.y = temp.y;
+ mouseRay.z = temp.z;
+
+ mouseRay = vec3_normalize(&mouseRay);
+ }
+
+ /* Return the ray in world coordinates */
+ return mouseRay;
+}
diff --git a/09-september/tomcat/util/util.h b/09-september/tomcat/util/util.h
new file mode 100644
index 0000000..f09f7cb
--- /dev/null
+++ b/09-september/tomcat/util/util.h
@@ -0,0 +1,27 @@
+#ifndef UTIL_H
+#define UTIL_H
+
+#include "../math/matrix4x4.h"
+
+#define toRadians(degrees) (degrees * 3.1415926 / 180.0f)
+#define toDegrees(radians) (radians * 180.0f / 3.1415926)
+
+#ifdef DEBUG
+#include <stdio.h>
+#define myAssert(expr) expr ? 1==1 : fprintf(stderr, "The expresion was not true\n")
+#else
+#define myAssert(expr)
+#endif // DEBUG
+
+extern unsigned int Util_Hash( const char *str );
+extern void Util_FatalError( const char* fmt, ... );
+extern void Util_CheckGLError();
+extern char* Util_LoadFile( const char* path );
+extern float Util_RandomF(float min, float max);
+extern int Util_RandomI(int min, int max);
+
+extern Vec3
+Util_GetMouseRay(int screenWidth, int screenHeigth, Mat4 *viewMatrix, Mat4 *projectionMatrix,
+ int mouseX, int mouseY);
+
+#endif // UTIL_H
diff --git a/09-september/tomcat/util/util_time.c b/09-september/tomcat/util/util_time.c
new file mode 100644
index 0000000..e56d997
--- /dev/null
+++ b/09-september/tomcat/util/util_time.c
@@ -0,0 +1,52 @@
+#include "util_time.h"
+
+static struct
+{
+ float max_ticks_per_frame; //< cuantos ticks (tiempo demora) un frame
+ Uint32 counted_frames; //< cuantos frames han pasado
+ Uint32 start_ticks; //< ticks al iniciar la iteracion del loop
+ Uint32 beg_ticks; //< ticks desde el inicio del juego
+ Uint32 time_per_frame;
+} TIME = {
+ 1000.0f / 60.0f,
+ 0, 0, 0, 0
+};
+
+void Time_Init()
+{
+ TIME.beg_ticks = SDL_GetTicks();
+}
+
+void Time_Begin()
+{
+ TIME.start_ticks = SDL_GetTicks();
+}
+
+float Time_End()
+{
+ TIME.counted_frames += 1;
+ float FPS = (float)TIME.counted_frames / ( (float)(SDL_GetTicks() - TIME.beg_ticks) / 1000.0f );
+
+ float frameTicks = (float)(SDL_GetTicks() - TIME.start_ticks);
+ TIME.time_per_frame = frameTicks;
+ if(frameTicks < TIME.max_ticks_per_frame){
+ SDL_Delay( (Uint32)(TIME.max_ticks_per_frame - frameTicks) );
+ }
+
+ return FPS;
+}
+
+float Time_GetFrameTime()
+{
+ return (float)TIME.time_per_frame / 1000.0f;
+}
+
+void Time_SetMaxFramesPerSecond(Uint32 frames)
+{
+ TIME.max_ticks_per_frame = 1000.0f / (float)frames;
+}
+
+Uint32 Time_GetCountedFrames()
+{
+ return TIME.counted_frames;
+}
diff --git a/09-september/tomcat/util/util_time.h b/09-september/tomcat/util/util_time.h
new file mode 100644
index 0000000..3c3e470
--- /dev/null
+++ b/09-september/tomcat/util/util_time.h
@@ -0,0 +1,13 @@
+#ifndef UTIL_TIME_H
+#define UTIL_TIME_H
+
+#include <SDL2/SDL.h>
+
+extern void Time_Init( void );
+extern void Time_Begin( void );
+extern float Time_End( void );
+extern void Time_SetMaxFramesPerSecond(Uint32 frames);
+extern float Time_GetFrameTime( void );
+extern Uint32 Time_GetCountedFrames( void );
+
+#endif // UTIL_TIME_H
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f382cf8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
+# Tomcat Archive
+
+This repository contains the code of my first experiments using OpenGL. The
+source code is provided as it was in 2016 with only minimal modifications
+(mostly improvements) in the build system.
+
+See the article to this repository: [https://thomaslabs.org/projects/tomcat.html](Tomcat archive)
+
+## Dates of the snapshots
+- 2016-07-31
+- 2016-08-16
+- 2016-09-25
+
+## Dependencies
+- SDL2
+- SDL2 Image
+- OpenGL
+- Glew
diff --git a/manifest.scm b/manifest.scm
new file mode 100644
index 0000000..d4c0233
--- /dev/null
+++ b/manifest.scm
@@ -0,0 +1,5 @@
+(specifications->manifest
+ (list "gcc-toolchain"
+ "sdl2"
+ "sdl2-image"
+ "glew"))