diff options
| author | Thomas Guillermo Albers Raviola <thomas@thomaslabs.org> | 2026-01-16 23:02:32 +0100 |
|---|---|---|
| committer | Thomas Guillermo Albers Raviola <thomas@thomaslabs.org> | 2026-01-16 23:02:32 +0100 |
| commit | 6b8af9cf83851c075c6c9514b1deaa931c2b19a4 (patch) | |
| tree | 428986b49c32e21d3f7a3c2dfa41858ae0153209 | |
Initial commit
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 Binary files differnew file mode 100644 index 0000000..4789845 --- /dev/null +++ b/07-july/resources/textures/blendmap.png diff --git a/07-july/resources/textures/gato.png b/07-july/resources/textures/gato.png Binary files differnew file mode 100644 index 0000000..fc5c762 --- /dev/null +++ b/07-july/resources/textures/gato.png diff --git a/07-july/resources/textures/heightmap.png b/07-july/resources/textures/heightmap.png Binary files differnew file mode 100644 index 0000000..12741e5 --- /dev/null +++ b/07-july/resources/textures/heightmap.png diff --git a/07-july/resources/textures/soil1.png b/07-july/resources/textures/soil1.png Binary files differnew file mode 100644 index 0000000..227e96c --- /dev/null +++ b/07-july/resources/textures/soil1.png diff --git a/07-july/resources/textures/soil2.png b/07-july/resources/textures/soil2.png Binary files differnew file mode 100644 index 0000000..5fc40e2 --- /dev/null +++ b/07-july/resources/textures/soil2.png diff --git a/07-july/resources/textures/soil3.png b/07-july/resources/textures/soil3.png Binary files differnew file mode 100644 index 0000000..2c1c431 --- /dev/null +++ b/07-july/resources/textures/soil3.png diff --git a/07-july/resources/textures/soil4.png b/07-july/resources/textures/soil4.png Binary files differnew file mode 100644 index 0000000..8d3a4d3 --- /dev/null +++ b/07-july/resources/textures/soil4.png diff --git a/07-july/resources/textures/spaceship.png b/07-july/resources/textures/spaceship.png Binary files differnew file mode 100644 index 0000000..2263cdc --- /dev/null +++ b/07-july/resources/textures/spaceship.png diff --git a/07-july/resources/textures/stall.png b/07-july/resources/textures/stall.png Binary files differnew file mode 100644 index 0000000..d4d6f6e --- /dev/null +++ b/07-july/resources/textures/stall.png 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 Binary files differnew file mode 100644 index 0000000..3fd0158 --- /dev/null +++ b/08-august/resources/textures/back.png diff --git a/08-august/resources/textures/barrel.png b/08-august/resources/textures/barrel.png Binary files differnew file mode 100644 index 0000000..baf502b --- /dev/null +++ b/08-august/resources/textures/barrel.png diff --git a/08-august/resources/textures/blendmap.png b/08-august/resources/textures/blendmap.png Binary files differnew file mode 100644 index 0000000..4789845 --- /dev/null +++ b/08-august/resources/textures/blendmap.png diff --git a/08-august/resources/textures/bottom.png b/08-august/resources/textures/bottom.png Binary files differnew file mode 100644 index 0000000..8f9c0f2 --- /dev/null +++ b/08-august/resources/textures/bottom.png diff --git a/08-august/resources/textures/boulder.png b/08-august/resources/textures/boulder.png Binary files differnew file mode 100644 index 0000000..e2cb9d1 --- /dev/null +++ b/08-august/resources/textures/boulder.png diff --git a/08-august/resources/textures/boulderNormal.png b/08-august/resources/textures/boulderNormal.png Binary files differnew file mode 100644 index 0000000..cc6069a --- /dev/null +++ b/08-august/resources/textures/boulderNormal.png diff --git a/08-august/resources/textures/bricks2.png b/08-august/resources/textures/bricks2.png Binary files differnew file mode 100644 index 0000000..cf44650 --- /dev/null +++ b/08-august/resources/textures/bricks2.png diff --git a/08-august/resources/textures/bricks2_normal.png b/08-august/resources/textures/bricks2_normal.png Binary files differnew file mode 100644 index 0000000..72b6a2d --- /dev/null +++ b/08-august/resources/textures/bricks2_normal.png diff --git a/08-august/resources/textures/default_normal_map.png b/08-august/resources/textures/default_normal_map.png Binary files differnew file mode 100644 index 0000000..9dfd3a4 --- /dev/null +++ b/08-august/resources/textures/default_normal_map.png diff --git a/08-august/resources/textures/front.png b/08-august/resources/textures/front.png Binary files differnew file mode 100644 index 0000000..fbff722 --- /dev/null +++ b/08-august/resources/textures/front.png diff --git a/08-august/resources/textures/heightmap.png b/08-august/resources/textures/heightmap.png Binary files differnew file mode 100644 index 0000000..12741e5 --- /dev/null +++ b/08-august/resources/textures/heightmap.png diff --git a/08-august/resources/textures/left.png b/08-august/resources/textures/left.png Binary files differnew file mode 100644 index 0000000..374322a --- /dev/null +++ b/08-august/resources/textures/left.png diff --git a/08-august/resources/textures/normal_map.png b/08-august/resources/textures/normal_map.png Binary files differnew file mode 100644 index 0000000..d96a41c --- /dev/null +++ b/08-august/resources/textures/normal_map.png diff --git a/08-august/resources/textures/right.png b/08-august/resources/textures/right.png Binary files differnew file mode 100644 index 0000000..89fbb5f --- /dev/null +++ b/08-august/resources/textures/right.png diff --git a/08-august/resources/textures/soil1.png b/08-august/resources/textures/soil1.png Binary files differnew file mode 100644 index 0000000..227e96c --- /dev/null +++ b/08-august/resources/textures/soil1.png diff --git a/08-august/resources/textures/soil2.png b/08-august/resources/textures/soil2.png Binary files differnew file mode 100644 index 0000000..5fc40e2 --- /dev/null +++ b/08-august/resources/textures/soil2.png diff --git a/08-august/resources/textures/soil3.png b/08-august/resources/textures/soil3.png Binary files differnew file mode 100644 index 0000000..2c1c431 --- /dev/null +++ b/08-august/resources/textures/soil3.png diff --git a/08-august/resources/textures/soil4.png b/08-august/resources/textures/soil4.png Binary files differnew file mode 100644 index 0000000..8d3a4d3 --- /dev/null +++ b/08-august/resources/textures/soil4.png diff --git a/08-august/resources/textures/stall.png b/08-august/resources/textures/stall.png Binary files differnew file mode 100644 index 0000000..d4d6f6e --- /dev/null +++ b/08-august/resources/textures/stall.png diff --git a/08-august/resources/textures/top.png b/08-august/resources/textures/top.png Binary files differnew file mode 100644 index 0000000..f92e8f7 --- /dev/null +++ b/08-august/resources/textures/top.png 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, + ¤t_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, ¤t_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 Binary files differnew file mode 100644 index 0000000..3fd0158 --- /dev/null +++ b/09-september/resources/textures/back.png diff --git a/09-september/resources/textures/barrel.png b/09-september/resources/textures/barrel.png Binary files differnew file mode 100644 index 0000000..baf502b --- /dev/null +++ b/09-september/resources/textures/barrel.png diff --git a/09-september/resources/textures/blendmap.png b/09-september/resources/textures/blendmap.png Binary files differnew file mode 100644 index 0000000..4789845 --- /dev/null +++ b/09-september/resources/textures/blendmap.png diff --git a/09-september/resources/textures/bottom.png b/09-september/resources/textures/bottom.png Binary files differnew file mode 100644 index 0000000..8f9c0f2 --- /dev/null +++ b/09-september/resources/textures/bottom.png diff --git a/09-september/resources/textures/boulder.png b/09-september/resources/textures/boulder.png Binary files differnew file mode 100755 index 0000000..e2cb9d1 --- /dev/null +++ b/09-september/resources/textures/boulder.png diff --git a/09-september/resources/textures/boulderNormal.png b/09-september/resources/textures/boulderNormal.png Binary files differnew file mode 100755 index 0000000..cc6069a --- /dev/null +++ b/09-september/resources/textures/boulderNormal.png diff --git a/09-september/resources/textures/bricks.png b/09-september/resources/textures/bricks.png Binary files differnew file mode 100644 index 0000000..25e3eeb --- /dev/null +++ b/09-september/resources/textures/bricks.png diff --git a/09-september/resources/textures/bricks2.png b/09-september/resources/textures/bricks2.png Binary files differnew file mode 100644 index 0000000..cf44650 --- /dev/null +++ b/09-september/resources/textures/bricks2.png diff --git a/09-september/resources/textures/bricks2_normal.png b/09-september/resources/textures/bricks2_normal.png Binary files differnew file mode 100644 index 0000000..72b6a2d --- /dev/null +++ b/09-september/resources/textures/bricks2_normal.png diff --git a/09-september/resources/textures/bricks_normal.png b/09-september/resources/textures/bricks_normal.png Binary files differnew file mode 100644 index 0000000..a2ee2b4 --- /dev/null +++ b/09-september/resources/textures/bricks_normal.png diff --git a/09-september/resources/textures/default_normal_map.png b/09-september/resources/textures/default_normal_map.png Binary files differnew file mode 100644 index 0000000..9dfd3a4 --- /dev/null +++ b/09-september/resources/textures/default_normal_map.png diff --git a/09-september/resources/textures/fire.png b/09-september/resources/textures/fire.png Binary files differnew file mode 100755 index 0000000..e2498d9 --- /dev/null +++ b/09-september/resources/textures/fire.png diff --git a/09-september/resources/textures/front.png b/09-september/resources/textures/front.png Binary files differnew file mode 100644 index 0000000..fbff722 --- /dev/null +++ b/09-september/resources/textures/front.png diff --git a/09-september/resources/textures/heightmap.png b/09-september/resources/textures/heightmap.png Binary files differnew file mode 100644 index 0000000..12741e5 --- /dev/null +++ b/09-september/resources/textures/heightmap.png diff --git a/09-september/resources/textures/left.png b/09-september/resources/textures/left.png Binary files differnew file mode 100644 index 0000000..374322a --- /dev/null +++ b/09-september/resources/textures/left.png diff --git a/09-september/resources/textures/normal_map.png b/09-september/resources/textures/normal_map.png Binary files differnew file mode 100644 index 0000000..d96a41c --- /dev/null +++ b/09-september/resources/textures/normal_map.png diff --git a/09-september/resources/textures/particleAtlas.png b/09-september/resources/textures/particleAtlas.png Binary files differnew file mode 100755 index 0000000..c202947 --- /dev/null +++ b/09-september/resources/textures/particleAtlas.png diff --git a/09-september/resources/textures/particleStar.png b/09-september/resources/textures/particleStar.png Binary files differnew file mode 100755 index 0000000..0ce7e6f --- /dev/null +++ b/09-september/resources/textures/particleStar.png diff --git a/09-september/resources/textures/right.png b/09-september/resources/textures/right.png Binary files differnew file mode 100644 index 0000000..89fbb5f --- /dev/null +++ b/09-september/resources/textures/right.png diff --git a/09-september/resources/textures/smoke.png b/09-september/resources/textures/smoke.png Binary files differnew file mode 100755 index 0000000..eef2e19 --- /dev/null +++ b/09-september/resources/textures/smoke.png diff --git a/09-september/resources/textures/soil1.png b/09-september/resources/textures/soil1.png Binary files differnew file mode 100644 index 0000000..227e96c --- /dev/null +++ b/09-september/resources/textures/soil1.png diff --git a/09-september/resources/textures/soil2.png b/09-september/resources/textures/soil2.png Binary files differnew file mode 100644 index 0000000..5fc40e2 --- /dev/null +++ b/09-september/resources/textures/soil2.png diff --git a/09-september/resources/textures/soil3.png b/09-september/resources/textures/soil3.png Binary files differnew file mode 100644 index 0000000..2c1c431 --- /dev/null +++ b/09-september/resources/textures/soil3.png diff --git a/09-september/resources/textures/soil4.png b/09-september/resources/textures/soil4.png Binary files differnew file mode 100644 index 0000000..8d3a4d3 --- /dev/null +++ b/09-september/resources/textures/soil4.png diff --git a/09-september/resources/textures/stall.png b/09-september/resources/textures/stall.png Binary files differnew file mode 100644 index 0000000..d4d6f6e --- /dev/null +++ b/09-september/resources/textures/stall.png diff --git a/09-september/resources/textures/top.png b/09-september/resources/textures/top.png Binary files differnew file mode 100644 index 0000000..f92e8f7 --- /dev/null +++ b/09-september/resources/textures/top.png 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, + ¤t_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", ¤t_texture.x, ¤t_texture.y); + + array_append(textures, ¤t_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", ¤t_normal.x, + ¤t_normal.y, + ¤t_normal.z); + array_append(normals, ¤t_normal); + + if(count != 3) + Util_FatalError("Bad normals data on .obj file"); + } + else + { + count = sscanf(buffer, "v %f %f %f\n", ¤t_position.x, + ¤t_position.y, + ¤t_position.z); + + array_append(positions, ¤t_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, ¤t_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, ¢er, &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")) |
