From 2a02f4eea6986bc3149d66d78a215aea7c958f07 Mon Sep 17 00:00:00 2001 From: YuqinShao Date: Wed, 13 Nov 2013 23:33:35 -0500 Subject: [PATCH 1/7] point light + bloom + new G-buffer slot + toon shading not working --- base/PROJ_WIN/P6/P6/P6.vcxproj | 1 + base/PROJ_WIN/P6/P6/P6.vcxproj.filters | 3 + base/PROJ_WIN/P6/SOIL/freeglut.dll | Bin 0 -> 197120 bytes base/res/cornell/cornell_box.mtl | 19 +- base/res/cornell/cornell_box.obj | 14 +- base/res/quad.obj | 15 + base/res/shaders/ambient.frag | 16 +- base/res/shaders/bloom.frag | 127 + base/res/shaders/diagnostic.frag | 6 +- base/res/shaders/directional.frag | 1 + base/res/shaders/pass.frag | 11 +- base/res/shaders/point.frag | 30 +- base/res/shaders/post.frag | 69 +- base/res/sphere.mtl | 37 + base/res/sphere.obj | 1960 +++++++++ base/res/struct_help.txt | 11 + base/res/teapot.obj | 5049 ++++++++++++++++++++++++ base/src/main.cpp | 170 +- base/src/main.h | 6 +- 19 files changed, 7488 insertions(+), 57 deletions(-) create mode 100644 base/PROJ_WIN/P6/SOIL/freeglut.dll create mode 100644 base/res/quad.obj create mode 100644 base/res/shaders/bloom.frag create mode 100644 base/res/sphere.mtl create mode 100644 base/res/sphere.obj create mode 100644 base/res/struct_help.txt create mode 100644 base/res/teapot.obj diff --git a/base/PROJ_WIN/P6/P6/P6.vcxproj b/base/PROJ_WIN/P6/P6/P6.vcxproj index 61a6915..f8277cf 100644 --- a/base/PROJ_WIN/P6/P6/P6.vcxproj +++ b/base/PROJ_WIN/P6/P6/P6.vcxproj @@ -83,6 +83,7 @@ + diff --git a/base/PROJ_WIN/P6/P6/P6.vcxproj.filters b/base/PROJ_WIN/P6/P6/P6.vcxproj.filters index 8fd6655..3b584ca 100644 --- a/base/PROJ_WIN/P6/P6/P6.vcxproj.filters +++ b/base/PROJ_WIN/P6/P6/P6.vcxproj.filters @@ -67,5 +67,8 @@ Resource Files + + Resource Files + \ No newline at end of file diff --git a/base/PROJ_WIN/P6/SOIL/freeglut.dll b/base/PROJ_WIN/P6/SOIL/freeglut.dll new file mode 100644 index 0000000000000000000000000000000000000000..4ec8893337649be4b2e91c4b5fe937da2578b9ca GIT binary patch literal 197120 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 0.99f) { - out_Color = vec4(vec3(0.0), 1.0); + ambColor = vec4(vec3(0.0), 1.0); } else { float ambient = u_LightIl; float diffuse = max(0.0, dot(normalize(light),normal)); - out_Color = vec4(color*(strength*diffuse + ambient),1.0f); + ambColor = vec4(color*(strength*diffuse + ambient),1.0);// * texture(u_Bloomtex,fs_Texcoord); } + /*if(u_DisplayType == DISPLAY_BLOOM) + { + out_Color = ambColor * (1.0 - color4.a); + } + else*/ + out_Color = ambColor; return; } diff --git a/base/res/shaders/bloom.frag b/base/res/shaders/bloom.frag new file mode 100644 index 0000000..1a9bdbc --- /dev/null +++ b/base/res/shaders/bloom.frag @@ -0,0 +1,127 @@ +#version 330 + +//////////////////////////// +// ENUMERATIONS +//////////////////////////// + +#define DISPLAY_DEPTH 0 +#define DISPLAY_NORMAL 1 +#define DISPLAY_POSITION 2 +#define DISPLAY_COLOR 3 +#define DISPLAY_TOTAL 4 +#define DISPLAY_LIGHTS 5 +#define DISPLAY_BLOOM 6 + +///////////////////////////////////// +// Uniforms, Attributes, and Outputs +//////////////////////////////////// +uniform mat4 u_Persp; + +uniform sampler2D u_Depthtex; +uniform sampler2D u_Normaltex; +uniform sampler2D u_Positiontex; +uniform sampler2D u_Colortex; +uniform sampler2D u_RandomNormaltex; +uniform sampler2D u_RandomScalartex; +uniform sampler2D u_Bloomtex; + +uniform float u_Far; +uniform float u_Near; +uniform int u_OcclusionType; +uniform int u_DisplayType; + +uniform int u_ScreenWidth; +uniform int u_ScreenHeight; + +uniform vec4 u_Light; +uniform float u_LightIl; + +in vec2 fs_Texcoord; + +out vec4 out_Color; +/////////////////////////////////////// + + + + +uniform float zerothresh = 1.0f; +uniform float falloff = 0.1f; + + +///////////////////////////////////// +// UTILITY FUNCTIONS +///////////////////////////////////// + +//Depth used in the Z buffer is not linearly related to distance from camera +//This restores linear depth +float linearizeDepth(float exp_depth, float near, float far) { + return (2 * near) / (far + near - exp_depth * (far - near)); +} + +//Helper function to automatically sample and unpack normals +vec3 sampleNrm(vec2 texcoords) { + return texture(u_Normaltex,texcoords).xyz; +} + +//Helper function to automicatlly sample and unpack positions +vec3 samplePos(vec2 texcoords) { + return texture(u_Positiontex,texcoords).xyz; +} + +//Helper function to automicatlly sample and unpack positions +vec3 sampleCol(vec2 texcoords) { + return texture(u_Colortex,texcoords).xyz; +} + +//Get a random normal vector given a screen-space texture coordinate +//Actually accesses a texture of random vectors +vec3 getRandomNormal(vec2 texcoords) { + ivec2 sz = textureSize(u_RandomNormaltex,0); + return texture(u_RandomNormaltex,vec2(texcoords.s* (u_ScreenWidth)/sz.x, + (texcoords.t)*(u_ScreenHeight)/sz.y)).rgb; +} + + +//Get a random scalar given a screen-space texture coordinate +//Fetches from a random texture +float getRandomScalar(vec2 texcoords) { + ivec2 sz = textureSize(u_RandomScalartex,0); + return texture(u_RandomScalartex,vec2(texcoords.s*u_ScreenWidth/sz.x, + texcoords.t*u_ScreenHeight/sz.y)).r; +} + +float Gaussian1D(float x, float y, float dev) +{ + return (1.0/sqrt(2.0*3.14159 * dev)) * exp(-(x*x)/(2.0*dev)); +} +float Gaussian2D(float x, float y, float dev) +{ + return ( 1.0 / (2.0*3.14159 * dev * dev)) * exp(-((x*x+y*y)/(2.0*dev*dev))); +} + +/////////////////////////////////// +// MAIN +////////////////////////////////// +const float occlusion_strength = 1.5f; +void main() { + vec4 color = texture(u_Bloomtex,fs_Texcoord); + vec4 texColor = vec4(0.0); + vec2 texelSize = vec2(1.0/float(u_ScreenWidth),1.0/float(u_ScreenHeight)); + int blurAmount = 10; + float blurScale = 2.0; + float dev = float(blurAmount) / 6.0; + for(int i = -blurAmount/2; i<=blurAmount/2; ++i) + { + for(int j = -blurAmount/2; j<=blurAmount/2; ++j) + { + //if(i <0 || j<0 || i>= u_ScreenWidth || j >= u_ScreenHeight) + //continue; + texColor += texture(u_Bloomtex,fs_Texcoord + vec2(texelSize.x * i * blurScale , texelSize.y * j* blurScale)) + * Gaussian2D(float(i)*0.4,float(j)*0.4,dev); + + } + } + out_Color = texColor; + return; +} + diff --git a/base/res/shaders/diagnostic.frag b/base/res/shaders/diagnostic.frag index ac73727..7db3bc2 100644 --- a/base/res/shaders/diagnostic.frag +++ b/base/res/shaders/diagnostic.frag @@ -10,7 +10,7 @@ #define DISPLAY_COLOR 3 #define DISPLAY_TOTAL 4 #define DISPLAY_LIGHTS 5 - +#define DISPLAY_BLOOM 6 ///////////////////////////////////// // Uniforms, Attributes, and Outputs @@ -23,6 +23,7 @@ uniform sampler2D u_Positiontex; uniform sampler2D u_Colortex; uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; +uniform sampler2D u_Bloomtex; uniform float u_Far; uniform float u_Near; @@ -101,6 +102,7 @@ void main() { vec3 normal = sampleNrm(fs_Texcoord); vec3 position = samplePos(fs_Texcoord); vec3 color = sampleCol(fs_Texcoord); + vec4 colorbloom = texture(u_Bloomtex,fs_Texcoord); vec3 light = u_Light.xyz; float lightRadius = u_Light.w; @@ -116,7 +118,7 @@ void main() { break; case(DISPLAY_COLOR): out_Color = vec4(color, 1.0); - break; + break; case(DISPLAY_LIGHTS): case(DISPLAY_TOTAL): break; diff --git a/base/res/shaders/directional.frag b/base/res/shaders/directional.frag index a34daab..b521654 100644 --- a/base/res/shaders/directional.frag +++ b/base/res/shaders/directional.frag @@ -23,6 +23,7 @@ uniform sampler2D u_Positiontex; uniform sampler2D u_Colortex; uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; +uniform sampler2D u_Bloomtex; uniform float u_Far; uniform float u_Near; diff --git a/base/res/shaders/pass.frag b/base/res/shaders/pass.frag index e37dcbf..1715f79 100644 --- a/base/res/shaders/pass.frag +++ b/base/res/shaders/pass.frag @@ -3,16 +3,25 @@ uniform float u_Far; uniform vec3 u_Color; +uniform float u_isBloom; + in vec3 fs_Normal; in vec4 fs_Position; out vec4 out_Normal; out vec4 out_Position; out vec4 out_Color; +out vec4 out_BloomMap; void main(void) { out_Normal = vec4(normalize(fs_Normal),0.0f); out_Position = vec4(fs_Position.xyz,1.0f); //Tuck position into 0 1 range - out_Color = vec4(u_Color,1.0); + out_Color = vec4(u_Color,u_isBloom); + if(u_isBloom == 1.0) + { + out_BloomMap = vec4(u_Color,1.0); + } + else + out_BloomMap = vec4(0.0,0.0,0.0,1.0); } diff --git a/base/res/shaders/point.frag b/base/res/shaders/point.frag index 98b90e0..50ef0e0 100644 --- a/base/res/shaders/point.frag +++ b/base/res/shaders/point.frag @@ -23,10 +23,12 @@ uniform sampler2D u_Positiontex; uniform sampler2D u_Colortex; uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; +uniform sampler2D u_Bloomtex; uniform float u_Far; uniform float u_Near; uniform int u_DisplayType; +uniform vec3 u_lightColor; uniform int u_ScreenWidth; uniform int u_ScreenHeight; @@ -102,15 +104,35 @@ void main() { vec3 color = sampleCol(fs_Texcoord); vec3 light = u_Light.xyz; float lightRadius = u_Light.w; - out_Color = vec4(0,0,0,1.0); + vec3 lightVector = light - position; + float dist = length(lightVector); + //vec3 lightColor = vec3(1.0,0.0,1.0); + float Intensity = 2.0; if( u_DisplayType == DISPLAY_LIGHTS ) { - //Put some code here to visualize the fragment associated with this point light + //Put some code here to visualize the fragment associated with this point light + if(dist <= lightRadius) + { + vec3 markColor = vec3(1.0,1.0,1.0)*0.4 + color * 0.6; + out_Color = vec4(markColor,1.0); + } } else - { - //Put some code here to actually compute the light from the point light + { + float diffuse = max(0.0,dot(normalize(lightVector),normal)); + float isInradius = step(0.0,lightRadius - length(lightVector)); + float attenuation = dist/(1-(dist/lightRadius)*(dist/lightRadius)); + attenuation = attenuation / lightRadius + 1; + attenuation = 1.0/(attenuation * attenuation); + vec3 diffuseColor = Intensity * color * diffuse * u_lightColor * attenuation * isInradius; + out_Color = vec4(diffuseColor , 1.0); } return; } +//light attenuation equation got from here +//http://imdoingitwrong.wordpress.com/2011/02/10/improved-light-attenuation/ +// 1/(d/r + 1)^2 +// d is the position distance from light +// r = 1 - (d/lightRadius); + diff --git a/base/res/shaders/post.frag b/base/res/shaders/post.frag index 2bf5afc..0c9cfa1 100644 --- a/base/res/shaders/post.frag +++ b/base/res/shaders/post.frag @@ -10,7 +10,8 @@ #define DISPLAY_COLOR 3 #define DISPLAY_TOTAL 4 #define DISPLAY_LIGHTS 5 - +#define DISPLAY_BLOOM 6 +#define DISPLAY_SIL 7 ///////////////////////////////////// // Uniforms, Attributes, and Outputs @@ -18,9 +19,22 @@ uniform sampler2D u_Posttex; uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; +uniform sampler2D u_Colortex; +uniform sampler2D u_Bloomtex; +uniform sampler2D u_Positiontex; +uniform sampler2D u_Normaltex; + +uniform vec3 u_cameraPos; // eyePos uniform int u_ScreenWidth; uniform int u_ScreenHeight; +uniform int u_DisplayType; + +uniform float u_texelSizeX; +uniform float u_texelSizeY; +uniform int u_blurAmount; +uniform float u_blurScale; +uniform float u_blurStrength; in vec2 fs_Texcoord; @@ -60,15 +74,66 @@ float getRandomScalar(vec2 texcoords) { texcoords.t*u_ScreenHeight/sz.y)).r; } +float Gaussian1D(float x, float y, float dev) +{ + return (1.0/sqrt(2.0*3.14159 * dev)) * exp(-(x*x)/(2.0*dev)); +} +float Gaussian2D(float x, float y, float dev) +{ + return ( 1.0 / (2.0*3.14159 * dev * dev)) * exp(-((x*x+y*y)/(2.0*dev*dev))); +} + +//Helper function to automicatlly sample and unpack positions +vec3 samplePos(vec2 texcoords) { + return texture(u_Positiontex,texcoords).xyz; +} +//Helper function to automatically sample and unpack normals +vec3 sampleNrm(vec2 texcoords) { + return texture(u_Normaltex,texcoords).xyz; +} + /////////////////////////////////// // MAIN ////////////////////////////////// const float occlusion_strength = 1.5f; void main() { + vec3 normal = sampleNrm(fs_Texcoord); + vec3 position = samplePos(fs_Texcoord); vec3 color = sampleCol(fs_Texcoord); float gray = dot(color, vec3(0.2125, 0.7154, 0.0721)); float vin = min(2*distance(vec2(0.5), fs_Texcoord), 1.0); - out_Color = vec4(mix(pow(color,vec3(1.0/1.8)),vec3(gray),vin), 1.0); + vec4 otherColor = vec4(mix(pow(color,vec3(1.0/1.8)),vec3(gray),vin), 1.0); + vec4 glowColor = vec4(0.0); + if(u_DisplayType == DISPLAY_BLOOM) + { + + float dev = float(u_blurAmount) * 0.3; + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) + { + for(int j = -u_blurAmount/2; j<=u_blurAmount/2; ++j) + { + glowColor += texture(u_Bloomtex,fs_Texcoord + vec2(u_texelSizeX * i * u_blurScale , u_texelSizeY * j* u_blurScale)) + * Gaussian2D(float(i)*u_blurStrength,float(j)*u_blurStrength,dev); + + } + } + out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + return; + } + else if(u_DisplayType == DISPLAY_SIL) + { + vec3 color1 =vec3(0.0,0.0,0.0); + vec3 eyeVector = vec3(0.0,0.0,5.0) - position; + eyeVector = normalize(eyeVector); + float sil = max(dot(normal,eyeVector), 0.0); + if (sil < 0.1) + out_Color = vec4(color1,1.0); + else + out_Color = otherColor; + return; + + } + out_Color = otherColor; return; } diff --git a/base/res/sphere.mtl b/base/res/sphere.mtl new file mode 100644 index 0000000..c9762e5 --- /dev/null +++ b/base/res/sphere.mtl @@ -0,0 +1,37 @@ +# Blender MTL File: '' +# Material Count: 0 + +newmtl white +Ka 0 0 0 +Kd 0.9 0.9 0.9 +Ks 0 0 0 + +newmtl red +Ka 0 0 0 +Kd 1 0 0 +Ks 0 0 0 + +newmtl green +Ka 0 0 0 +Kd 0 1 0 +Ks 0 0 0 + +newmtl blue +Ka 0 0 0 +Kd 0 0 1 +Ks 0 0 0 + +newmtl yellow +Ka 0 0 0 +Kd 1 1 0 +Ks 0 0 0 + +newmtl lightblue +Ka 0 0 0 +Kd 0 1 1 +ks 0 0 0 + +newmtl light +Ka 20 20 20 +Kd 1 1 1 +Ks 0 0 0 diff --git a/base/res/sphere.obj b/base/res/sphere.obj new file mode 100644 index 0000000..28c9612 --- /dev/null +++ b/base/res/sphere.obj @@ -0,0 +1,1960 @@ +# Blender v2.57 (sub 0) OBJ File: '' +# www.blender.org +mtllib sphere.mtl +o Sphere +v 0.000000 1.000000 -0.000000 +v 0.191341 -0.980785 -0.038060 +v 0.375330 -0.923880 -0.074658 +v 0.544895 -0.831470 -0.108386 +v 0.693520 -0.707107 -0.137950 +v 0.815493 -0.555570 -0.162212 +v 0.906127 -0.382683 -0.180240 +v 0.961940 -0.195090 -0.191342 +v 0.980785 0.000000 -0.195090 +v 0.961940 0.195090 -0.191342 +v 0.906127 0.382683 -0.180240 +v 0.815493 0.555570 -0.162212 +v 0.693520 0.707107 -0.137950 +v 0.544895 0.831470 -0.108386 +v 0.375330 0.923880 -0.074658 +v 0.191342 0.980785 -0.038060 +v 0.180240 0.980785 -0.074658 +v 0.353553 0.923880 -0.146447 +v 0.513280 0.831470 -0.212608 +v 0.653282 0.707107 -0.270598 +v 0.768178 0.555570 -0.318190 +v 0.853553 0.382683 -0.353553 +v 0.906127 0.195090 -0.375330 +v 0.923879 0.000000 -0.382683 +v 0.906127 -0.195090 -0.375330 +v 0.853553 -0.382683 -0.353553 +v 0.768178 -0.555570 -0.318190 +v 0.653281 -0.707107 -0.270598 +v 0.513280 -0.831470 -0.212607 +v 0.353553 -0.923880 -0.146447 +v 0.180240 -0.980785 -0.074658 +v -0.000000 -1.000000 0.000000 +v 0.162211 -0.980785 -0.108386 +v 0.318190 -0.923880 -0.212607 +v 0.461940 -0.831470 -0.308658 +v 0.587938 -0.707107 -0.392847 +v 0.691342 -0.555570 -0.461940 +v 0.768178 -0.382683 -0.513280 +v 0.815493 -0.195090 -0.544895 +v 0.831469 0.000000 -0.555570 +v 0.815493 0.195090 -0.544895 +v 0.768178 0.382683 -0.513280 +v 0.691342 0.555570 -0.461940 +v 0.587938 0.707107 -0.392848 +v 0.461940 0.831470 -0.308658 +v 0.318190 0.923880 -0.212608 +v 0.162212 0.980785 -0.108386 +v 0.137950 0.980785 -0.137950 +v 0.270598 0.923880 -0.270598 +v 0.392847 0.831470 -0.392847 +v 0.500000 0.707107 -0.500000 +v 0.587938 0.555570 -0.587938 +v 0.653281 0.382683 -0.653281 +v 0.693520 0.195090 -0.693520 +v 0.707107 0.000000 -0.707107 +v 0.693520 -0.195090 -0.693520 +v 0.653281 -0.382683 -0.653281 +v 0.587938 -0.555570 -0.587938 +v 0.500000 -0.707107 -0.500000 +v 0.392847 -0.831470 -0.392847 +v 0.270598 -0.923880 -0.270598 +v 0.137949 -0.980785 -0.137949 +v 0.108386 -0.980785 -0.162211 +v 0.212607 -0.923880 -0.318189 +v 0.308658 -0.831470 -0.461940 +v 0.392847 -0.707107 -0.587938 +v 0.461940 -0.555570 -0.691342 +v 0.513280 -0.382683 -0.768178 +v 0.544895 -0.195090 -0.815493 +v 0.555570 0.000000 -0.831470 +v 0.544895 0.195090 -0.815493 +v 0.513280 0.382683 -0.768178 +v 0.461940 0.555570 -0.691342 +v 0.392847 0.707107 -0.587938 +v 0.308658 0.831470 -0.461940 +v 0.212608 0.923880 -0.318190 +v 0.108386 0.980785 -0.162212 +v 0.074658 0.980785 -0.180240 +v 0.146447 0.923880 -0.353553 +v 0.212607 0.831470 -0.513280 +v 0.270598 0.707107 -0.653282 +v 0.318190 0.555570 -0.768178 +v 0.353553 0.382683 -0.853553 +v 0.375330 0.195090 -0.906127 +v 0.382683 0.000000 -0.923879 +v 0.375330 -0.195090 -0.906127 +v 0.353553 -0.382683 -0.853553 +v 0.318190 -0.555570 -0.768178 +v 0.270598 -0.707107 -0.653281 +v 0.212607 -0.831470 -0.513280 +v 0.146447 -0.923880 -0.353553 +v 0.074658 -0.980785 -0.180240 +v 0.038060 -0.980785 -0.191341 +v 0.074658 -0.923880 -0.375330 +v 0.108386 -0.831470 -0.544895 +v 0.137950 -0.707107 -0.693520 +v 0.162212 -0.555570 -0.815493 +v 0.180240 -0.382683 -0.906127 +v 0.191342 -0.195090 -0.961940 +v 0.195090 0.000000 -0.980785 +v 0.191342 0.195090 -0.961940 +v 0.180240 0.382683 -0.906127 +v 0.162212 0.555570 -0.815493 +v 0.137950 0.707107 -0.693520 +v 0.108386 0.831470 -0.544895 +v 0.074658 0.923880 -0.375330 +v 0.038060 0.980785 -0.191342 +v -0.000000 0.980785 -0.195090 +v -0.000000 0.923880 -0.382683 +v -0.000000 0.831470 -0.555570 +v 0.000000 0.707107 -0.707107 +v -0.000000 0.555570 -0.831469 +v -0.000000 0.382683 -0.923879 +v -0.000000 0.195090 -0.980785 +v -0.000000 0.000000 -1.000000 +v -0.000000 -0.195090 -0.980785 +v -0.000000 -0.382683 -0.923879 +v -0.000000 -0.555570 -0.831469 +v 0.000000 -0.707107 -0.707107 +v -0.000000 -0.831470 -0.555570 +v -0.000000 -0.923880 -0.382683 +v -0.000000 -0.980785 -0.195090 +v -0.038060 -0.980785 -0.191341 +v -0.074658 -0.923880 -0.375330 +v -0.108386 -0.831470 -0.544895 +v -0.137950 -0.707107 -0.693520 +v -0.162212 -0.555570 -0.815493 +v -0.180240 -0.382683 -0.906127 +v -0.191342 -0.195090 -0.961940 +v -0.195090 0.000000 -0.980785 +v -0.191342 0.195090 -0.961940 +v -0.180240 0.382683 -0.906127 +v -0.162212 0.555570 -0.815493 +v -0.137950 0.707107 -0.693520 +v -0.108386 0.831470 -0.544895 +v -0.074658 0.923880 -0.375330 +v -0.038060 0.980785 -0.191342 +v -0.074658 0.980785 -0.180240 +v -0.146447 0.923880 -0.353553 +v -0.212608 0.831470 -0.513280 +v -0.270598 0.707107 -0.653281 +v -0.318190 0.555570 -0.768178 +v -0.353553 0.382683 -0.853553 +v -0.375330 0.195090 -0.906127 +v -0.382683 0.000000 -0.923879 +v -0.375330 -0.195090 -0.906127 +v -0.353553 -0.382683 -0.853553 +v -0.318190 -0.555570 -0.768178 +v -0.270598 -0.707107 -0.653281 +v -0.212607 -0.831470 -0.513280 +v -0.146447 -0.923880 -0.353553 +v -0.074658 -0.980785 -0.180240 +v -0.108386 -0.980785 -0.162211 +v -0.212607 -0.923880 -0.318189 +v -0.308658 -0.831470 -0.461940 +v -0.392847 -0.707107 -0.587938 +v -0.461940 -0.555570 -0.691342 +v -0.513280 -0.382683 -0.768178 +v -0.544895 -0.195090 -0.815493 +v -0.555570 0.000000 -0.831469 +v -0.544895 0.195090 -0.815493 +v -0.513280 0.382683 -0.768178 +v -0.461940 0.555570 -0.691341 +v -0.392847 0.707107 -0.587938 +v -0.308658 0.831470 -0.461940 +v -0.212608 0.923880 -0.318190 +v -0.108386 0.980785 -0.162212 +v -0.137950 0.980785 -0.137950 +v -0.270598 0.923880 -0.270598 +v -0.392847 0.831470 -0.392847 +v -0.500000 0.707107 -0.500000 +v -0.587938 0.555570 -0.587938 +v -0.653281 0.382683 -0.653281 +v -0.693520 0.195090 -0.693520 +v -0.707107 0.000000 -0.707106 +v -0.693520 -0.195090 -0.693520 +v -0.653281 -0.382683 -0.653281 +v -0.587938 -0.555570 -0.587938 +v -0.500000 -0.707107 -0.500000 +v -0.392847 -0.831470 -0.392847 +v -0.270598 -0.923880 -0.270598 +v -0.137949 -0.980785 -0.137949 +v -0.162211 -0.980785 -0.108386 +v -0.318189 -0.923880 -0.212607 +v -0.461940 -0.831470 -0.308658 +v -0.587938 -0.707107 -0.392847 +v -0.691342 -0.555570 -0.461940 +v -0.768178 -0.382683 -0.513280 +v -0.815493 -0.195090 -0.544895 +v -0.831469 0.000000 -0.555570 +v -0.815493 0.195090 -0.544895 +v -0.768178 0.382683 -0.513280 +v -0.691342 0.555570 -0.461940 +v -0.587938 0.707107 -0.392847 +v -0.461940 0.831470 -0.308658 +v -0.318190 0.923880 -0.212607 +v -0.162212 0.980785 -0.108386 +v -0.180240 0.980785 -0.074658 +v -0.353553 0.923880 -0.146447 +v -0.513280 0.831470 -0.212607 +v -0.653281 0.707107 -0.270598 +v -0.768178 0.555570 -0.318189 +v -0.853553 0.382683 -0.353553 +v -0.906127 0.195090 -0.375330 +v -0.923879 0.000000 -0.382683 +v -0.906127 -0.195090 -0.375330 +v -0.853553 -0.382683 -0.353553 +v -0.768178 -0.555570 -0.318189 +v -0.653281 -0.707107 -0.270598 +v -0.513280 -0.831470 -0.212607 +v -0.353553 -0.923880 -0.146446 +v -0.180240 -0.980785 -0.074658 +v -0.191341 -0.980785 -0.038060 +v -0.375330 -0.923880 -0.074658 +v -0.544895 -0.831470 -0.108386 +v -0.693520 -0.707107 -0.137950 +v -0.815493 -0.555570 -0.162212 +v -0.906127 -0.382683 -0.180240 +v -0.961939 -0.195090 -0.191342 +v -0.980785 0.000000 -0.195090 +v -0.961939 0.195090 -0.191342 +v -0.906127 0.382683 -0.180240 +v -0.815493 0.555570 -0.162212 +v -0.693520 0.707107 -0.137950 +v -0.544895 0.831470 -0.108386 +v -0.375330 0.923880 -0.074658 +v -0.191342 0.980785 -0.038060 +v -0.195090 0.980785 -0.000000 +v -0.382683 0.923880 0.000000 +v -0.555570 0.831470 0.000000 +v -0.707107 0.707107 -0.000000 +v -0.831469 0.555570 0.000000 +v -0.923879 0.382683 0.000000 +v -0.980785 0.195090 0.000000 +v -0.999999 0.000000 0.000000 +v -0.980785 -0.195090 0.000000 +v -0.923879 -0.382683 0.000000 +v -0.831469 -0.555570 0.000000 +v -0.707107 -0.707107 0.000000 +v -0.555570 -0.831470 0.000000 +v -0.382683 -0.923880 0.000000 +v -0.195090 -0.980785 0.000000 +v -0.191341 -0.980785 0.038060 +v -0.375330 -0.923880 0.074658 +v -0.544895 -0.831470 0.108386 +v -0.693520 -0.707107 0.137950 +v -0.815493 -0.555570 0.162212 +v -0.906127 -0.382683 0.180240 +v -0.961939 -0.195090 0.191342 +v -0.980785 0.000000 0.195091 +v -0.961939 0.195090 0.191342 +v -0.906127 0.382683 0.180240 +v -0.815493 0.555570 0.162212 +v -0.693520 0.707107 0.137950 +v -0.544895 0.831470 0.108386 +v -0.375330 0.923880 0.074658 +v -0.191342 0.980785 0.038060 +v -0.180240 0.980785 0.074658 +v -0.353553 0.923880 0.146447 +v -0.513280 0.831470 0.212607 +v -0.653281 0.707107 0.270598 +v -0.768177 0.555570 0.318190 +v -0.853553 0.382683 0.353553 +v -0.906127 0.195090 0.375330 +v -0.923879 0.000000 0.382683 +v -0.906127 -0.195090 0.375330 +v -0.853553 -0.382683 0.353553 +v -0.768177 -0.555570 0.318190 +v -0.653281 -0.707107 0.270598 +v -0.513280 -0.831470 0.212608 +v -0.353553 -0.923880 0.146447 +v -0.180240 -0.980785 0.074658 +v -0.162211 -0.980785 0.108386 +v -0.318189 -0.923880 0.212607 +v -0.461939 -0.831470 0.308658 +v -0.587938 -0.707107 0.392847 +v -0.691341 -0.555570 0.461940 +v -0.768178 -0.382683 0.513280 +v -0.815493 -0.195090 0.544895 +v -0.831469 0.000000 0.555570 +v -0.815493 0.195090 0.544895 +v -0.768178 0.382683 0.513280 +v -0.691341 0.555570 0.461940 +v -0.587938 0.707107 0.392847 +v -0.461939 0.831470 0.308658 +v -0.318190 0.923880 0.212607 +v -0.162212 0.980785 0.108386 +v -0.137950 0.980785 0.137950 +v -0.270598 0.923880 0.270598 +v -0.392847 0.831470 0.392847 +v -0.500000 0.707107 0.500000 +v -0.587937 0.555570 0.587938 +v -0.653281 0.382683 0.653281 +v -0.693520 0.195090 0.693520 +v -0.707106 0.000000 0.707106 +v -0.693520 -0.195090 0.693520 +v -0.653281 -0.382683 0.653281 +v -0.587937 -0.555570 0.587938 +v -0.500000 -0.707107 0.500000 +v -0.392847 -0.831470 0.392847 +v -0.270598 -0.923880 0.270598 +v -0.137949 -0.980785 0.137950 +v -0.108386 -0.980785 0.162211 +v -0.212607 -0.923880 0.318189 +v -0.308658 -0.831470 0.461940 +v -0.392847 -0.707107 0.587938 +v -0.461939 -0.555570 0.691341 +v -0.513280 -0.382683 0.768178 +v -0.544895 -0.195090 0.815493 +v -0.555569 0.000000 0.831469 +v -0.544895 0.195090 0.815493 +v -0.513280 0.382683 0.768178 +v -0.461939 0.555570 0.691341 +v -0.392847 0.707107 0.587938 +v -0.308658 0.831470 0.461939 +v -0.212607 0.923880 0.318190 +v -0.108386 0.980785 0.162212 +v -0.074658 0.980785 0.180240 +v -0.146447 0.923880 0.353553 +v -0.212607 0.831470 0.513280 +v -0.270598 0.707107 0.653281 +v -0.318189 0.555570 0.768177 +v -0.353553 0.382683 0.853553 +v -0.375330 0.195090 0.906127 +v -0.382683 0.000000 0.923879 +v -0.375330 -0.195090 0.906127 +v -0.353553 -0.382683 0.853553 +v -0.318189 -0.555570 0.768177 +v -0.270598 -0.707107 0.653281 +v -0.212607 -0.831470 0.513280 +v -0.146446 -0.923880 0.353553 +v -0.074658 -0.980785 0.180240 +v -0.038060 -0.980785 0.191341 +v -0.074658 -0.923880 0.375330 +v -0.108386 -0.831470 0.544895 +v -0.137950 -0.707107 0.693520 +v -0.162211 -0.555570 0.815493 +v -0.180240 -0.382683 0.906127 +v -0.191341 -0.195090 0.961939 +v -0.195090 0.000000 0.980784 +v -0.191341 0.195090 0.961939 +v -0.180240 0.382683 0.906127 +v -0.162211 0.555570 0.815493 +v -0.137950 0.707107 0.693520 +v -0.108386 0.831470 0.544895 +v -0.074658 0.923880 0.375330 +v -0.038060 0.980785 0.191342 +v 0.000000 0.980785 0.195090 +v 0.000000 0.923880 0.382683 +v 0.000000 0.831470 0.555570 +v 0.000000 0.707107 0.707107 +v 0.000000 0.555570 0.831469 +v 0.000000 0.382683 0.923879 +v 0.000000 0.195090 0.980785 +v 0.000000 0.000000 0.999999 +v 0.000000 -0.195090 0.980785 +v 0.000000 -0.382683 0.923879 +v 0.000000 -0.555570 0.831469 +v 0.000000 -0.707107 0.707107 +v 0.000000 -0.831470 0.555570 +v 0.000000 -0.923880 0.382683 +v 0.000000 -0.980785 0.195090 +v 0.038060 -0.980785 0.191341 +v 0.074658 -0.923880 0.375330 +v 0.108386 -0.831470 0.544895 +v 0.137950 -0.707107 0.693520 +v 0.162212 -0.555570 0.815493 +v 0.180240 -0.382683 0.906127 +v 0.191342 -0.195090 0.961939 +v 0.195091 0.000000 0.980784 +v 0.191342 0.195090 0.961939 +v 0.180240 0.382683 0.906127 +v 0.162212 0.555570 0.815493 +v 0.137950 0.707107 0.693520 +v 0.108386 0.831470 0.544895 +v 0.074658 0.923880 0.375330 +v 0.038060 0.980785 0.191341 +v 0.074658 0.980785 0.180240 +v 0.146447 0.923880 0.353553 +v 0.212607 0.831470 0.513279 +v 0.270598 0.707107 0.653281 +v 0.318190 0.555570 0.768177 +v 0.353553 0.382683 0.853553 +v 0.375330 0.195090 0.906127 +v 0.382683 0.000000 0.923878 +v 0.375330 -0.195090 0.906127 +v 0.353553 -0.382683 0.853553 +v 0.318190 -0.555570 0.768177 +v 0.270598 -0.707107 0.653281 +v 0.212607 -0.831470 0.513280 +v 0.146447 -0.923880 0.353553 +v 0.074658 -0.980785 0.180240 +v 0.108386 -0.980785 0.162211 +v 0.212607 -0.923880 0.318189 +v 0.308658 -0.831470 0.461939 +v 0.392847 -0.707107 0.587938 +v 0.461940 -0.555570 0.691341 +v 0.513280 -0.382683 0.768177 +v 0.544895 -0.195090 0.815493 +v 0.555570 0.000000 0.831468 +v 0.544895 0.195090 0.815493 +v 0.513280 0.382683 0.768177 +v 0.461940 0.555570 0.691341 +v 0.392847 0.707107 0.587938 +v 0.308658 0.831470 0.461939 +v 0.212607 0.923880 0.318189 +v 0.108386 0.980785 0.162211 +v 0.137950 0.980785 0.137949 +v 0.270598 0.923880 0.270598 +v 0.392847 0.831470 0.392847 +v 0.500000 0.707107 0.500000 +v 0.587938 0.555570 0.587937 +v 0.653281 0.382683 0.653281 +v 0.693520 0.195090 0.693519 +v 0.707106 0.000000 0.707106 +v 0.693520 -0.195090 0.693519 +v 0.653281 -0.382683 0.653281 +v 0.587938 -0.555570 0.587937 +v 0.500000 -0.707107 0.500000 +v 0.392847 -0.831470 0.392847 +v 0.270598 -0.923880 0.270598 +v 0.137949 -0.980785 0.137949 +v 0.162211 -0.980785 0.108386 +v 0.318189 -0.923880 0.212607 +v 0.461939 -0.831470 0.308658 +v 0.587938 -0.707107 0.392847 +v 0.691341 -0.555570 0.461939 +v 0.768178 -0.382683 0.513280 +v 0.815493 -0.195090 0.544895 +v 0.831469 0.000000 0.555569 +v 0.815493 0.195090 0.544895 +v 0.768178 0.382683 0.513280 +v 0.691341 0.555570 0.461939 +v 0.587938 0.707107 0.392847 +v 0.461939 0.831470 0.308658 +v 0.318190 0.923880 0.212607 +v 0.162212 0.980785 0.108386 +v 0.180240 0.980785 0.074658 +v 0.353553 0.923880 0.146446 +v 0.513279 0.831470 0.212607 +v 0.653281 0.707107 0.270598 +v 0.768177 0.555570 0.318189 +v 0.853553 0.382683 0.353553 +v 0.906127 0.195090 0.375330 +v 0.923879 0.000000 0.382683 +v 0.906127 -0.195090 0.375330 +v 0.853553 -0.382683 0.353553 +v 0.768177 -0.555570 0.318189 +v 0.653281 -0.707107 0.270598 +v 0.513280 -0.831470 0.212607 +v 0.353553 -0.923880 0.146447 +v 0.180240 -0.980785 0.074658 +v 0.191341 -0.980785 0.038060 +v 0.375330 -0.923880 0.074658 +v 0.544895 -0.831470 0.108386 +v 0.693520 -0.707107 0.137950 +v 0.815493 -0.555570 0.162211 +v 0.906127 -0.382683 0.180240 +v 0.961939 -0.195090 0.191341 +v 0.980784 0.000000 0.195090 +v 0.961939 0.195090 0.191341 +v 0.906127 0.382683 0.180240 +v 0.815493 0.555570 0.162211 +v 0.693520 0.707107 0.137950 +v 0.544895 0.831470 0.108386 +v 0.375330 0.923880 0.074658 +v 0.191342 0.980785 0.038060 +v 0.195090 0.980785 -0.000000 +v 0.382683 0.923880 -0.000000 +v 0.555570 0.831470 -0.000000 +v 0.707107 0.707107 -0.000000 +v 0.831469 0.555570 -0.000000 +v 0.923879 0.382683 -0.000000 +v 0.980785 0.195090 -0.000000 +v 0.999999 0.000000 -0.000000 +v 0.980785 -0.195090 -0.000000 +v 0.923879 -0.382683 -0.000000 +v 0.831469 -0.555570 -0.000000 +v 0.707107 -0.707107 -0.000000 +v 0.555570 -0.831470 -0.000000 +v 0.382683 -0.923880 -0.000000 +v 0.195090 -0.980785 0.000000 +vn 0.098012 -0.995138 -0.009653 +vn 0.290166 -0.956550 -0.028578 +vn 0.470890 -0.880972 -0.046377 +vn 0.633158 -0.771506 -0.062359 +vn 0.770781 -0.632562 -0.075914 +vn 0.878613 -0.469629 -0.086534 +vn 0.952718 -0.289003 -0.093832 +vn 0.990439 -0.097548 -0.097545 +vn 0.990439 0.097548 -0.097546 +vn 0.952718 0.289003 -0.093832 +vn 0.878613 0.469629 -0.086533 +vn 0.770781 0.632562 -0.075913 +vn 0.633158 0.771506 -0.062358 +vn 0.470890 0.880972 -0.046376 +vn 0.290166 0.956550 -0.028578 +vn 0.098013 0.995138 -0.009653 +vn 0.094246 0.995138 -0.028589 +vn 0.279015 0.956550 -0.084638 +vn 0.452794 0.880972 -0.137354 +vn 0.608826 0.771506 -0.184686 +vn 0.741159 0.632562 -0.224828 +vn 0.844848 0.469629 -0.256282 +vn 0.916106 0.289004 -0.277898 +vn 0.952376 0.097550 -0.288900 +vn 0.952376 -0.097550 -0.288900 +vn 0.916106 -0.289004 -0.277898 +vn 0.844848 -0.469629 -0.256282 +vn 0.741159 -0.632562 -0.224828 +vn 0.608827 -0.771506 -0.184686 +vn 0.452793 -0.880972 -0.137353 +vn 0.279015 -0.956549 -0.084638 +vn 0.094246 -0.995138 -0.028589 +vn 0.086857 -0.995138 -0.046426 +vn 0.257142 -0.956549 -0.137445 +vn 0.417297 -0.880972 -0.223050 +vn 0.561098 -0.771506 -0.299913 +vn 0.683057 -0.632562 -0.365101 +vn 0.778616 -0.469629 -0.416179 +vn 0.844288 -0.289004 -0.451281 +vn 0.877715 -0.097549 -0.469149 +vn 0.877715 0.097549 -0.469149 +vn 0.844288 0.289004 -0.451281 +vn 0.778616 0.469629 -0.416179 +vn 0.683057 0.632562 -0.365101 +vn 0.561098 0.771506 -0.299913 +vn 0.417297 0.880972 -0.223050 +vn 0.257142 0.956550 -0.137445 +vn 0.086858 0.995138 -0.046426 +vn 0.076131 0.995138 -0.062479 +vn 0.225386 0.956550 -0.184970 +vn 0.365764 0.880972 -0.300175 +vn 0.491806 0.771506 -0.403615 +vn 0.598704 0.632562 -0.491344 +vn 0.682463 0.469629 -0.560083 +vn 0.740024 0.289004 -0.607323 +vn 0.769324 0.097549 -0.631368 +vn 0.769324 -0.097549 -0.631368 +vn 0.740024 -0.289004 -0.607323 +vn 0.682463 -0.469629 -0.560083 +vn 0.598704 -0.632562 -0.491344 +vn 0.491806 -0.771506 -0.403615 +vn 0.365764 -0.880972 -0.300175 +vn 0.225387 -0.956549 -0.184970 +vn 0.076131 -0.995138 -0.062479 +vn 0.062479 -0.995138 -0.076131 +vn 0.184970 -0.956549 -0.225387 +vn 0.300175 -0.880972 -0.365764 +vn 0.403615 -0.771506 -0.491806 +vn 0.491344 -0.632562 -0.598704 +vn 0.560083 -0.469628 -0.682463 +vn 0.607322 -0.289004 -0.740025 +vn 0.631367 -0.097549 -0.769324 +vn 0.631367 0.097549 -0.769324 +vn 0.607322 0.289004 -0.740025 +vn 0.560083 0.469629 -0.682463 +vn 0.491344 0.632562 -0.598704 +vn 0.403615 0.771506 -0.491806 +vn 0.300175 0.880972 -0.365764 +vn 0.184970 0.956549 -0.225386 +vn 0.062479 0.995138 -0.076131 +vn 0.046426 0.995138 -0.086858 +vn 0.137445 0.956550 -0.257142 +vn 0.223050 0.880972 -0.417297 +vn 0.299913 0.771506 -0.561098 +vn 0.365101 0.632562 -0.683057 +vn 0.416179 0.469629 -0.778616 +vn 0.451281 0.289004 -0.844288 +vn 0.469148 0.097549 -0.877715 +vn 0.469148 -0.097549 -0.877715 +vn 0.451281 -0.289004 -0.844288 +vn 0.416179 -0.469628 -0.778617 +vn 0.365101 -0.632562 -0.683056 +vn 0.299913 -0.771506 -0.561098 +vn 0.223050 -0.880972 -0.417297 +vn 0.137445 -0.956550 -0.257142 +vn 0.046426 -0.995138 -0.086857 +vn 0.028589 -0.995138 -0.094246 +vn 0.084638 -0.956549 -0.279015 +vn 0.137353 -0.880972 -0.452794 +vn 0.184686 -0.771506 -0.608826 +vn 0.224828 -0.632562 -0.741159 +vn 0.256282 -0.469628 -0.844848 +vn 0.277898 -0.289003 -0.916106 +vn 0.288900 -0.097549 -0.952377 +vn 0.288900 0.097549 -0.952376 +vn 0.277898 0.289004 -0.916106 +vn 0.256282 0.469629 -0.844848 +vn 0.224828 0.632562 -0.741160 +vn 0.184685 0.771506 -0.608827 +vn 0.137353 0.880972 -0.452794 +vn 0.084638 0.956550 -0.279015 +vn 0.028589 0.995138 -0.094246 +vn 0.009653 0.995138 -0.098013 +vn 0.028579 0.956550 -0.290166 +vn 0.046378 0.880972 -0.470890 +vn 0.062360 0.771506 -0.633159 +vn 0.075915 0.632562 -0.770780 +vn 0.086536 0.469629 -0.878613 +vn 0.093834 0.289004 -0.952718 +vn 0.097549 0.097549 -0.990438 +vn 0.097549 -0.097549 -0.990438 +vn 0.093834 -0.289004 -0.952718 +vn 0.086536 -0.469628 -0.878613 +vn 0.075915 -0.632562 -0.770780 +vn 0.062360 -0.771506 -0.633158 +vn 0.046378 -0.880972 -0.470890 +vn 0.028579 -0.956549 -0.290166 +vn 0.009653 -0.995138 -0.098012 +vn -0.009653 -0.995138 -0.098012 +vn -0.028579 -0.956549 -0.290166 +vn -0.046379 -0.880972 -0.470890 +vn -0.062361 -0.771506 -0.633158 +vn -0.075915 -0.632562 -0.770780 +vn -0.086536 -0.469628 -0.878613 +vn -0.093835 -0.289004 -0.952718 +vn -0.097550 -0.097549 -0.990438 +vn -0.097550 0.097549 -0.990438 +vn -0.093835 0.289004 -0.952718 +vn -0.086536 0.469629 -0.878613 +vn -0.075915 0.632562 -0.770780 +vn -0.062361 0.771506 -0.633159 +vn -0.046379 0.880972 -0.470890 +vn -0.028579 0.956550 -0.290166 +vn -0.009653 0.995138 -0.098013 +vn -0.028589 0.995138 -0.094246 +vn -0.084638 0.956550 -0.279015 +vn -0.137354 0.880972 -0.452794 +vn -0.184686 0.771506 -0.608827 +vn -0.224828 0.632562 -0.741160 +vn -0.256282 0.469629 -0.844848 +vn -0.277898 0.289004 -0.916106 +vn -0.288900 0.097549 -0.952376 +vn -0.288901 -0.097549 -0.952376 +vn -0.277898 -0.289004 -0.916106 +vn -0.256282 -0.469628 -0.844848 +vn -0.224828 -0.632562 -0.741159 +vn -0.184686 -0.771506 -0.608826 +vn -0.137353 -0.880972 -0.452794 +vn -0.084638 -0.956549 -0.279015 +vn -0.028589 -0.995138 -0.094246 +vn -0.046426 -0.995138 -0.086857 +vn -0.137445 -0.956549 -0.257142 +vn -0.223050 -0.880972 -0.417297 +vn -0.299913 -0.771506 -0.561098 +vn -0.365101 -0.632562 -0.683056 +vn -0.416180 -0.469628 -0.778617 +vn -0.451282 -0.289004 -0.844288 +vn -0.469149 -0.097549 -0.877715 +vn -0.469149 0.097549 -0.877715 +vn -0.451282 0.289004 -0.844288 +vn -0.416179 0.469629 -0.778616 +vn -0.365102 0.632562 -0.683057 +vn -0.299913 0.771506 -0.561098 +vn -0.223050 0.880972 -0.417297 +vn -0.137445 0.956550 -0.257142 +vn -0.046427 0.995138 -0.086858 +vn -0.062480 0.995138 -0.076131 +vn -0.184970 0.956550 -0.225386 +vn -0.300175 0.880972 -0.365764 +vn -0.403615 0.771506 -0.491806 +vn -0.491344 0.632562 -0.598704 +vn -0.560083 0.469629 -0.682463 +vn -0.607322 0.289004 -0.740025 +vn -0.631368 0.097548 -0.769324 +vn -0.631368 -0.097548 -0.769324 +vn -0.607322 -0.289004 -0.740025 +vn -0.560083 -0.469628 -0.682463 +vn -0.491344 -0.632562 -0.598704 +vn -0.403615 -0.771506 -0.491806 +vn -0.300175 -0.880972 -0.365764 +vn -0.184970 -0.956549 -0.225387 +vn -0.062479 -0.995138 -0.076131 +vn -0.076131 -0.995138 -0.062479 +vn -0.225387 -0.956549 -0.184970 +vn -0.365764 -0.880972 -0.300175 +vn -0.491806 -0.771506 -0.403615 +vn -0.598704 -0.632562 -0.491344 +vn -0.682463 -0.469629 -0.560083 +vn -0.740025 -0.289004 -0.607322 +vn -0.769324 -0.097548 -0.631367 +vn -0.769324 0.097548 -0.631367 +vn -0.740025 0.289004 -0.607322 +vn -0.682463 0.469629 -0.560083 +vn -0.598704 0.632562 -0.491344 +vn -0.491806 0.771506 -0.403615 +vn -0.365764 0.880972 -0.300175 +vn -0.225386 0.956550 -0.184970 +vn -0.076131 0.995138 -0.062479 +vn -0.086858 0.995138 -0.046426 +vn -0.257142 0.956550 -0.137445 +vn -0.417297 0.880972 -0.223050 +vn -0.561098 0.771506 -0.299913 +vn -0.683057 0.632562 -0.365101 +vn -0.778617 0.469629 -0.416179 +vn -0.844288 0.289003 -0.451281 +vn -0.877715 0.097549 -0.469148 +vn -0.877715 -0.097549 -0.469148 +vn -0.844288 -0.289003 -0.451281 +vn -0.778617 -0.469629 -0.416179 +vn -0.683057 -0.632562 -0.365101 +vn -0.561098 -0.771506 -0.299913 +vn -0.417297 -0.880972 -0.223050 +vn -0.257142 -0.956549 -0.137445 +vn -0.086857 -0.995138 -0.046426 +vn -0.094246 -0.995138 -0.028589 +vn -0.279015 -0.956549 -0.084638 +vn -0.452794 -0.880972 -0.137353 +vn -0.608826 -0.771506 -0.184685 +vn -0.741160 -0.632562 -0.224828 +vn -0.844848 -0.469629 -0.256282 +vn -0.916106 -0.289003 -0.277898 +vn -0.952377 -0.097549 -0.288900 +vn -0.952377 0.097548 -0.288900 +vn -0.916106 0.289003 -0.277898 +vn -0.844848 0.469629 -0.256282 +vn -0.741160 0.632562 -0.224828 +vn -0.608826 0.771506 -0.184685 +vn -0.452794 0.880972 -0.137353 +vn -0.279015 0.956550 -0.084638 +vn -0.094246 0.995138 -0.028589 +vn -0.098013 0.995138 -0.009653 +vn -0.290166 0.956550 -0.028579 +vn -0.470890 0.880972 -0.046379 +vn -0.633158 0.771506 -0.062360 +vn -0.770780 0.632562 -0.075915 +vn -0.878613 0.469629 -0.086536 +vn -0.952718 0.289003 -0.093834 +vn -0.990439 0.097548 -0.097549 +vn -0.990439 -0.097548 -0.097549 +vn -0.952718 -0.289003 -0.093834 +vn -0.878613 -0.469629 -0.086536 +vn -0.770780 -0.632562 -0.075915 +vn -0.633158 -0.771506 -0.062360 +vn -0.470890 -0.880972 -0.046378 +vn -0.290166 -0.956549 -0.028579 +vn -0.098012 -0.995138 -0.009653 +vn -0.098012 -0.995138 0.009653 +vn -0.290166 -0.956549 0.028579 +vn -0.470890 -0.880972 0.046379 +vn -0.633158 -0.771506 0.062361 +vn -0.770780 -0.632562 0.075915 +vn -0.878613 -0.469628 0.086536 +vn -0.952718 -0.289003 0.093835 +vn -0.990438 -0.097548 0.097550 +vn -0.990438 0.097548 0.097550 +vn -0.952718 0.289003 0.093835 +vn -0.878613 0.469629 0.086536 +vn -0.770780 0.632562 0.075915 +vn -0.633158 0.771506 0.062361 +vn -0.470890 0.880972 0.046379 +vn -0.290166 0.956550 0.028579 +vn -0.098013 0.995138 0.009653 +vn -0.094246 0.995138 0.028589 +vn -0.279015 0.956550 0.084638 +vn -0.452794 0.880972 0.137354 +vn -0.608826 0.771506 0.184686 +vn -0.741160 0.632562 0.224828 +vn -0.844848 0.469629 0.256282 +vn -0.916106 0.289003 0.277898 +vn -0.952376 0.097548 0.288901 +vn -0.952376 -0.097548 0.288901 +vn -0.916106 -0.289003 0.277898 +vn -0.844848 -0.469629 0.256282 +vn -0.741160 -0.632562 0.224828 +vn -0.608826 -0.771506 0.184686 +vn -0.452794 -0.880972 0.137354 +vn -0.279015 -0.956550 0.084638 +vn -0.094246 -0.995138 0.028589 +vn -0.086857 -0.995138 0.046426 +vn -0.257142 -0.956549 0.137445 +vn -0.417297 -0.880972 0.223050 +vn -0.561098 -0.771506 0.299913 +vn -0.683057 -0.632562 0.365102 +vn -0.778616 -0.469629 0.416179 +vn -0.844288 -0.289003 0.451281 +vn -0.877715 -0.097548 0.469149 +vn -0.877715 0.097548 0.469149 +vn -0.844288 0.289003 0.451281 +vn -0.778616 0.469629 0.416179 +vn -0.683057 0.632562 0.365102 +vn -0.561097 0.771506 0.299913 +vn -0.417297 0.880972 0.223050 +vn -0.257142 0.956550 0.137445 +vn -0.086858 0.995138 0.046427 +vn -0.076132 0.995138 0.062480 +vn -0.225386 0.956550 0.184970 +vn -0.365764 0.880972 0.300175 +vn -0.491806 0.771506 0.403615 +vn -0.598704 0.632562 0.491344 +vn -0.682463 0.469629 0.560083 +vn -0.740025 0.289003 0.607323 +vn -0.769324 0.097548 0.631368 +vn -0.769324 -0.097548 0.631368 +vn -0.740025 -0.289003 0.607323 +vn -0.682463 -0.469629 0.560083 +vn -0.598704 -0.632562 0.491344 +vn -0.491806 -0.771506 0.403615 +vn -0.365764 -0.880972 0.300175 +vn -0.225387 -0.956549 0.184970 +vn -0.076131 -0.995138 0.062479 +vn -0.062479 -0.995138 0.076131 +vn -0.184970 -0.956549 0.225387 +vn -0.300175 -0.880972 0.365764 +vn -0.403615 -0.771506 0.491806 +vn -0.491344 -0.632561 0.598705 +vn -0.560083 -0.469629 0.682463 +vn -0.607322 -0.289003 0.740025 +vn -0.631367 -0.097547 0.769324 +vn -0.631367 0.097547 0.769324 +vn -0.607322 0.289003 0.740025 +vn -0.560083 0.469629 0.682463 +vn -0.491344 0.632562 0.598704 +vn -0.403614 0.771506 0.491806 +vn -0.300175 0.880972 0.365764 +vn -0.184970 0.956550 0.225386 +vn -0.062479 0.995138 0.076132 +vn -0.046426 0.995138 0.086858 +vn -0.137445 0.956550 0.257142 +vn -0.223050 0.880972 0.417298 +vn -0.299913 0.771506 0.561097 +vn -0.365101 0.632562 0.683057 +vn -0.416179 0.469629 0.778616 +vn -0.451281 0.289003 0.844288 +vn -0.469148 0.097547 0.877715 +vn -0.469148 -0.097547 0.877715 +vn -0.451281 -0.289003 0.844288 +vn -0.416179 -0.469629 0.778616 +vn -0.365101 -0.632561 0.683057 +vn -0.299913 -0.771506 0.561098 +vn -0.223050 -0.880972 0.417297 +vn -0.137445 -0.956549 0.257142 +vn -0.046426 -0.995138 0.086857 +vn -0.028589 -0.995138 0.094246 +vn -0.084638 -0.956549 0.279015 +vn -0.137353 -0.880972 0.452794 +vn -0.184685 -0.771506 0.608827 +vn -0.224828 -0.632561 0.741160 +vn -0.256282 -0.469629 0.844848 +vn -0.277897 -0.289003 0.916106 +vn -0.288900 -0.097547 0.952377 +vn -0.288900 0.097547 0.952377 +vn -0.277897 0.289003 0.916106 +vn -0.256282 0.469629 0.844848 +vn -0.224828 0.632562 0.741160 +vn -0.184685 0.771507 0.608826 +vn -0.137353 0.880972 0.452794 +vn -0.084638 0.956550 0.279015 +vn -0.028589 0.995138 0.094246 +vn -0.009653 0.995138 0.098013 +vn -0.028579 0.956550 0.290166 +vn -0.046378 0.880972 0.470890 +vn -0.062360 0.771507 0.633158 +vn -0.075915 0.632562 0.770780 +vn -0.086536 0.469629 0.878613 +vn -0.093834 0.289003 0.952718 +vn -0.097549 0.097547 0.990439 +vn -0.097549 -0.097547 0.990439 +vn -0.093834 -0.289003 0.952718 +vn -0.086536 -0.469629 0.878613 +vn -0.075915 -0.632561 0.770781 +vn -0.062360 -0.771506 0.633158 +vn -0.046379 -0.880972 0.470890 +vn -0.028579 -0.956549 0.290166 +vn -0.009653 -0.995138 0.098012 +vn 0.009653 -0.995138 0.098012 +vn 0.028579 -0.956549 0.290166 +vn 0.046379 -0.880972 0.470890 +vn 0.062361 -0.771506 0.633158 +vn 0.075915 -0.632561 0.770781 +vn 0.086536 -0.469629 0.878613 +vn 0.093835 -0.289003 0.952718 +vn 0.097550 -0.097547 0.990439 +vn 0.097550 0.097547 0.990439 +vn 0.093835 0.289003 0.952718 +vn 0.086536 0.469629 0.878612 +vn 0.075916 0.632562 0.770780 +vn 0.062361 0.771507 0.633158 +vn 0.046379 0.880972 0.470890 +vn 0.028579 0.956550 0.290166 +vn 0.009653 0.995138 0.098013 +vn 0.028589 0.995138 0.094246 +vn 0.084638 0.956550 0.279015 +vn 0.137354 0.880972 0.452794 +vn 0.184686 0.771507 0.608826 +vn 0.224829 0.632562 0.741160 +vn 0.256282 0.469629 0.844848 +vn 0.277898 0.289003 0.916106 +vn 0.288901 0.097547 0.952376 +vn 0.288901 -0.097547 0.952376 +vn 0.277898 -0.289003 0.916106 +vn 0.256282 -0.469629 0.844848 +vn 0.224829 -0.632561 0.741160 +vn 0.184685 -0.771506 0.608826 +vn 0.137354 -0.880972 0.452794 +vn 0.084638 -0.956549 0.279015 +vn 0.028589 -0.995138 0.094246 +vn 0.046426 -0.995138 0.086857 +vn 0.137445 -0.956549 0.257142 +vn 0.223050 -0.880972 0.417297 +vn 0.299913 -0.771506 0.561097 +vn 0.365102 -0.632561 0.683057 +vn 0.416179 -0.469629 0.778616 +vn 0.451282 -0.289003 0.844288 +vn 0.469149 -0.097547 0.877715 +vn 0.469149 0.097547 0.877715 +vn 0.451282 0.289003 0.844288 +vn 0.416179 0.469629 0.778616 +vn 0.365102 0.632562 0.683057 +vn 0.299913 0.771506 0.561097 +vn 0.223050 0.880972 0.417298 +vn 0.137445 0.956550 0.257142 +vn 0.046426 0.995138 0.086858 +vn 0.062480 0.995138 0.076132 +vn 0.184970 0.956550 0.225386 +vn 0.300175 0.880972 0.365764 +vn 0.403615 0.771507 0.491806 +vn 0.491344 0.632562 0.598704 +vn 0.560083 0.469629 0.682463 +vn 0.607323 0.289003 0.740025 +vn 0.631368 0.097547 0.769324 +vn 0.631368 -0.097547 0.769324 +vn 0.607323 -0.289003 0.740024 +vn 0.560083 -0.469629 0.682463 +vn 0.491344 -0.632561 0.598705 +vn 0.403615 -0.771506 0.491806 +vn 0.300175 -0.880972 0.365764 +vn 0.184970 -0.956549 0.225387 +vn 0.062479 -0.995138 0.076131 +vn 0.076131 -0.995138 0.062479 +vn 0.225387 -0.956549 0.184970 +vn 0.365764 -0.880972 0.300175 +vn 0.491806 -0.771506 0.403615 +vn 0.598705 -0.632561 0.491344 +vn 0.682463 -0.469629 0.560083 +vn 0.740025 -0.289003 0.607322 +vn 0.769324 -0.097547 0.631367 +vn 0.769324 0.097547 0.631367 +vn 0.740025 0.289003 0.607322 +vn 0.682463 0.469629 0.560083 +vn 0.598705 0.632561 0.491344 +vn 0.491806 0.771507 0.403614 +vn 0.365765 0.880972 0.300175 +vn 0.225387 0.956550 0.184970 +vn 0.076132 0.995138 0.062479 +vn 0.086858 0.995138 0.046426 +vn 0.257142 0.956550 0.137445 +vn 0.417298 0.880972 0.223050 +vn 0.561097 0.771507 0.299912 +vn 0.683057 0.632561 0.365101 +vn 0.778616 0.469629 0.416179 +vn 0.844288 0.289003 0.451281 +vn 0.877716 0.097547 0.469148 +vn 0.877716 -0.097547 0.469148 +vn 0.844288 -0.289003 0.451281 +vn 0.778617 -0.469629 0.416179 +vn 0.683057 -0.632561 0.365101 +vn 0.561097 -0.771506 0.299913 +vn 0.417297 -0.880972 0.223050 +vn 0.257142 -0.956550 0.137445 +vn 0.086857 -0.995138 0.046426 +vn 0.094246 -0.995138 0.028589 +vn 0.279015 -0.956549 0.084638 +vn 0.452794 -0.880972 0.137353 +vn 0.608826 -0.771506 0.184685 +vn 0.741160 -0.632561 0.224828 +vn 0.844848 -0.469629 0.256282 +vn 0.916106 -0.289003 0.277897 +vn 0.952377 -0.097547 0.288900 +vn 0.952377 0.097547 0.288900 +vn 0.916106 0.289003 0.277897 +vn 0.844848 0.469629 0.256281 +vn 0.741160 0.632561 0.224828 +vn 0.608826 0.771507 0.184685 +vn 0.452795 0.880972 0.137353 +vn 0.279015 0.956550 0.084638 +vn 0.094246 0.995138 0.028589 +vn 0.098013 0.995138 0.009653 +vn 0.290166 0.956550 0.028579 +vn 0.470891 0.880972 0.046378 +vn 0.633157 0.771507 0.062360 +vn 0.770781 0.632561 0.075915 +vn 0.878612 0.469629 0.086535 +vn 0.952718 0.289003 0.093834 +vn 0.990439 0.097547 0.097549 +vn 0.990439 -0.097547 0.097549 +vn 0.952718 -0.289003 0.093834 +vn 0.878613 -0.469629 0.086536 +vn 0.770781 -0.632561 0.075915 +vn 0.633158 -0.771506 0.062360 +vn 0.470890 -0.880972 0.046378 +vn 0.290166 -0.956549 0.028579 +vn 0.098012 -0.995138 0.009653 +usemtl (null) +s off +f 32//1 2//1 482//1 +f 482//2 2//2 3//2 +f 482//2 3//2 481//2 +f 481//3 3//3 4//3 +f 481//3 4//3 480//3 +f 480//4 4//4 5//4 +f 480//4 5//4 479//4 +f 479//5 5//5 6//5 +f 479//5 6//5 478//5 +f 478//6 6//6 7//6 +f 478//6 7//6 477//6 +f 477//7 7//7 8//7 +f 477//7 8//7 476//7 +f 476//8 8//8 9//8 +f 476//8 9//8 475//8 +f 475//9 9//9 10//9 +f 475//9 10//9 474//9 +f 474//10 10//10 11//10 +f 474//10 11//10 473//10 +f 473//11 11//11 12//11 +f 473//11 12//11 472//11 +f 472//12 12//12 13//12 +f 472//12 13//12 471//12 +f 471//13 13//13 14//13 +f 471//13 14//13 470//13 +f 470//14 14//14 15//14 +f 470//14 15//14 469//14 +f 469//15 15//15 16//15 +f 469//15 16//15 468//15 +f 16//16 1//16 468//16 +f 17//17 1//17 16//17 +f 15//18 18//18 17//18 +f 15//18 17//18 16//18 +f 14//19 19//19 18//19 +f 14//19 18//19 15//19 +f 13//20 20//20 19//20 +f 13//20 19//20 14//20 +f 12//21 21//21 20//21 +f 12//21 20//21 13//21 +f 11//22 22//22 21//22 +f 11//22 21//22 12//22 +f 10//23 23//23 22//23 +f 10//23 22//23 11//23 +f 9//24 24//24 23//24 +f 9//24 23//24 10//24 +f 8//25 25//25 24//25 +f 8//25 24//25 9//25 +f 7//26 26//26 25//26 +f 7//26 25//26 8//26 +f 6//27 27//27 26//27 +f 6//27 26//27 7//27 +f 5//28 28//28 27//28 +f 5//28 27//28 6//28 +f 4//29 29//29 28//29 +f 4//29 28//29 5//29 +f 3//30 30//30 29//30 +f 3//30 29//30 4//30 +f 2//31 31//31 30//31 +f 2//31 30//31 3//31 +f 32//32 31//32 2//32 +f 32//33 33//33 31//33 +f 31//34 33//34 34//34 +f 31//34 34//34 30//34 +f 30//35 34//35 35//35 +f 30//35 35//35 29//35 +f 29//36 35//36 36//36 +f 29//36 36//36 28//36 +f 28//37 36//37 37//37 +f 28//37 37//37 27//37 +f 27//38 37//38 38//38 +f 27//38 38//38 26//38 +f 26//39 38//39 39//39 +f 26//39 39//39 25//39 +f 25//40 39//40 40//40 +f 25//40 40//40 24//40 +f 24//41 40//41 41//41 +f 24//41 41//41 23//41 +f 23//42 41//42 42//42 +f 23//42 42//42 22//42 +f 22//43 42//43 43//43 +f 22//43 43//43 21//43 +f 21//44 43//44 44//44 +f 21//44 44//44 20//44 +f 20//45 44//45 45//45 +f 20//45 45//45 19//45 +f 19//46 45//46 46//46 +f 19//46 46//46 18//46 +f 18//47 46//47 47//47 +f 18//47 47//47 17//47 +f 47//48 1//48 17//48 +f 48//49 1//49 47//49 +f 46//50 49//50 48//50 +f 46//50 48//50 47//50 +f 45//51 50//51 49//51 +f 45//51 49//51 46//51 +f 44//52 51//52 50//52 +f 44//52 50//52 45//52 +f 43//53 52//53 51//53 +f 43//53 51//53 44//53 +f 42//54 53//54 52//54 +f 42//54 52//54 43//54 +f 41//55 54//55 53//55 +f 41//55 53//55 42//55 +f 40//56 55//56 54//56 +f 40//56 54//56 41//56 +f 39//57 56//57 55//57 +f 39//57 55//57 40//57 +f 38//58 57//58 56//58 +f 38//58 56//58 39//58 +f 37//59 58//59 57//59 +f 37//59 57//59 38//59 +f 36//60 59//60 58//60 +f 36//60 58//60 37//60 +f 35//61 60//61 59//61 +f 35//61 59//61 36//61 +f 34//62 61//62 60//62 +f 34//62 60//62 35//62 +f 33//63 62//63 61//63 +f 33//63 61//63 34//63 +f 32//64 62//64 33//64 +f 32//65 63//65 62//65 +f 62//66 63//66 64//66 +f 62//66 64//66 61//66 +f 61//67 64//67 65//67 +f 61//67 65//67 60//67 +f 60//68 65//68 66//68 +f 60//68 66//68 59//68 +f 59//69 66//69 67//69 +f 59//69 67//69 58//69 +f 58//70 67//70 68//70 +f 58//70 68//70 57//70 +f 57//71 68//71 69//71 +f 57//71 69//71 56//71 +f 56//72 69//72 70//72 +f 56//72 70//72 55//72 +f 55//73 70//73 71//73 +f 55//73 71//73 54//73 +f 54//74 71//74 72//74 +f 54//74 72//74 53//74 +f 53//75 72//75 73//75 +f 53//75 73//75 52//75 +f 52//76 73//76 74//76 +f 52//76 74//76 51//76 +f 51//77 74//77 75//77 +f 51//77 75//77 50//77 +f 50//78 75//78 76//78 +f 50//78 76//78 49//78 +f 49//79 76//79 77//79 +f 49//79 77//79 48//79 +f 77//80 1//80 48//80 +f 78//81 1//81 77//81 +f 76//82 79//82 78//82 +f 76//82 78//82 77//82 +f 75//83 80//83 79//83 +f 75//83 79//83 76//83 +f 74//84 81//84 80//84 +f 74//84 80//84 75//84 +f 73//85 82//85 81//85 +f 73//85 81//85 74//85 +f 72//86 83//86 82//86 +f 72//86 82//86 73//86 +f 71//87 84//87 83//87 +f 71//87 83//87 72//87 +f 70//88 85//88 84//88 +f 70//88 84//88 71//88 +f 69//89 86//89 85//89 +f 69//89 85//89 70//89 +f 68//90 87//90 86//90 +f 68//90 86//90 69//90 +f 67//91 88//91 87//91 +f 67//91 87//91 68//91 +f 66//92 89//92 88//92 +f 66//92 88//92 67//92 +f 65//93 90//93 89//93 +f 65//93 89//93 66//93 +f 64//94 91//94 90//94 +f 64//94 90//94 65//94 +f 63//95 92//95 91//95 +f 63//95 91//95 64//95 +f 32//96 92//96 63//96 +f 32//97 93//97 92//97 +f 92//98 93//98 94//98 +f 92//98 94//98 91//98 +f 91//99 94//99 95//99 +f 91//99 95//99 90//99 +f 90//100 95//100 96//100 +f 90//100 96//100 89//100 +f 89//101 96//101 97//101 +f 89//101 97//101 88//101 +f 88//102 97//102 98//102 +f 88//102 98//102 87//102 +f 87//103 98//103 99//103 +f 87//103 99//103 86//103 +f 86//104 99//104 100//104 +f 86//104 100//104 85//104 +f 85//105 100//105 101//105 +f 85//105 101//105 84//105 +f 84//106 101//106 102//106 +f 84//106 102//106 83//106 +f 83//107 102//107 103//107 +f 83//107 103//107 82//107 +f 82//108 103//108 104//108 +f 82//108 104//108 81//108 +f 81//109 104//109 105//109 +f 81//109 105//109 80//109 +f 80//110 105//110 106//110 +f 80//110 106//110 79//110 +f 79//111 106//111 107//111 +f 79//111 107//111 78//111 +f 107//112 1//112 78//112 +f 108//113 1//113 107//113 +f 106//114 109//114 108//114 +f 106//114 108//114 107//114 +f 105//115 110//115 109//115 +f 105//115 109//115 106//115 +f 104//116 111//116 110//116 +f 104//116 110//116 105//116 +f 103//117 112//117 111//117 +f 103//117 111//117 104//117 +f 102//118 113//118 112//118 +f 102//118 112//118 103//118 +f 101//119 114//119 113//119 +f 101//119 113//119 102//119 +f 100//120 115//120 114//120 +f 100//120 114//120 101//120 +f 99//121 116//121 115//121 +f 99//121 115//121 100//121 +f 98//122 117//122 116//122 +f 98//122 116//122 99//122 +f 97//123 118//123 117//123 +f 97//123 117//123 98//123 +f 96//124 119//124 118//124 +f 96//124 118//124 97//124 +f 95//125 120//125 119//125 +f 95//125 119//125 96//125 +f 94//126 121//126 120//126 +f 94//126 120//126 95//126 +f 93//127 122//127 121//127 +f 93//127 121//127 94//127 +f 32//128 122//128 93//128 +f 32//129 123//129 122//129 +f 122//130 123//130 124//130 +f 122//130 124//130 121//130 +f 121//131 124//131 125//131 +f 121//131 125//131 120//131 +f 120//132 125//132 126//132 +f 120//132 126//132 119//132 +f 119//133 126//133 127//133 +f 119//133 127//133 118//133 +f 118//134 127//134 128//134 +f 118//134 128//134 117//134 +f 117//135 128//135 129//135 +f 117//135 129//135 116//135 +f 116//136 129//136 130//136 +f 116//136 130//136 115//136 +f 115//137 130//137 131//137 +f 115//137 131//137 114//137 +f 114//138 131//138 132//138 +f 114//138 132//138 113//138 +f 113//139 132//139 133//139 +f 113//139 133//139 112//139 +f 112//140 133//140 134//140 +f 112//140 134//140 111//140 +f 111//141 134//141 135//141 +f 111//141 135//141 110//141 +f 110//142 135//142 136//142 +f 110//142 136//142 109//142 +f 109//143 136//143 137//143 +f 109//143 137//143 108//143 +f 137//144 1//144 108//144 +f 138//145 1//145 137//145 +f 136//146 139//146 138//146 +f 136//146 138//146 137//146 +f 135//147 140//147 139//147 +f 135//147 139//147 136//147 +f 134//148 141//148 140//148 +f 134//148 140//148 135//148 +f 133//149 142//149 141//149 +f 133//149 141//149 134//149 +f 132//150 143//150 142//150 +f 132//150 142//150 133//150 +f 131//151 144//151 143//151 +f 131//151 143//151 132//151 +f 130//152 145//152 144//152 +f 130//152 144//152 131//152 +f 129//153 146//153 145//153 +f 129//153 145//153 130//153 +f 128//154 147//154 146//154 +f 128//154 146//154 129//154 +f 127//155 148//155 147//155 +f 127//155 147//155 128//155 +f 126//156 149//156 148//156 +f 126//156 148//156 127//156 +f 125//157 150//157 149//157 +f 125//157 149//157 126//157 +f 124//158 151//158 150//158 +f 124//158 150//158 125//158 +f 123//159 152//159 151//159 +f 123//159 151//159 124//159 +f 32//160 152//160 123//160 +f 32//161 153//161 152//161 +f 152//162 153//162 154//162 +f 152//162 154//162 151//162 +f 151//163 154//163 155//163 +f 151//163 155//163 150//163 +f 150//164 155//164 156//164 +f 150//164 156//164 149//164 +f 149//165 156//165 157//165 +f 149//165 157//165 148//165 +f 148//166 157//166 158//166 +f 148//166 158//166 147//166 +f 147//167 158//167 159//167 +f 147//167 159//167 146//167 +f 146//168 159//168 160//168 +f 146//168 160//168 145//168 +f 145//169 160//169 161//169 +f 145//169 161//169 144//169 +f 144//170 161//170 162//170 +f 144//170 162//170 143//170 +f 143//171 162//171 163//171 +f 143//171 163//171 142//171 +f 142//172 163//172 164//172 +f 142//172 164//172 141//172 +f 141//173 164//173 165//173 +f 141//173 165//173 140//173 +f 140//174 165//174 166//174 +f 140//174 166//174 139//174 +f 139//175 166//175 167//175 +f 139//175 167//175 138//175 +f 167//176 1//176 138//176 +f 168//177 1//177 167//177 +f 166//178 169//178 168//178 +f 166//178 168//178 167//178 +f 165//179 170//179 169//179 +f 165//179 169//179 166//179 +f 164//180 171//180 170//180 +f 164//180 170//180 165//180 +f 163//181 172//181 171//181 +f 163//181 171//181 164//181 +f 162//182 173//182 172//182 +f 162//182 172//182 163//182 +f 161//183 174//183 173//183 +f 161//183 173//183 162//183 +f 160//184 175//184 174//184 +f 160//184 174//184 161//184 +f 159//185 176//185 175//185 +f 159//185 175//185 160//185 +f 158//186 177//186 176//186 +f 158//186 176//186 159//186 +f 157//187 178//187 177//187 +f 157//187 177//187 158//187 +f 156//188 179//188 178//188 +f 156//188 178//188 157//188 +f 155//189 180//189 179//189 +f 155//189 179//189 156//189 +f 154//190 181//190 180//190 +f 154//190 180//190 155//190 +f 153//191 182//191 181//191 +f 153//191 181//191 154//191 +f 32//192 182//192 153//192 +f 32//193 183//193 182//193 +f 182//194 183//194 184//194 +f 182//194 184//194 181//194 +f 181//195 184//195 185//195 +f 181//195 185//195 180//195 +f 180//196 185//196 186//196 +f 180//196 186//196 179//196 +f 179//197 186//197 187//197 +f 179//197 187//197 178//197 +f 178//198 187//198 188//198 +f 178//198 188//198 177//198 +f 177//199 188//199 189//199 +f 177//199 189//199 176//199 +f 176//200 189//200 190//200 +f 176//200 190//200 175//200 +f 175//201 190//201 191//201 +f 175//201 191//201 174//201 +f 174//202 191//202 192//202 +f 174//202 192//202 173//202 +f 173//203 192//203 193//203 +f 173//203 193//203 172//203 +f 172//204 193//204 194//204 +f 172//204 194//204 171//204 +f 171//205 194//205 195//205 +f 171//205 195//205 170//205 +f 170//206 195//206 196//206 +f 170//206 196//206 169//206 +f 169//207 196//207 197//207 +f 169//207 197//207 168//207 +f 197//208 1//208 168//208 +f 198//209 1//209 197//209 +f 196//210 199//210 198//210 +f 196//210 198//210 197//210 +f 195//211 200//211 199//211 +f 195//211 199//211 196//211 +f 194//212 201//212 200//212 +f 194//212 200//212 195//212 +f 193//213 202//213 201//213 +f 193//213 201//213 194//213 +f 192//214 203//214 202//214 +f 192//214 202//214 193//214 +f 191//215 204//215 203//215 +f 191//215 203//215 192//215 +f 190//216 205//216 204//216 +f 190//216 204//216 191//216 +f 189//217 206//217 205//217 +f 189//217 205//217 190//217 +f 188//218 207//218 206//218 +f 188//218 206//218 189//218 +f 187//219 208//219 207//219 +f 187//219 207//219 188//219 +f 186//220 209//220 208//220 +f 186//220 208//220 187//220 +f 185//221 210//221 209//221 +f 185//221 209//221 186//221 +f 184//222 211//222 210//222 +f 184//222 210//222 185//222 +f 183//223 212//223 211//223 +f 183//223 211//223 184//223 +f 32//224 212//224 183//224 +f 32//225 213//225 212//225 +f 212//226 213//226 214//226 +f 212//226 214//226 211//226 +f 211//227 214//227 215//227 +f 211//227 215//227 210//227 +f 210//228 215//228 216//228 +f 210//228 216//228 209//228 +f 209//229 216//229 217//229 +f 209//229 217//229 208//229 +f 208//230 217//230 218//230 +f 208//230 218//230 207//230 +f 207//231 218//231 219//231 +f 207//231 219//231 206//231 +f 206//232 219//232 220//232 +f 206//232 220//232 205//232 +f 205//233 220//233 221//233 +f 205//233 221//233 204//233 +f 204//234 221//234 222//234 +f 204//234 222//234 203//234 +f 203//235 222//235 223//235 +f 203//235 223//235 202//235 +f 202//236 223//236 224//236 +f 202//236 224//236 201//236 +f 201//237 224//237 225//237 +f 201//237 225//237 200//237 +f 200//238 225//238 226//238 +f 200//238 226//238 199//238 +f 199//239 226//239 227//239 +f 199//239 227//239 198//239 +f 227//240 1//240 198//240 +f 228//241 1//241 227//241 +f 226//242 229//242 228//242 +f 226//242 228//242 227//242 +f 225//243 230//243 229//243 +f 225//243 229//243 226//243 +f 224//244 231//244 230//244 +f 224//244 230//244 225//244 +f 223//245 232//245 231//245 +f 223//245 231//245 224//245 +f 222//246 233//246 232//246 +f 222//246 232//246 223//246 +f 221//247 234//247 233//247 +f 221//247 233//247 222//247 +f 220//248 235//248 234//248 +f 220//248 234//248 221//248 +f 219//249 236//249 235//249 +f 219//249 235//249 220//249 +f 218//250 237//250 236//250 +f 218//250 236//250 219//250 +f 217//251 238//251 237//251 +f 217//251 237//251 218//251 +f 216//252 239//252 238//252 +f 216//252 238//252 217//252 +f 215//253 240//253 239//253 +f 215//253 239//253 216//253 +f 214//254 241//254 240//254 +f 214//254 240//254 215//254 +f 213//255 242//255 241//255 +f 213//255 241//255 214//255 +f 32//256 242//256 213//256 +f 32//257 243//257 242//257 +f 242//258 243//258 244//258 +f 242//258 244//258 241//258 +f 241//259 244//259 245//259 +f 241//259 245//259 240//259 +f 240//260 245//260 246//260 +f 240//260 246//260 239//260 +f 239//261 246//261 247//261 +f 239//261 247//261 238//261 +f 238//262 247//262 248//262 +f 238//262 248//262 237//262 +f 237//263 248//263 249//263 +f 237//263 249//263 236//263 +f 236//264 249//264 250//264 +f 236//264 250//264 235//264 +f 235//265 250//265 251//265 +f 235//265 251//265 234//265 +f 234//266 251//266 252//266 +f 234//266 252//266 233//266 +f 233//267 252//267 253//267 +f 233//267 253//267 232//267 +f 232//268 253//268 254//268 +f 232//268 254//268 231//268 +f 231//269 254//269 255//269 +f 231//269 255//269 230//269 +f 230//270 255//270 256//270 +f 230//270 256//270 229//270 +f 229//271 256//271 257//271 +f 229//271 257//271 228//271 +f 257//272 1//272 228//272 +f 258//273 1//273 257//273 +f 256//274 259//274 258//274 +f 256//274 258//274 257//274 +f 255//275 260//275 259//275 +f 255//275 259//275 256//275 +f 254//276 261//276 260//276 +f 254//276 260//276 255//276 +f 253//277 262//277 261//277 +f 253//277 261//277 254//277 +f 252//278 263//278 262//278 +f 252//278 262//278 253//278 +f 251//279 264//279 263//279 +f 251//279 263//279 252//279 +f 250//280 265//280 264//280 +f 250//280 264//280 251//280 +f 249//281 266//281 265//281 +f 249//281 265//281 250//281 +f 248//282 267//282 266//282 +f 248//282 266//282 249//282 +f 247//283 268//283 267//283 +f 247//283 267//283 248//283 +f 246//284 269//284 268//284 +f 246//284 268//284 247//284 +f 245//285 270//285 269//285 +f 245//285 269//285 246//285 +f 244//286 271//286 270//286 +f 244//286 270//286 245//286 +f 243//287 272//287 271//287 +f 243//287 271//287 244//287 +f 32//288 272//288 243//288 +f 32//289 273//289 272//289 +f 272//290 273//290 274//290 +f 272//290 274//290 271//290 +f 271//291 274//291 275//291 +f 271//291 275//291 270//291 +f 270//292 275//292 276//292 +f 270//292 276//292 269//292 +f 269//293 276//293 277//293 +f 269//293 277//293 268//293 +f 268//294 277//294 278//294 +f 268//294 278//294 267//294 +f 267//295 278//295 279//295 +f 267//295 279//295 266//295 +f 266//296 279//296 280//296 +f 266//296 280//296 265//296 +f 265//297 280//297 281//297 +f 265//297 281//297 264//297 +f 264//298 281//298 282//298 +f 264//298 282//298 263//298 +f 263//299 282//299 283//299 +f 263//299 283//299 262//299 +f 262//300 283//300 284//300 +f 262//300 284//300 261//300 +f 261//301 284//301 285//301 +f 261//301 285//301 260//301 +f 260//302 285//302 286//302 +f 260//302 286//302 259//302 +f 259//303 286//303 287//303 +f 259//303 287//303 258//303 +f 287//304 1//304 258//304 +f 288//305 1//305 287//305 +f 286//306 289//306 288//306 +f 286//306 288//306 287//306 +f 285//307 290//307 289//307 +f 285//307 289//307 286//307 +f 284//308 291//308 290//308 +f 284//308 290//308 285//308 +f 283//309 292//309 291//309 +f 283//309 291//309 284//309 +f 282//310 293//310 292//310 +f 282//310 292//310 283//310 +f 281//311 294//311 293//311 +f 281//311 293//311 282//311 +f 280//312 295//312 294//312 +f 280//312 294//312 281//312 +f 279//313 296//313 295//313 +f 279//313 295//313 280//313 +f 278//314 297//314 296//314 +f 278//314 296//314 279//314 +f 277//315 298//315 297//315 +f 277//315 297//315 278//315 +f 276//316 299//316 298//316 +f 276//316 298//316 277//316 +f 275//317 300//317 299//317 +f 275//317 299//317 276//317 +f 274//318 301//318 300//318 +f 274//318 300//318 275//318 +f 273//319 302//319 301//319 +f 273//319 301//319 274//319 +f 32//320 302//320 273//320 +f 32//321 303//321 302//321 +f 302//322 303//322 304//322 +f 302//322 304//322 301//322 +f 301//323 304//323 305//323 +f 301//323 305//323 300//323 +f 300//324 305//324 306//324 +f 300//324 306//324 299//324 +f 299//325 306//325 307//325 +f 299//325 307//325 298//325 +f 298//326 307//326 308//326 +f 298//326 308//326 297//326 +f 297//327 308//327 309//327 +f 297//327 309//327 296//327 +f 296//328 309//328 310//328 +f 296//328 310//328 295//328 +f 295//329 310//329 311//329 +f 295//329 311//329 294//329 +f 294//330 311//330 312//330 +f 294//330 312//330 293//330 +f 293//331 312//331 313//331 +f 293//331 313//331 292//331 +f 292//332 313//332 314//332 +f 292//332 314//332 291//332 +f 291//333 314//333 315//333 +f 291//333 315//333 290//333 +f 290//334 315//334 316//334 +f 290//334 316//334 289//334 +f 289//335 316//335 317//335 +f 289//335 317//335 288//335 +f 317//336 1//336 288//336 +f 318//337 1//337 317//337 +f 316//338 319//338 318//338 +f 316//338 318//338 317//338 +f 315//339 320//339 319//339 +f 315//339 319//339 316//339 +f 314//340 321//340 320//340 +f 314//340 320//340 315//340 +f 313//341 322//341 321//341 +f 313//341 321//341 314//341 +f 312//342 323//342 322//342 +f 312//342 322//342 313//342 +f 311//343 324//343 323//343 +f 311//343 323//343 312//343 +f 310//344 325//344 324//344 +f 310//344 324//344 311//344 +f 309//345 326//345 325//345 +f 309//345 325//345 310//345 +f 308//346 327//346 326//346 +f 308//346 326//346 309//346 +f 307//347 328//347 327//347 +f 307//347 327//347 308//347 +f 306//348 329//348 328//348 +f 306//348 328//348 307//348 +f 305//349 330//349 329//349 +f 305//349 329//349 306//349 +f 304//350 331//350 330//350 +f 304//350 330//350 305//350 +f 303//351 332//351 331//351 +f 303//351 331//351 304//351 +f 32//352 332//352 303//352 +f 32//353 333//353 332//353 +f 332//354 333//354 334//354 +f 332//354 334//354 331//354 +f 331//355 334//355 335//355 +f 331//355 335//355 330//355 +f 330//356 335//356 336//356 +f 330//356 336//356 329//356 +f 329//357 336//357 337//357 +f 329//357 337//357 328//357 +f 328//358 337//358 338//358 +f 328//358 338//358 327//358 +f 327//359 338//359 339//359 +f 327//359 339//359 326//359 +f 326//360 339//360 340//360 +f 326//360 340//360 325//360 +f 325//361 340//361 341//361 +f 325//361 341//361 324//361 +f 324//362 341//362 342//362 +f 324//362 342//362 323//362 +f 323//363 342//363 343//363 +f 323//363 343//363 322//363 +f 322//364 343//364 344//364 +f 322//364 344//364 321//364 +f 321//365 344//365 345//365 +f 321//365 345//365 320//365 +f 320//366 345//366 346//366 +f 320//366 346//366 319//366 +f 319//367 346//367 347//367 +f 319//367 347//367 318//367 +f 347//368 1//368 318//368 +f 348//369 1//369 347//369 +f 346//370 349//370 348//370 +f 346//370 348//370 347//370 +f 345//371 350//371 349//371 +f 345//371 349//371 346//371 +f 344//372 351//372 350//372 +f 344//372 350//372 345//372 +f 343//373 352//373 351//373 +f 343//373 351//373 344//373 +f 342//374 353//374 352//374 +f 342//374 352//374 343//374 +f 341//375 354//375 353//375 +f 341//375 353//375 342//375 +f 340//376 355//376 354//376 +f 340//376 354//376 341//376 +f 339//377 356//377 355//377 +f 339//377 355//377 340//377 +f 338//378 357//378 356//378 +f 338//378 356//378 339//378 +f 337//379 358//379 357//379 +f 337//379 357//379 338//379 +f 336//380 359//380 358//380 +f 336//380 358//380 337//380 +f 335//381 360//381 359//381 +f 335//381 359//381 336//381 +f 334//382 361//382 360//382 +f 334//382 360//382 335//382 +f 333//383 362//383 361//383 +f 333//383 361//383 334//383 +f 32//384 362//384 333//384 +f 32//385 363//385 362//385 +f 362//386 363//386 364//386 +f 362//386 364//386 361//386 +f 361//387 364//387 365//387 +f 361//387 365//387 360//387 +f 360//388 365//388 366//388 +f 360//388 366//388 359//388 +f 359//389 366//389 367//389 +f 359//389 367//389 358//389 +f 358//390 367//390 368//390 +f 358//390 368//390 357//390 +f 357//391 368//391 369//391 +f 357//391 369//391 356//391 +f 356//392 369//392 370//392 +f 356//392 370//392 355//392 +f 355//393 370//393 371//393 +f 355//393 371//393 354//393 +f 354//394 371//394 372//394 +f 354//394 372//394 353//394 +f 353//395 372//395 373//395 +f 353//395 373//395 352//395 +f 352//396 373//396 374//396 +f 352//396 374//396 351//396 +f 351//397 374//397 375//397 +f 351//397 375//397 350//397 +f 350//398 375//398 376//398 +f 350//398 376//398 349//398 +f 349//399 376//399 377//399 +f 349//399 377//399 348//399 +f 377//400 1//400 348//400 +f 378//401 1//401 377//401 +f 376//402 379//402 378//402 +f 376//402 378//402 377//402 +f 375//403 380//403 379//403 +f 375//403 379//403 376//403 +f 374//404 381//404 380//404 +f 374//404 380//404 375//404 +f 373//405 382//405 381//405 +f 373//405 381//405 374//405 +f 372//406 383//406 382//406 +f 372//406 382//406 373//406 +f 371//407 384//407 383//407 +f 371//407 383//407 372//407 +f 370//408 385//408 384//408 +f 370//408 384//408 371//408 +f 369//409 386//409 385//409 +f 369//409 385//409 370//409 +f 368//410 387//410 386//410 +f 368//410 386//410 369//410 +f 367//411 388//411 387//411 +f 367//411 387//411 368//411 +f 366//412 389//412 388//412 +f 366//412 388//412 367//412 +f 365//413 390//413 389//413 +f 365//413 389//413 366//413 +f 364//414 391//414 390//414 +f 364//414 390//414 365//414 +f 363//415 392//415 391//415 +f 363//415 391//415 364//415 +f 32//416 392//416 363//416 +f 32//417 393//417 392//417 +f 392//418 393//418 394//418 +f 392//418 394//418 391//418 +f 391//419 394//419 395//419 +f 391//419 395//419 390//419 +f 390//420 395//420 396//420 +f 390//420 396//420 389//420 +f 389//421 396//421 397//421 +f 389//421 397//421 388//421 +f 388//422 397//422 398//422 +f 388//422 398//422 387//422 +f 387//423 398//423 399//423 +f 387//423 399//423 386//423 +f 386//424 399//424 400//424 +f 386//424 400//424 385//424 +f 385//425 400//425 401//425 +f 385//425 401//425 384//425 +f 384//426 401//426 402//426 +f 384//426 402//426 383//426 +f 383//427 402//427 403//427 +f 383//427 403//427 382//427 +f 382//428 403//428 404//428 +f 382//428 404//428 381//428 +f 381//429 404//429 405//429 +f 381//429 405//429 380//429 +f 380//430 405//430 406//430 +f 380//430 406//430 379//430 +f 379//431 406//431 407//431 +f 379//431 407//431 378//431 +f 407//432 1//432 378//432 +f 408//433 1//433 407//433 +f 406//434 409//434 408//434 +f 406//434 408//434 407//434 +f 405//435 410//435 409//435 +f 405//435 409//435 406//435 +f 404//436 411//436 410//436 +f 404//436 410//436 405//436 +f 403//437 412//437 411//437 +f 403//437 411//437 404//437 +f 402//438 413//438 412//438 +f 402//438 412//438 403//438 +f 401//439 414//439 413//439 +f 401//439 413//439 402//439 +f 400//440 415//440 414//440 +f 400//440 414//440 401//440 +f 399//441 416//441 415//441 +f 399//441 415//441 400//441 +f 398//442 417//442 416//442 +f 398//442 416//442 399//442 +f 397//443 418//443 417//443 +f 397//443 417//443 398//443 +f 396//444 419//444 418//444 +f 396//444 418//444 397//444 +f 395//445 420//445 419//445 +f 395//445 419//445 396//445 +f 394//446 421//446 420//446 +f 394//446 420//446 395//446 +f 393//447 422//447 421//447 +f 393//447 421//447 394//447 +f 32//448 422//448 393//448 +f 32//449 423//449 422//449 +f 422//450 423//450 424//450 +f 422//450 424//450 421//450 +f 421//451 424//451 425//451 +f 421//451 425//451 420//451 +f 420//452 425//452 426//452 +f 420//452 426//452 419//452 +f 419//453 426//453 427//453 +f 419//453 427//453 418//453 +f 418//454 427//454 428//454 +f 418//454 428//454 417//454 +f 417//455 428//455 429//455 +f 417//455 429//455 416//455 +f 416//456 429//456 430//456 +f 416//456 430//456 415//456 +f 415//457 430//457 431//457 +f 415//457 431//457 414//457 +f 414//458 431//458 432//458 +f 414//458 432//458 413//458 +f 413//459 432//459 433//459 +f 413//459 433//459 412//459 +f 412//460 433//460 434//460 +f 412//460 434//460 411//460 +f 411//461 434//461 435//461 +f 411//461 435//461 410//461 +f 410//462 435//462 436//462 +f 410//462 436//462 409//462 +f 409//463 436//463 437//463 +f 409//463 437//463 408//463 +f 437//464 1//464 408//464 +f 438//465 1//465 437//465 +f 436//466 439//466 438//466 +f 436//466 438//466 437//466 +f 435//467 440//467 439//467 +f 435//467 439//467 436//467 +f 434//468 441//468 440//468 +f 434//468 440//468 435//468 +f 433//469 442//469 441//469 +f 433//469 441//469 434//469 +f 432//470 443//470 442//470 +f 432//470 442//470 433//470 +f 431//471 444//471 443//471 +f 431//471 443//471 432//471 +f 430//472 445//472 444//472 +f 430//472 444//472 431//472 +f 429//473 446//473 445//473 +f 429//473 445//473 430//473 +f 428//474 447//474 446//474 +f 428//474 446//474 429//474 +f 427//475 448//475 447//475 +f 427//475 447//475 428//475 +f 426//476 449//476 448//476 +f 426//476 448//476 427//476 +f 425//477 450//477 449//477 +f 425//477 449//477 426//477 +f 424//478 451//478 450//478 +f 424//478 450//478 425//478 +f 423//479 452//479 451//479 +f 423//479 451//479 424//479 +f 32//480 452//480 423//480 +f 32//481 453//481 452//481 +f 452//482 453//482 454//482 +f 452//482 454//482 451//482 +f 451//483 454//483 455//483 +f 451//483 455//483 450//483 +f 450//484 455//484 456//484 +f 450//484 456//484 449//484 +f 449//485 456//485 457//485 +f 449//485 457//485 448//485 +f 448//486 457//486 458//486 +f 448//486 458//486 447//486 +f 447//487 458//487 459//487 +f 447//487 459//487 446//487 +f 446//488 459//488 460//488 +f 446//488 460//488 445//488 +f 445//489 460//489 461//489 +f 445//489 461//489 444//489 +f 444//490 461//490 462//490 +f 444//490 462//490 443//490 +f 443//491 462//491 463//491 +f 443//491 463//491 442//491 +f 442//492 463//492 464//492 +f 442//492 464//492 441//492 +f 441//493 464//493 465//493 +f 441//493 465//493 440//493 +f 440//494 465//494 466//494 +f 440//494 466//494 439//494 +f 439//495 466//495 467//495 +f 439//495 467//495 438//495 +f 467//496 1//496 438//496 +f 468//497 1//497 467//497 +f 466//498 469//498 468//498 +f 466//498 468//498 467//498 +f 465//499 470//499 469//499 +f 465//499 469//499 466//499 +f 464//500 471//500 470//500 +f 464//500 470//500 465//500 +f 463//501 472//501 471//501 +f 463//501 471//501 464//501 +f 462//502 473//502 472//502 +f 462//502 472//502 463//502 +f 461//503 474//503 473//503 +f 461//503 473//503 462//503 +f 460//504 475//504 474//504 +f 460//504 474//504 461//504 +f 459//505 476//505 475//505 +f 459//505 475//505 460//505 +f 458//506 477//506 476//506 +f 458//506 476//506 459//506 +f 457//507 478//507 477//507 +f 457//507 477//507 458//507 +f 456//508 479//508 478//508 +f 456//508 478//508 457//508 +f 455//509 480//509 479//509 +f 455//509 479//509 456//509 +f 454//510 481//510 480//510 +f 454//510 480//510 455//510 +f 453//511 482//511 481//511 +f 453//511 481//511 454//511 +f 32//512 482//512 453//512 diff --git a/base/res/struct_help.txt b/base/res/struct_help.txt new file mode 100644 index 0000000..94ed78c --- /dev/null +++ b/base/res/struct_help.txt @@ -0,0 +1,11 @@ +pass_prog pass_vert, pass_frag +diagnostic_prog shade_vert, diagnostic_frag +ambient_prog shade_vert, ambient_frag +point_prog shade_vert, point_frag +post_prog post_vert, post_frag + +GLuint depthTexture = 0; +GLuint normalTexture = 0; +GLuint positionTexture = 0; +GLuint colorTexture = 0; +GLuint postTexture = 0; \ No newline at end of file diff --git a/base/res/teapot.obj b/base/res/teapot.obj new file mode 100644 index 0000000..d5ba191 --- /dev/null +++ b/base/res/teapot.obj @@ -0,0 +1,5049 @@ +# Blender v2.65 (sub 0) OBJ File +# www.blender.org +o teapot.005 +v -0.498530 0.712498 -0.039883 +v -0.501666 0.699221 -0.063813 +v -0.501255 0.717792 0.000000 +v -0.624036 0.711938 -0.039883 +v -0.526706 0.651362 -0.039883 +v -0.508714 0.682112 -0.071712 +v -0.622039 0.698704 -0.063813 +v -0.624834 0.717232 0.000000 +v -0.498530 0.712498 0.039883 +v -0.638129 0.287158 0.000000 +v -0.517593 0.664661 -0.063813 +v -0.534329 0.646030 0.000000 +v -0.614850 0.651067 -0.039883 +v -0.616848 0.664299 -0.063813 +v -0.619445 0.681503 -0.071790 +v -0.741245 0.707456 -0.039883 +v -0.744483 0.712577 0.000000 +v -0.624036 0.711938 0.039883 +v -0.501667 0.699221 0.063813 +v -0.622039 0.698704 0.063813 +v -0.712095 0.661370 -0.063813 +v -0.733150 0.694655 -0.063813 +v -0.741245 0.707456 0.039883 +v -0.733150 0.694655 0.063813 +v -0.631184 0.277569 -0.039883 +v -0.526706 0.651362 0.039883 +v -0.614053 0.645774 0.000000 +v -0.704000 0.648569 -0.039883 +v -0.722621 0.678012 -0.071790 +v -0.832523 0.695296 -0.039883 +v -0.837545 0.699948 0.000000 +v -0.832523 0.695296 0.039883 +v -0.619445 0.681503 0.071790 +v -0.508714 0.682112 0.071712 +v -0.722621 0.678012 0.071790 +v -0.517593 0.664661 0.063813 +v -0.619922 0.238069 -0.071790 +v -0.624826 0.259599 -0.063813 +v -0.710066 0.328372 0.000000 +v -0.614850 0.651067 0.039883 +v -0.787321 0.653419 -0.063813 +v -0.803644 0.668539 -0.071790 +v -0.819967 0.683663 -0.063813 +v -0.819967 0.683663 0.063813 +v -0.803644 0.668539 0.071790 +v -0.711425 0.307332 -0.063813 +v -0.615553 0.216807 -0.063813 +v -0.712688 0.287795 -0.071790 +v -0.631184 0.277569 0.039883 +v -0.710455 0.322361 -0.039883 +v -0.710455 0.322361 0.039883 +v -0.700762 0.643448 0.000000 +v -0.774766 0.641786 -0.039883 +v -0.897800 0.671612 -0.039883 +v -0.904015 0.675354 0.000000 +v -0.897800 0.671612 0.039883 +v -0.882265 0.662257 0.063813 +v -0.712095 0.661370 0.063813 +v -0.787321 0.653419 0.063813 +v -0.608884 0.198682 -0.039883 +v -0.624828 0.259599 0.063813 +v -0.766936 0.377559 0.000000 +v -0.769651 0.372307 0.039883 +v -0.616848 0.664299 0.063813 +v -0.704000 0.648569 0.039883 +v -0.841868 0.637931 -0.063813 +v -0.862065 0.650094 -0.071790 +v -0.882265 0.662257 -0.063813 +v -0.862065 0.650094 0.071790 +v -0.841868 0.637931 0.063813 +v -0.611709 0.194244 0.000000 +v -0.776434 0.359177 -0.063813 +v -0.769651 0.372307 -0.039883 +v -0.713952 0.268259 -0.063813 +v -0.711425 0.307332 0.063813 +v -0.776434 0.359177 0.063813 +v -0.769743 0.637131 0.000000 +v -0.826329 0.628576 -0.039883 +v -0.937016 0.632565 -0.039883 +v -0.943899 0.634805 0.000000 +v -0.937016 0.632565 0.039883 +v -0.919812 0.626965 0.063813 +v -0.897443 0.619684 0.071790 +v -0.774766 0.641786 0.039883 +v -0.826329 0.628576 0.039883 +v -0.714922 0.253231 -0.039883 +v -0.608883 0.198681 0.039883 +v -0.715311 0.247220 0.000000 +v -0.785253 0.342107 -0.071790 +v -0.619922 0.238069 0.071790 +v -0.712688 0.287795 0.071790 +v -0.809626 0.430737 0.000000 +v -0.814205 0.426194 0.039883 +v -0.825653 0.414838 0.063813 +v -0.875076 0.612403 -0.063813 +v -0.897443 0.619684 -0.071790 +v -0.919812 0.626965 -0.063813 +v -0.875076 0.612403 0.063813 +v -0.857869 0.606800 0.039883 +v -0.794072 0.325038 -0.063813 +v -0.800855 0.311909 -0.039883 +v -0.825653 0.414838 -0.063813 +v -0.814205 0.426194 -0.039883 +v -0.615480 0.216617 0.063578 +v -0.785253 0.342107 0.071790 +v -0.840534 0.400078 0.071790 +v -0.820114 0.624834 0.000000 +v -0.857869 0.606800 -0.039883 +v -0.950104 0.574316 -0.039883 +v -0.957194 0.574316 0.000000 +v -0.950104 0.574316 0.039883 +v -0.932377 0.574316 0.063813 +v -0.909334 0.574316 0.071790 +v -0.886292 0.574316 0.063813 +v -0.850987 0.604560 0.000000 +v -0.714922 0.253231 0.039883 +v -0.803571 0.306656 0.000000 +v -0.840534 0.400078 -0.071790 +v -0.713952 0.268259 0.063813 +v -0.794072 0.325038 0.063813 +v -0.839022 0.483916 0.000000 +v -0.844976 0.480304 0.039883 +v -0.859854 0.471278 0.063813 +v -0.879202 0.459542 0.071790 +v -0.886292 0.574316 -0.063813 +v -0.909334 0.574316 -0.071790 +v -0.932377 0.574316 -0.063813 +v -0.868564 0.574316 0.039883 +v -0.861474 0.574316 0.000000 +v -0.855419 0.385315 -0.063813 +v -0.866867 0.373960 -0.039883 +v -0.859854 0.471278 -0.063813 +v -0.844976 0.480304 -0.039883 +v -0.855419 0.385315 0.063813 +v -0.898547 0.447807 0.063813 +v -0.868564 0.574316 -0.039883 +v -0.941014 0.505765 -0.039883 +v -0.947813 0.503580 0.000000 +v -0.941014 0.505765 0.039883 +v -0.924011 0.511234 0.063813 +v -0.901913 0.518343 0.071790 +v -0.879811 0.525448 0.063813 +v -0.862808 0.530917 0.039883 +v -0.800855 0.311909 0.039883 +v -0.871445 0.369416 0.000000 +v -0.879202 0.459542 -0.071790 +v -0.866867 0.373960 0.039883 +v -0.856009 0.533103 0.000000 +v -0.879811 0.525448 -0.063813 +v -0.901913 0.518343 -0.071790 +v -0.924011 0.511234 -0.063813 +v -0.862808 0.530917 -0.039883 +v -0.898547 0.447807 -0.063813 +v -0.913428 0.438781 -0.039883 +v -0.913428 0.438781 0.039883 +v -0.919378 0.435169 0.000000 +v 0.600960 0.444810 0.085753 +v 0.605956 0.463769 0.000000 +v 0.600959 0.444810 -0.085753 +v 0.656890 0.471064 0.000000 +v 0.661223 0.454734 -0.083705 +v 0.730696 0.501576 -0.073611 +v 0.661223 0.454734 0.083705 +v 0.605101 0.399712 -0.137265 +v 0.746455 0.470391 -0.117778 +v 0.724395 0.514048 0.000000 +v 0.605100 0.399712 0.137265 +v 0.672055 0.413907 -0.133928 +v 0.613258 0.341675 -0.154354 +v 0.786583 0.544847 -0.096783 +v 0.768856 0.565896 -0.060489 +v 0.672055 0.413907 0.133928 +v 0.730696 0.501576 0.073611 +v 0.686135 0.360830 -0.150669 +v 0.809626 0.517481 -0.108881 +v 0.766935 0.429850 -0.132501 +v 0.761767 0.574316 0.000000 +v 0.613258 0.341675 0.154354 +v 0.813417 0.626247 -0.075788 +v 0.839021 0.611098 -0.085261 +v 0.793721 0.637899 -0.047367 +v 0.686135 0.360830 0.150669 +v 0.768856 0.565896 0.060489 +v 0.746455 0.470391 0.117778 +v 0.619427 0.283145 -0.137236 +v 0.864627 0.595949 -0.075788 +v 0.832669 0.490118 -0.096783 +v 0.787419 0.389310 -0.117778 +v 0.785843 0.642561 0.000000 +v 0.619427 0.283145 0.137236 +v 0.700219 0.307756 -0.133928 +v 0.847933 0.703560 -0.059638 +v 0.879938 0.698065 -0.067092 +v 0.911944 0.692571 -0.059638 +v 0.823314 0.707784 -0.037273 +v 0.766935 0.429850 0.132501 +v 0.793721 0.637899 0.047367 +v 0.786583 0.544847 0.096783 +v 0.700219 0.307756 0.133928 +v 0.617684 0.235930 -0.085941 +v 0.936563 0.688344 -0.037273 +v 0.884319 0.584297 -0.047367 +v 0.850396 0.469070 -0.060489 +v 0.803175 0.358128 -0.073611 +v 0.813468 0.709475 0.000000 +v 0.617684 0.235930 0.085941 +v 0.625577 0.219883 0.000000 +v 0.711051 0.266929 -0.083705 +v 0.911107 0.765755 -0.053178 +v 0.957193 0.765755 -0.059825 +v 1.003279 0.765755 -0.053178 +v 1.038733 0.765755 -0.033236 +v 0.875654 0.765755 -0.033236 +v 0.809626 0.517481 0.108881 +v 0.787419 0.389310 0.117778 +v 0.823314 0.707784 0.037273 +v 0.813417 0.626247 0.075788 +v 0.711051 0.266929 0.083705 +v 0.715384 0.250599 0.000000 +v 1.052913 0.765755 0.000000 +v 0.946409 0.686653 0.000000 +v 0.892200 0.579635 0.000000 +v 0.857486 0.460650 0.000000 +v 0.809479 0.345652 0.000000 +v 0.861474 0.765755 0.000000 +v 0.929990 0.776479 -0.051602 +v 0.979075 0.777181 -0.058052 +v 1.028157 0.777879 -0.051602 +v 1.065915 0.778419 -0.032251 +v 1.081016 0.778632 0.000000 +v 0.892235 0.775943 -0.032251 +v 0.839021 0.611098 0.085261 +v 0.832669 0.490118 0.096783 +v 0.803175 0.358128 0.073611 +v 0.875654 0.765755 0.033236 +v 0.847933 0.703560 0.059638 +v 1.065915 0.778419 0.032174 +v 1.038733 0.765755 0.033236 +v 0.936563 0.688344 0.037273 +v 0.884319 0.584297 0.047367 +v 0.850396 0.469070 0.060489 +v 0.877131 0.775726 0.000000 +v 0.943713 0.783087 -0.047663 +v 0.992645 0.784366 -0.053621 +v 1.041577 0.785649 -0.047663 +v 1.079216 0.786631 -0.029789 +v 1.094273 0.787027 0.000000 +v 1.079216 0.786631 0.029174 +v 0.906073 0.782101 -0.029789 +v 0.879938 0.698065 0.067092 +v 0.864627 0.595949 0.075788 +v 0.892235 0.775943 0.032236 +v 0.911107 0.765755 0.053178 +v 1.041577 0.785649 0.046875 +v 1.028157 0.777879 0.051503 +v 1.003279 0.765755 0.053178 +v 0.911944 0.692571 0.059638 +v 0.891016 0.781708 0.000000 +v 0.951249 0.785448 -0.042542 +v 0.997575 0.787068 -0.047860 +v 1.043903 0.788686 -0.042542 +v 1.079539 0.789934 -0.026589 +v 1.093795 0.790431 0.000000 +v 1.079539 0.789934 0.024511 +v 1.043903 0.788686 0.039883 +v 0.915613 0.784200 -0.026589 +v 0.957193 0.765755 0.059825 +v 0.906073 0.782101 0.029666 +v 0.929990 0.776479 0.051553 +v 0.997575 0.787068 0.045616 +v 0.992645 0.784366 0.052956 +v 0.979075 0.777181 0.057969 +v 0.901357 0.783702 0.000000 +v 0.951569 0.783431 -0.037421 +v 0.993532 0.785033 -0.042099 +v 1.035492 0.786631 -0.037421 +v 1.067772 0.787863 -0.023388 +v 1.080684 0.788354 0.000000 +v 1.067772 0.787863 0.018464 +v 1.035492 0.786631 0.031119 +v 0.993532 0.785033 0.036781 +v 0.919292 0.782200 -0.023388 +v 0.915613 0.784200 0.026173 +v 0.943713 0.783087 0.047269 +v 0.951569 0.783431 0.034270 +v 0.951249 0.785448 0.041213 +v 0.906379 0.781708 0.000000 +v 0.943653 0.776909 -0.033482 +v 0.980182 0.778010 -0.037667 +v 1.016712 0.779111 -0.033482 +v 1.044812 0.779957 -0.020926 +v 1.056052 0.780295 0.000000 +v 1.044812 0.779957 0.011310 +v 1.016712 0.779111 0.021172 +v 0.980182 0.778010 0.027281 +v 0.943653 0.776909 0.027327 +v 0.915553 0.776064 -0.020926 +v 0.919292 0.782200 0.022403 +v 0.915553 0.776064 0.019003 +v 0.904312 0.775726 0.000000 +v 0.926468 0.765755 -0.031906 +v 0.957193 0.765755 -0.035895 +v 0.987920 0.765755 -0.031906 +v 1.011552 0.765755 -0.019942 +v 1.021006 0.765755 0.000000 +v 1.011552 0.765755 0.003324 +v 0.987920 0.765755 0.010635 +v 0.957193 0.765755 0.017947 +v 0.926468 0.765755 0.021271 +v 0.902834 0.765755 0.016618 +v 0.902834 0.765755 -0.019942 +v 0.893380 0.765755 0.000000 +v 0.886428 0.750924 -0.019014 +v 0.908324 0.750924 -0.030099 +v 0.936793 0.750924 -0.033795 +v 0.965261 0.750924 -0.030099 +v 0.987158 0.750924 -0.019014 +v 0.995918 0.750924 -0.000537 +v 0.987158 0.750924 0.002542 +v 0.965261 0.750924 0.009317 +v 0.936793 0.750924 0.016092 +v 0.908324 0.750924 0.019171 +v 0.886428 0.750924 0.014860 +v 0.877668 0.750924 -0.000537 +v 0.936793 0.750924 -0.007312 +v 0.440746 0.783205 0.000000 +v 0.446690 0.765755 0.000000 +v 0.430973 0.765755 0.119945 +v 0.425236 0.783205 0.118348 +v 0.425236 0.783205 -0.118348 +v 0.453011 0.750009 0.000000 +v 0.437073 0.750009 0.121642 +v 0.441668 0.793673 0.000000 +v 0.386470 0.765755 0.226985 +v 0.430973 0.765755 -0.119945 +v 0.426127 0.793673 -0.118596 +v 0.437073 0.750009 -0.121642 +v 0.426127 0.793673 0.118596 +v 0.381327 0.783205 0.223964 +v 0.381327 0.783205 -0.223964 +v 0.382124 0.793673 -0.224433 +v 0.317150 0.765755 0.317150 +v 0.391939 0.750009 0.230197 +v 0.321638 0.750009 0.321639 +v 0.386470 0.765755 -0.226985 +v 0.391939 0.750009 -0.230197 +v 0.447686 0.797164 0.000000 +v 0.431936 0.797164 -0.120212 +v 0.387332 0.797164 -0.227491 +v 0.230197 0.750009 0.391940 +v 0.226984 0.765755 0.386470 +v 0.317150 0.765755 -0.317150 +v 0.321638 0.750009 -0.321639 +v 0.431936 0.797164 0.120212 +v 0.382124 0.793673 0.224433 +v 0.312929 0.783205 0.312929 +v 0.313584 0.793673 -0.313584 +v 0.312929 0.783205 -0.312929 +v 0.317858 0.797164 -0.317858 +v 0.121642 0.750009 0.437072 +v 0.119944 0.765755 0.430973 +v 0.226984 0.765755 -0.386470 +v 0.230197 0.750009 -0.391940 +v 0.457031 0.793673 0.000000 +v 0.440950 0.793673 -0.122721 +v 0.395416 0.793673 -0.232239 +v 0.324491 0.793673 -0.324492 +v -0.000000 0.750009 0.453012 +v -0.000000 0.765755 0.446690 +v 0.223963 0.783205 0.381327 +v 0.223963 0.783205 -0.381327 +v 0.119944 0.765755 -0.430973 +v 0.121642 0.750009 -0.437072 +v 0.440950 0.793673 0.122721 +v 0.387332 0.797164 0.227491 +v 0.313584 0.793673 0.313584 +v 0.227491 0.797164 -0.387332 +v 0.224433 0.793673 -0.382125 +v 0.232239 0.793673 -0.395417 +v -0.119945 0.765755 0.430973 +v -0.121642 0.750009 0.437072 +v 0.118348 0.783205 0.425237 +v 0.118348 0.783205 -0.425237 +v -0.000000 0.750009 -0.453012 +v -0.000000 0.765755 -0.446690 +v 0.467924 0.783205 0.000000 +v 0.451460 0.783205 -0.125646 +v 0.404842 0.783205 -0.237775 +v 0.332226 0.783205 -0.332226 +v 0.237775 0.783205 -0.404842 +v -0.226985 0.765755 0.386470 +v -0.000000 0.783205 0.440746 +v 0.224433 0.793673 0.382125 +v 0.118596 0.793673 -0.426127 +v -0.000000 0.783205 -0.440746 +v -0.119945 0.765755 -0.430973 +v -0.121642 0.750009 -0.437072 +v 0.451460 0.783205 0.125646 +v 0.395416 0.793673 0.232239 +v 0.317858 0.797164 0.317858 +v 0.122721 0.793673 -0.440950 +v 0.120212 0.797164 -0.431937 +v 0.125646 0.783205 -0.451460 +v -0.317150 0.765755 0.317150 +v -0.230198 0.750009 0.391939 +v -0.321639 0.750009 0.321639 +v -0.118348 0.783205 0.425237 +v 0.118596 0.793673 0.426127 +v -0.000000 0.793673 -0.441668 +v -0.118348 0.783205 -0.425237 +v -0.226985 0.765755 -0.386470 +v 0.478596 0.765755 0.000000 +v 0.461756 0.765755 -0.128512 +v 0.414076 0.765755 -0.243198 +v 0.339803 0.765755 -0.339804 +v 0.243198 0.765755 -0.414076 +v 0.128512 0.765755 -0.461757 +v -0.391940 0.750009 0.230197 +v -0.386470 0.765755 0.226985 +v -0.223964 0.783205 0.381327 +v -0.000000 0.793673 0.441668 +v 0.227491 0.797164 0.387332 +v -0.000000 0.797164 -0.447686 +v -0.118596 0.793673 -0.426127 +v -0.223964 0.783205 -0.381327 +v -0.317150 0.765755 -0.317150 +v -0.230198 0.750009 -0.391939 +v -0.321639 0.750009 -0.321639 +v 0.461756 0.765755 0.128512 +v 0.404842 0.783205 0.237775 +v 0.324491 0.793673 0.324492 +v -0.000000 0.783205 -0.467924 +v -0.000000 0.793673 -0.457031 +v -0.000000 0.765755 -0.478597 +v -0.437073 0.750009 0.121642 +v -0.430974 0.765755 0.119945 +v -0.312929 0.783205 0.312929 +v -0.118596 0.793673 0.426127 +v 0.120212 0.797164 0.431937 +v -0.120212 0.797164 -0.431937 +v -0.224433 0.793673 -0.382125 +v -0.312929 0.783205 -0.312929 +v -0.386470 0.765755 -0.226985 +v -0.391940 0.750009 -0.230197 +v 0.518110 0.682112 0.000000 +v 0.499881 0.682112 -0.139122 +v 0.448260 0.682112 -0.263277 +v 0.367859 0.682112 -0.367859 +v 0.263277 0.682112 -0.448260 +v 0.139122 0.682112 -0.499882 +v -0.000000 0.682112 -0.518110 +v -0.453012 0.750009 0.000000 +v -0.446690 0.765755 0.000000 +v -0.381327 0.783205 0.223964 +v -0.224433 0.793673 0.382125 +v -0.000000 0.797164 0.447686 +v 0.232239 0.793673 0.395417 +v -0.122721 0.793673 -0.440950 +v -0.227491 0.797164 -0.387332 +v -0.313584 0.793673 -0.313584 +v -0.381327 0.783205 -0.223964 +v -0.430974 0.765755 -0.119945 +v 0.499881 0.682112 0.139122 +v 0.414076 0.765755 0.243198 +v 0.332226 0.783205 0.332226 +v -0.128513 0.765755 -0.461757 +v -0.125646 0.783205 -0.451460 +v -0.139123 0.682112 -0.499882 +v -0.437073 0.750009 -0.121642 +v -0.425237 0.783205 0.118348 +v -0.313584 0.793673 0.313584 +v -0.120212 0.797164 0.431937 +v 0.122721 0.793673 0.440950 +v -0.232240 0.793673 -0.395417 +v -0.317859 0.797164 -0.317858 +v -0.382125 0.793673 -0.224433 +v -0.425237 0.783205 -0.118348 +v 0.555408 0.599133 0.000000 +v 0.535865 0.599133 -0.149137 +v 0.480530 0.599133 -0.282230 +v 0.394341 0.599133 -0.394341 +v 0.282230 0.599133 -0.480530 +v 0.149137 0.599133 -0.535866 +v -0.000000 0.599133 -0.555408 +v -0.149138 0.599133 -0.535866 +v -0.440746 0.783205 0.000000 +v -0.382125 0.793673 0.224433 +v -0.227491 0.797164 0.387332 +v -0.000000 0.793673 0.457031 +v 0.237775 0.783205 0.404842 +v -0.237775 0.783205 -0.404842 +v -0.324492 0.793673 -0.324492 +v -0.387332 0.797164 -0.227491 +v -0.426127 0.793673 -0.118596 +v 0.535865 0.599133 0.149137 +v 0.448260 0.682112 0.263277 +v 0.339803 0.765755 0.339804 +v -0.263278 0.682112 -0.448260 +v -0.243198 0.765755 -0.414076 +v -0.282230 0.599133 -0.480530 +v -0.426127 0.793673 0.118596 +v -0.317859 0.797164 0.317858 +v -0.122721 0.793673 0.440950 +v 0.125646 0.783205 0.451460 +v -0.332226 0.783205 -0.332226 +v -0.395417 0.793673 -0.232239 +v -0.431937 0.797164 -0.120212 +v -0.441668 0.793673 0.000000 +v 0.588275 0.517481 0.000000 +v 0.567578 0.517481 -0.157963 +v 0.508969 0.517485 -0.298931 +v 0.417675 0.517481 -0.417675 +v 0.298931 0.517485 -0.508969 +v 0.157963 0.517485 -0.567578 +v -0.000000 0.517481 -0.588275 +v -0.157963 0.517481 -0.567578 +v -0.298931 0.517485 -0.508969 +v -0.387332 0.797164 0.227491 +v -0.232240 0.793673 0.395417 +v -0.000000 0.783205 0.467924 +v 0.243198 0.765755 0.414076 +v -0.339804 0.765755 -0.339804 +v -0.404842 0.783205 -0.237775 +v -0.440950 0.793673 -0.122721 +v -0.447686 0.797164 0.000000 +v 0.567578 0.517485 0.157963 +v 0.480530 0.599133 0.282230 +v 0.367859 0.682112 0.367859 +v -0.394341 0.599133 -0.394341 +v -0.367859 0.682112 -0.367859 +v -0.417675 0.517481 -0.417675 +v -0.431937 0.797164 0.120212 +v -0.324492 0.793673 0.324492 +v -0.125646 0.783205 0.451460 +v 0.128512 0.765755 0.461757 +v -0.414076 0.765755 -0.243198 +v -0.451461 0.783205 -0.125646 +v -0.457031 0.793673 0.000000 +v 0.592873 0.437827 -0.165003 +v 0.531651 0.437827 -0.312254 +v 0.436292 0.437827 -0.436292 +v 0.312254 0.437827 -0.531651 +v 0.165003 0.437827 -0.592873 +v -0.000000 0.437827 -0.614496 +v -0.165004 0.437827 -0.592873 +v -0.312255 0.437827 -0.531651 +v -0.436292 0.437827 -0.436292 +v -0.395417 0.793673 0.232239 +v -0.237775 0.783205 0.404842 +v -0.000000 0.765755 0.478597 +v 0.263277 0.682112 0.448260 +v -0.448260 0.682112 -0.263277 +v -0.461757 0.765755 -0.128512 +v -0.467924 0.783205 0.000000 +v -0.440950 0.793673 0.122721 +v 0.592873 0.437827 0.165003 +v 0.508969 0.517485 0.298931 +v 0.394341 0.599133 0.394341 +v -0.508969 0.517485 -0.298931 +v -0.480530 0.599133 -0.282230 +v -0.531651 0.437827 -0.312254 +v -0.332226 0.783205 0.332226 +v -0.128513 0.765755 0.461757 +v 0.139122 0.682112 0.499882 +v -0.499882 0.682112 -0.139122 +v -0.478597 0.765755 0.000000 +v -0.451461 0.783205 0.125646 +v 0.546669 0.360830 -0.321075 +v 0.448614 0.360830 -0.448614 +v 0.321074 0.360830 -0.546669 +v 0.169664 0.360830 -0.609621 +v -0.000000 0.360830 -0.631850 +v -0.169664 0.360830 -0.609621 +v -0.321075 0.360830 -0.546669 +v -0.448615 0.360830 -0.448614 +v -0.546669 0.360830 -0.321075 +v -0.404842 0.783205 0.237775 +v -0.243198 0.765755 0.414076 +v -0.000000 0.682112 0.518110 +v 0.282230 0.599133 0.480530 +v -0.535866 0.599133 -0.149137 +v -0.461757 0.765755 0.128512 +v 0.531651 0.437827 0.312254 +v 0.417675 0.517481 0.417675 +v 0.609621 0.360830 -0.169664 +v -0.592873 0.437827 -0.165003 +v -0.567578 0.517485 -0.157963 +v -0.609621 0.360830 -0.169664 +v -0.339804 0.765755 0.339804 +v -0.139123 0.682112 0.499882 +v 0.149137 0.599133 0.535866 +v -0.555408 0.599133 0.000000 +v -0.499882 0.682112 0.139122 +v -0.414076 0.765755 0.243198 +v 0.609621 0.360830 0.169664 +v 0.552100 0.287158 -0.324265 +v 0.453072 0.287158 -0.453072 +v 0.324265 0.287158 -0.552100 +v 0.171349 0.287158 -0.615677 +v -0.000000 0.287158 -0.638129 +v -0.171350 0.287158 -0.615677 +v -0.324265 0.287158 -0.552100 +v -0.453072 0.287158 -0.453072 +v -0.552100 0.287158 -0.324265 +v -0.615677 0.287158 -0.171349 +v -0.263278 0.682112 0.448260 +v -0.000000 0.599133 0.555408 +v 0.298931 0.517485 0.508969 +v -0.588275 0.517481 0.000000 +v -0.448260 0.682112 0.263277 +v 0.546669 0.360830 0.321075 +v 0.436292 0.437827 0.436292 +v 0.615677 0.287158 -0.171349 +v -0.631850 0.360830 0.000000 +v -0.614496 0.437827 0.000000 +v -0.367859 0.682112 0.367859 +v -0.149138 0.599133 0.535866 +v 0.157963 0.517481 0.567578 +v -0.567578 0.517481 0.157963 +v -0.480530 0.599133 0.282230 +v 0.615677 0.287158 0.171349 +v 0.541877 0.221240 -0.318259 +v 0.444680 0.221240 -0.444680 +v 0.318259 0.221240 -0.541877 +v 0.168176 0.221240 -0.604276 +v -0.000000 0.221240 -0.626311 +v -0.168177 0.221240 -0.604276 +v -0.318259 0.221240 -0.541877 +v -0.444680 0.221240 -0.444680 +v -0.541877 0.221240 -0.318259 +v -0.604277 0.221240 -0.168176 +v -0.282230 0.599133 0.480530 +v -0.000000 0.517481 0.588275 +v 0.312254 0.437827 0.531651 +v -0.592873 0.437827 0.165003 +v -0.535866 0.599133 0.149137 +v -0.394341 0.599133 0.394341 +v 0.552100 0.287158 0.324265 +v 0.448614 0.360830 0.448614 +v 0.604276 0.221240 -0.168176 +v -0.615677 0.287158 0.171349 +v -0.609621 0.360830 0.169664 +v -0.157963 0.517485 0.567578 +v 0.165003 0.437827 0.592873 +v -0.531651 0.437827 0.312254 +v -0.508969 0.517485 0.298931 +v -0.417675 0.517481 0.417675 +v 0.604276 0.221240 0.168176 +v 0.516317 0.166623 -0.303247 +v 0.423705 0.166623 -0.423705 +v 0.303247 0.166623 -0.516317 +v 0.160243 0.166623 -0.575771 +v -0.000000 0.166623 -0.596769 +v -0.160244 0.166623 -0.575771 +v -0.303247 0.166623 -0.516317 +v -0.423705 0.166623 -0.423705 +v -0.516317 0.166623 -0.303247 +v -0.575771 0.166623 -0.160243 +v -0.298931 0.517485 0.508969 +v -0.000000 0.437827 0.614496 +v 0.321074 0.360830 0.546669 +v -0.546669 0.360830 0.321075 +v 0.541877 0.221240 0.318259 +v 0.453072 0.287158 0.453072 +v 0.575771 0.166623 -0.160243 +v -0.596769 0.166623 0.000000 +v -0.604277 0.221240 0.168176 +v -0.552100 0.287158 0.324265 +v -0.165004 0.437827 0.592873 +v 0.169664 0.360830 0.609621 +v -0.448615 0.360830 0.448614 +v -0.436292 0.437827 0.436292 +v -0.312255 0.437827 0.531651 +v 0.575771 0.166623 0.160243 +v 0.483086 0.122640 -0.283731 +v 0.396438 0.122640 -0.396438 +v 0.283731 0.122640 -0.483086 +v 0.149931 0.122640 -0.538718 +v -0.000000 0.122640 -0.558363 +v -0.149931 0.122640 -0.538718 +v -0.283731 0.122640 -0.483086 +v -0.396438 0.122640 -0.396438 +v -0.483087 0.122640 -0.283731 +v -0.538718 0.122640 -0.149931 +v -0.558363 0.122640 0.000000 +v -0.541877 0.221240 0.318259 +v -0.000000 0.360830 0.631850 +v 0.324265 0.287158 0.552100 +v -0.453072 0.287158 0.453072 +v 0.516317 0.166623 0.303247 +v 0.596768 0.166623 0.000000 +v 0.444680 0.221240 0.444680 +v 0.538718 0.122640 -0.149931 +v -0.538718 0.122640 0.149931 +v -0.516317 0.166623 0.303247 +v -0.444680 0.221240 0.444680 +v -0.169664 0.360830 0.609621 +v 0.171349 0.287158 0.615677 +v -0.324265 0.287158 0.552100 +v -0.321075 0.360830 0.546669 +v 0.538718 0.122640 0.149931 +v 0.558363 0.122640 0.000000 +v 0.449858 0.088629 -0.264215 +v 0.369171 0.088629 -0.369171 +v 0.264215 0.088629 -0.449859 +v 0.139618 0.088629 -0.501662 +v -0.000000 0.088629 -0.519957 +v -0.139618 0.088629 -0.501662 +v -0.264215 0.088629 -0.449859 +v -0.369171 0.088629 -0.369171 +v -0.449859 0.088629 -0.264215 +v -0.501662 0.088629 -0.139618 +v -0.519957 0.088629 0.000000 +v -0.501662 0.088629 0.139618 +v -0.575771 0.166623 0.160243 +v -0.423705 0.166623 0.423705 +v -0.000000 0.287158 0.638129 +v 0.318259 0.221240 0.541877 +v -0.318259 0.221240 0.541877 +v 0.483086 0.122640 0.283731 +v 0.423705 0.166623 0.423705 +v 0.501662 0.088629 -0.139618 +v -0.449859 0.088629 0.264215 +v -0.483087 0.122640 0.283731 +v -0.396438 0.122640 0.396438 +v -0.303247 0.166623 0.516317 +v -0.171350 0.287158 0.615677 +v 0.168176 0.221240 0.604276 +v -0.168177 0.221240 0.604276 +v 0.501662 0.088629 0.139618 +v 0.519957 0.088629 0.000000 +v 0.424299 0.063924 -0.249203 +v 0.348195 0.063924 -0.348195 +v 0.249203 0.063924 -0.424298 +v 0.131685 0.063924 -0.473160 +v -0.000000 0.063924 -0.490415 +v -0.131686 0.063924 -0.473160 +v -0.249203 0.063924 -0.424298 +v -0.348196 0.063924 -0.348195 +v -0.424299 0.063924 -0.249203 +v -0.473160 0.063924 -0.131685 +v -0.490415 0.063924 0.000000 +v -0.473160 0.063924 0.131685 +v -0.424299 0.063924 0.249203 +v -0.283731 0.122640 0.483086 +v -0.000000 0.221240 0.626311 +v 0.303247 0.166623 0.516317 +v -0.160244 0.166623 0.575771 +v 0.449858 0.088629 0.264215 +v 0.396438 0.122640 0.396438 +v 0.473160 0.063924 -0.131685 +v -0.348196 0.063924 0.348195 +v -0.369171 0.088629 0.369171 +v -0.264215 0.088629 0.449859 +v -0.149931 0.122640 0.538718 +v 0.160243 0.166623 0.575771 +v -0.000000 0.166623 0.596769 +v 0.473160 0.063924 0.131685 +v 0.490415 0.063924 0.000000 +v 0.414076 0.047860 -0.243198 +v 0.339803 0.047860 -0.339804 +v 0.243198 0.047860 -0.414076 +v 0.128512 0.047860 -0.461757 +v -0.000000 0.047860 -0.478597 +v -0.128513 0.047860 -0.461757 +v -0.243198 0.047860 -0.414076 +v -0.339804 0.047860 -0.339804 +v -0.414076 0.047860 -0.243198 +v -0.461757 0.047860 -0.128512 +v -0.478597 0.047860 0.000000 +v -0.461757 0.047860 0.128512 +v -0.414076 0.047860 0.243198 +v -0.339804 0.047860 0.339804 +v -0.139618 0.088629 0.501662 +v 0.283731 0.122640 0.483086 +v -0.000000 0.122640 0.558363 +v 0.424299 0.063924 0.249203 +v 0.369171 0.088629 0.369171 +v 0.461756 0.047860 -0.128512 +v -0.243198 0.047860 0.414076 +v -0.249203 0.063924 0.424298 +v -0.131686 0.063924 0.473160 +v -0.000000 0.088629 0.519957 +v 0.149931 0.122640 0.538718 +v 0.461756 0.047860 0.128512 +v 0.478596 0.047860 0.000000 +v 0.410719 0.036005 -0.241228 +v 0.337050 0.036005 -0.337050 +v 0.241227 0.036005 -0.410719 +v 0.127471 0.036005 -0.458017 +v -0.000000 0.036005 -0.474720 +v -0.127471 0.036005 -0.458017 +v -0.241228 0.036005 -0.410719 +v -0.337051 0.036005 -0.337050 +v -0.410719 0.036005 -0.241228 +v -0.458017 0.036005 -0.127471 +v -0.474721 0.036005 0.000000 +v -0.458017 0.036005 0.127471 +v -0.410719 0.036005 0.241228 +v -0.337051 0.036005 0.337050 +v -0.241228 0.036005 0.410719 +v -0.000000 0.063924 0.490415 +v 0.264215 0.088629 0.449859 +v 0.139618 0.088629 0.501662 +v 0.414076 0.047860 0.243198 +v 0.348195 0.063924 0.348195 +v 0.458017 0.036005 -0.127471 +v -0.127471 0.036005 0.458017 +v -0.128513 0.047860 0.461757 +v -0.000000 0.047860 0.478597 +v 0.131685 0.063924 0.473160 +v 0.458017 0.036005 0.127471 +v 0.474720 0.036005 0.000000 +v 0.394137 0.024816 -0.231489 +v 0.323442 0.024816 -0.323442 +v 0.231489 0.024816 -0.394137 +v 0.122324 0.024816 -0.439524 +v -0.000000 0.024816 -0.455554 +v -0.122325 0.024816 -0.439524 +v -0.231489 0.024816 -0.394137 +v -0.323442 0.024816 -0.323442 +v -0.394137 0.024816 -0.231489 +v -0.439524 0.024816 -0.122325 +v -0.455554 0.024816 0.000000 +v -0.439524 0.024816 0.122325 +v -0.394137 0.024816 0.231489 +v -0.323442 0.024816 0.323442 +v -0.231489 0.024816 0.394137 +v -0.122325 0.024816 0.439524 +v 0.128512 0.047860 0.461757 +v 0.249203 0.063924 0.424298 +v 0.410719 0.036005 0.241228 +v 0.339803 0.047860 0.339804 +v 0.439524 0.024816 -0.122325 +v -0.000000 0.036005 0.474720 +v -0.000000 0.024816 0.455554 +v 0.127471 0.036005 0.458017 +v 0.243198 0.047860 0.414076 +v 0.439524 0.024816 0.122325 +v 0.455554 0.024816 0.000000 +v 0.354551 0.014956 -0.208238 +v 0.290957 0.014956 -0.290957 +v 0.208238 0.014956 -0.354551 +v 0.110038 0.014956 -0.395378 +v -0.000000 0.014956 -0.409797 +v -0.110038 0.014956 -0.395378 +v -0.208239 0.014956 -0.354551 +v -0.290957 0.014956 -0.290957 +v -0.354551 0.014956 -0.208238 +v -0.395378 0.014956 -0.110038 +v -0.409797 0.014956 0.000000 +v -0.395378 0.014956 0.110038 +v -0.354551 0.014956 0.208238 +v -0.290957 0.014956 0.290957 +v -0.208239 0.014956 0.354551 +v -0.110038 0.014956 0.395378 +v -0.000000 0.014956 0.409797 +v 0.241227 0.036005 0.410719 +v 0.337050 0.036005 0.337050 +v 0.394137 0.024816 0.231489 +v 0.395378 0.014956 -0.110038 +v 0.122324 0.024816 0.439524 +v 0.110038 0.014956 0.395378 +v 0.231489 0.024816 0.394137 +v 0.395378 0.014956 0.110038 +v 0.409797 0.014956 0.000000 +v 0.282184 0.007090 -0.165735 +v 0.231570 0.007090 -0.231570 +v 0.165735 0.007090 -0.282185 +v 0.087579 0.007090 -0.314679 +v -0.000000 0.007090 -0.326154 +v -0.087579 0.007090 -0.314679 +v -0.165735 0.007090 -0.282185 +v -0.231570 0.007090 -0.231570 +v -0.282184 0.007090 -0.165735 +v -0.314679 0.007090 -0.087579 +v -0.326155 0.007090 0.000000 +v -0.314679 0.007090 0.087579 +v -0.282184 0.007090 0.165735 +v -0.231570 0.007090 0.231570 +v -0.165735 0.007090 0.282185 +v -0.087579 0.007090 0.314679 +v -0.000000 0.007090 0.326154 +v 0.087579 0.007090 0.314679 +v 0.323442 0.024816 0.323442 +v 0.354551 0.014956 0.208238 +v 0.314679 0.007090 -0.087579 +v 0.208238 0.014956 0.354551 +v 0.165735 0.007090 0.282185 +v 0.290957 0.014956 0.290957 +v 0.314679 0.007090 0.087579 +v 0.326154 0.007090 0.000000 +v 0.167259 0.001883 -0.098236 +v 0.137258 0.001883 -0.137259 +v 0.098236 0.001883 -0.167259 +v 0.051910 0.001883 -0.186520 +v -0.000000 0.001883 -0.193322 +v -0.051911 0.001883 -0.186520 +v -0.098237 0.001883 -0.167259 +v -0.137259 0.001883 -0.137259 +v -0.167259 0.001883 -0.098236 +v -0.186520 0.001883 -0.051911 +v -0.193323 0.001883 0.000000 +v -0.186520 0.001883 0.051911 +v -0.167259 0.001883 0.098236 +v -0.137259 0.001883 0.137259 +v -0.098237 0.001883 0.167259 +v -0.051911 0.001883 0.186520 +v -0.000000 0.001883 0.193322 +v 0.051910 0.001883 0.186520 +v 0.098236 0.001883 0.167259 +v 0.282184 0.007090 0.165735 +v 0.186520 0.001883 -0.051911 +v 0.231570 0.007090 0.231570 +v 0.137258 0.001883 0.137259 +v 0.186520 0.001883 0.051911 +v 0.193322 0.001883 0.000000 +v -0.000000 0.000000 0.000000 +v 0.167259 0.001883 0.098236 +v 0.063813 0.861474 0.000000 +v 0.054654 0.888729 0.000000 +v 0.052734 0.888729 0.014691 +v 0.061568 0.861474 0.017135 +v 0.061568 0.861474 -0.017135 +v 0.072979 0.919969 0.020357 +v 0.111968 0.841089 0.000000 +v 0.047296 0.888729 0.027792 +v 0.052734 0.888729 -0.014691 +v 0.108028 0.841089 -0.030065 +v 0.075630 0.919969 0.000000 +v 0.065466 0.919969 0.038494 +v 0.108028 0.841089 0.030065 +v 0.055210 0.861474 0.032427 +v 0.055210 0.861474 -0.032427 +v 0.096873 0.841089 -0.056896 +v 0.100064 0.951211 0.027927 +v 0.089769 0.951211 0.052799 +v 0.183167 0.826023 0.000000 +v 0.176722 0.826023 -0.049184 +v 0.038821 0.888729 0.038821 +v 0.053751 0.919969 0.053751 +v 0.047296 0.888729 -0.027792 +v 0.072979 0.919969 -0.020357 +v 0.158473 0.826023 -0.093076 +v 0.103696 0.951211 0.000000 +v 0.073714 0.951211 0.073714 +v 0.176722 0.826023 0.049184 +v 0.096873 0.841089 0.056896 +v 0.045307 0.861474 0.045307 +v 0.079497 0.841089 -0.079497 +v 0.045307 0.861474 -0.045307 +v 0.130048 0.826023 -0.130048 +v 0.111754 0.978466 0.031195 +v 0.100259 0.978466 0.058974 +v 0.082330 0.978466 0.082330 +v 0.263228 0.813615 0.000000 +v 0.253966 0.813615 -0.070682 +v 0.227741 0.813615 -0.133759 +v 0.027792 0.888729 0.047296 +v 0.038494 0.919969 0.065466 +v 0.052799 0.951211 0.089769 +v 0.038821 0.888729 -0.038821 +v 0.065466 0.919969 -0.038494 +v 0.100064 0.951211 -0.027927 +v 0.186892 0.813615 -0.186892 +v 0.115809 0.978466 0.000000 +v 0.058974 0.978466 0.100259 +v 0.253966 0.813615 0.070682 +v 0.158473 0.826023 0.093076 +v 0.079497 0.841089 0.079497 +v 0.032426 0.861474 0.055210 +v 0.093076 0.826023 -0.158473 +v 0.056896 0.841089 -0.096873 +v 0.032426 0.861474 -0.055210 +v 0.133759 0.813615 -0.227741 +v 0.085811 0.997741 0.023955 +v 0.076985 0.997741 0.045285 +v 0.063219 0.997741 0.063219 +v 0.045285 0.997741 0.076986 +v 0.337972 0.801206 0.000000 +v 0.326081 0.801206 -0.090752 +v 0.292408 0.801206 -0.171740 +v 0.239960 0.801206 -0.239960 +v 0.014691 0.888729 0.052735 +v 0.020357 0.919969 0.072979 +v 0.027927 0.951211 0.100064 +v 0.031195 0.978466 0.111754 +v 0.027792 0.888729 -0.047296 +v 0.053751 0.919969 -0.053751 +v 0.089769 0.951211 -0.052799 +v 0.111754 0.978466 -0.031195 +v 0.171740 0.801206 -0.292408 +v 0.088924 0.997741 0.000000 +v 0.023955 0.997741 0.085811 +v 0.326081 0.801206 0.090752 +v 0.227741 0.813615 0.133759 +v 0.130048 0.826023 0.130048 +v 0.056896 0.841089 0.096873 +v 0.017135 0.861474 0.061568 +v 0.070682 0.813615 -0.253966 +v 0.049184 0.826023 -0.176722 +v 0.030065 0.841089 -0.108029 +v 0.017135 0.861474 -0.061568 +v 0.090752 0.801206 -0.326081 +v -0.000000 1.005054 0.000000 +v 0.393218 0.786140 0.000000 +v 0.379380 0.786140 -0.105586 +v 0.340206 0.786140 -0.199813 +v 0.279184 0.786140 -0.279184 +v 0.199813 0.786140 -0.340206 +v -0.000000 0.888729 0.054654 +v -0.000000 0.919969 0.075630 +v -0.000000 0.951211 0.103696 +v -0.000000 0.978466 0.115809 +v -0.000000 0.997741 0.088925 +v 0.014691 0.888729 -0.052735 +v 0.038494 0.919969 -0.065466 +v 0.073714 0.951211 -0.073714 +v 0.100259 0.978466 -0.058974 +v 0.085811 0.997741 -0.023955 +v 0.105586 0.786140 -0.379381 +v 0.379380 0.786140 0.105586 +v 0.292408 0.801206 0.171740 +v 0.186892 0.813615 0.186892 +v 0.093076 0.826023 0.158473 +v 0.030065 0.841089 0.108029 +v -0.000000 0.861474 0.063813 +v -0.000000 0.801206 -0.337972 +v -0.000000 0.813615 -0.263228 +v -0.000000 0.826023 -0.183167 +v -0.000000 0.841089 -0.111968 +v -0.000000 0.861474 -0.063813 +v -0.000000 0.786140 -0.393218 +v 0.076985 0.997741 -0.045285 +v -0.023955 0.997741 0.085811 +v 0.414784 0.765755 0.000000 +v 0.400190 0.765755 -0.111377 +v 0.358865 0.765755 -0.210772 +v 0.294497 0.765755 -0.294497 +v 0.210772 0.765755 -0.358865 +v 0.111377 0.765755 -0.400190 +v -0.014691 0.888729 0.052735 +v -0.020357 0.919969 0.072979 +v -0.027927 0.951211 0.100064 +v -0.031195 0.978466 0.111754 +v -0.000000 0.888729 -0.054654 +v 0.020357 0.919969 -0.072979 +v 0.052799 0.951211 -0.089769 +v 0.082330 0.978466 -0.082330 +v -0.000000 0.765755 -0.414784 +v 0.063219 0.997741 -0.063219 +v -0.045285 0.997741 0.076986 +v 0.400190 0.765755 0.111377 +v 0.340206 0.786140 0.199813 +v 0.239960 0.801206 0.239960 +v 0.133759 0.813615 0.227741 +v 0.049184 0.826023 0.176722 +v -0.000000 0.841089 0.111968 +v -0.017135 0.861474 0.061568 +v -0.105586 0.786140 -0.379381 +v -0.090752 0.801206 -0.326081 +v -0.070682 0.813615 -0.253966 +v -0.049184 0.826023 -0.176722 +v -0.030066 0.841089 -0.108029 +v -0.017135 0.861474 -0.061568 +v -0.111377 0.765755 -0.400190 +v 0.045285 0.997741 -0.076986 +v -0.063220 0.997741 0.063219 +v 0.414952 0.750806 0.115486 +v 0.430085 0.750806 0.000000 +v 0.414952 0.750806 -0.115486 +v 0.372103 0.750806 -0.218547 +v 0.305360 0.750806 -0.305360 +v 0.218547 0.750806 -0.372103 +v 0.115486 0.750806 -0.414952 +v -0.000000 0.750806 -0.430085 +v -0.027793 0.888729 0.047296 +v -0.038494 0.919969 0.065466 +v -0.052799 0.951211 0.089769 +v -0.058974 0.978466 0.100259 +v -0.014691 0.888729 -0.052735 +v -0.000000 0.919969 -0.075630 +v 0.027927 0.951211 -0.100064 +v 0.058974 0.978466 -0.100259 +v -0.115486 0.750806 -0.414952 +v 0.023955 0.997741 -0.085811 +v -0.076986 0.997741 0.045285 +v 0.372103 0.750806 0.218547 +v 0.358865 0.765755 0.210772 +v 0.279184 0.786140 0.279184 +v 0.171740 0.801206 0.292408 +v 0.070682 0.813615 0.253966 +v -0.000000 0.826023 0.183167 +v -0.030066 0.841089 0.108029 +v -0.032427 0.861474 0.055210 +v -0.210772 0.765755 -0.358865 +v -0.199813 0.786140 -0.340206 +v -0.171740 0.801206 -0.292408 +v -0.133759 0.813615 -0.227741 +v -0.093076 0.826023 -0.158473 +v -0.056896 0.841089 -0.096873 +v -0.032427 0.861474 -0.055210 +v -0.218547 0.750806 -0.372103 +v 0.031195 0.978466 -0.111754 +v -0.000000 0.997741 -0.088925 +v -0.082331 0.978466 0.082330 +v -0.085811 0.997741 0.023955 +v 0.305360 0.750806 0.305360 +v 0.294497 0.765755 0.294497 +v -0.038821 0.888729 0.038821 +v -0.053751 0.919969 0.053751 +v -0.073714 0.951211 0.073714 +v -0.027793 0.888729 -0.047296 +v -0.020357 0.919969 -0.072979 +v -0.000000 0.951211 -0.103696 +v -0.305360 0.750806 -0.305360 +v -0.294497 0.765755 -0.294497 +v -0.000000 0.978466 -0.115809 +v -0.023955 0.997741 -0.085811 +v -0.100259 0.978466 0.058974 +v -0.088925 0.997741 0.000000 +v 0.210772 0.765755 0.358865 +v 0.218547 0.750806 0.372103 +v 0.199813 0.786140 0.340206 +v 0.090752 0.801206 0.326081 +v -0.000000 0.813615 0.263228 +v -0.049184 0.826023 0.176722 +v -0.056896 0.841089 0.096873 +v -0.045307 0.861474 0.045307 +v -0.279185 0.786140 -0.279184 +v -0.239960 0.801206 -0.239960 +v -0.186892 0.813615 -0.186892 +v -0.130049 0.826023 -0.130048 +v -0.079497 0.841089 -0.079497 +v -0.045307 0.861474 -0.045307 +v -0.372103 0.750806 -0.218547 +v -0.358865 0.765755 -0.210772 +v -0.031195 0.978466 -0.111754 +v -0.045285 0.997741 -0.076986 +v -0.111754 0.978466 0.031195 +v -0.085811 0.997741 -0.023955 +v 0.111377 0.765755 0.400190 +v 0.115486 0.750806 0.414952 +v -0.047296 0.888729 0.027792 +v -0.065466 0.919969 0.038494 +v -0.089770 0.951211 0.052799 +v -0.038821 0.888729 -0.038821 +v -0.038494 0.919969 -0.065466 +v -0.027927 0.951211 -0.100064 +v -0.414952 0.750806 -0.115486 +v -0.400190 0.765755 -0.111377 +v -0.058974 0.978466 -0.100259 +v -0.063220 0.997741 -0.063219 +v -0.115809 0.978466 0.000000 +v -0.076986 0.997741 -0.045285 +v 0.105586 0.786140 0.379381 +v -0.000000 0.765755 0.414784 +v -0.000000 0.750806 0.430085 +v -0.000000 0.801206 0.337972 +v -0.070682 0.813615 0.253966 +v -0.093076 0.826023 0.158473 +v -0.079497 0.841089 0.079497 +v -0.055210 0.861474 0.032427 +v -0.340206 0.786140 -0.199813 +v -0.292408 0.801206 -0.171740 +v -0.227741 0.813615 -0.133759 +v -0.158473 0.826023 -0.093076 +v -0.096873 0.841089 -0.056896 +v -0.055210 0.861474 -0.032427 +v -0.430085 0.750806 0.000000 +v -0.414784 0.765755 0.000000 +v -0.052799 0.951211 -0.089769 +v -0.082331 0.978466 -0.082330 +v -0.100064 0.951211 0.027927 +v -0.111754 0.978466 -0.031195 +v -0.000000 0.786140 0.393218 +v -0.115486 0.750806 0.414952 +v -0.111377 0.765755 0.400190 +v -0.052735 0.888729 0.014691 +v -0.072979 0.919969 0.020357 +v -0.047296 0.888729 -0.027792 +v -0.053751 0.919969 -0.053751 +v -0.414952 0.750806 0.115486 +v -0.400190 0.765755 0.111377 +v -0.379381 0.786140 -0.105586 +v -0.073714 0.951211 -0.073714 +v -0.100259 0.978466 -0.058974 +v -0.103696 0.951211 0.000000 +v -0.105586 0.786140 0.379381 +v -0.218547 0.750806 0.372103 +v -0.210772 0.765755 0.358865 +v -0.090752 0.801206 0.326081 +v -0.133759 0.813615 0.227741 +v -0.130049 0.826023 0.130048 +v -0.096873 0.841089 0.056896 +v -0.061568 0.861474 0.017135 +v -0.326081 0.801206 -0.090752 +v -0.253966 0.813615 -0.070682 +v -0.176722 0.826023 -0.049184 +v -0.108029 0.841089 -0.030065 +v -0.061568 0.861474 -0.017135 +v -0.372103 0.750806 0.218547 +v -0.358865 0.765755 0.210772 +v -0.393219 0.786140 0.000000 +v -0.089770 0.951211 -0.052799 +v -0.100064 0.951211 -0.027927 +v -0.199813 0.786140 0.340206 +v -0.305360 0.750806 0.305360 +v -0.294497 0.765755 0.294497 +v -0.054655 0.888729 0.000000 +v -0.075630 0.919969 0.000000 +v -0.052735 0.888729 -0.014691 +v -0.065466 0.919969 -0.038494 +v -0.379381 0.786140 0.105586 +v -0.171740 0.801206 0.292408 +v -0.279185 0.786140 0.279184 +v -0.186892 0.813615 0.186892 +v -0.158473 0.826023 0.093076 +v -0.108029 0.841089 0.030065 +v -0.063813 0.861474 0.000000 +v -0.337972 0.801206 0.000000 +v -0.263228 0.813615 0.000000 +v -0.183167 0.826023 0.000000 +v -0.111968 0.841089 0.000000 +v -0.340206 0.786140 0.199813 +v -0.072979 0.919969 -0.020357 +v -0.239960 0.801206 0.239960 +v -0.326081 0.801206 0.090752 +v -0.292408 0.801206 0.171740 +v -0.227741 0.813615 0.133759 +v -0.176722 0.826023 0.049184 +v -0.253966 0.813615 0.070682 +v -0.526706 0.651362 -0.039883 +v -0.534329 0.646030 0.000000 +v -0.619922 0.238069 -0.071790 +v -0.624826 0.259599 -0.063813 +v -0.638129 0.287158 0.000000 +v -0.631184 0.277569 0.039883 +v -0.501666 0.699221 -0.063813 +v -0.508714 0.682112 -0.071712 +v -0.611709 0.194244 0.000000 +v -0.608883 0.198681 0.039883 +v -0.517593 0.664661 0.063813 +v -0.508714 0.682112 0.071712 +v -0.631184 0.277569 -0.039883 +v -0.624828 0.259599 0.063813 +v -0.615480 0.216617 0.063578 +v -0.615553 0.216807 -0.063813 +v -0.517593 0.664661 -0.063813 +v -0.498530 0.712498 -0.039883 +v -0.619922 0.238069 0.071790 +v -0.526706 0.651362 0.039883 +v -0.608884 0.198682 -0.039883 +v 0.605100 0.399712 0.137265 +v 0.613258 0.341675 0.154354 +v 0.605956 0.463769 0.000000 +v 0.600959 0.444810 -0.085753 +v 0.613258 0.341675 -0.154354 +v 0.605101 0.399712 -0.137265 +v 0.600960 0.444810 0.085753 +v 0.121642 0.750009 -0.437072 +v -0.000000 0.750009 -0.453012 +v 0.453011 0.750009 0.000000 +v 0.437073 0.750009 -0.121642 +v -0.453012 0.750009 0.000000 +v -0.437073 0.750009 -0.121642 +v -0.230198 0.750009 0.391939 +v -0.321639 0.750009 0.321639 +v -0.391940 0.750009 0.230197 +v -0.437073 0.750009 0.121642 +v 0.121642 0.750009 0.437072 +v -0.000000 0.750009 0.453012 +v -0.121642 0.750009 0.437072 +v 0.437073 0.750009 0.121642 +v 0.391939 0.750009 0.230197 +v 0.321638 0.750009 -0.321639 +v 0.230197 0.750009 -0.391940 +v -0.121642 0.750009 -0.437072 +v 0.391939 0.750009 -0.230197 +v 0.321638 0.750009 0.321639 +v 0.230197 0.750009 0.391940 +v -0.230198 0.750009 -0.391939 +v -0.501255 0.717792 0.000000 +v 0.617684 0.235930 0.085941 +v 0.625577 0.219883 0.000000 +v -0.321639 0.750009 -0.321639 +v -0.391940 0.750009 -0.230197 +v -0.498530 0.712498 0.039883 +v -0.501667 0.699221 0.063813 +v 0.617684 0.235930 -0.085941 +v 0.619427 0.283145 -0.137236 +v 0.619427 0.283145 0.137236 +vn -0.901883 0.415418 0.118168 +vn -0.905637 0.407056 0.118656 +vn -0.877041 0.418744 0.235298 +vn 0.058443 -0.998260 0.000732 +vn 0.015107 -0.999878 0.000183 +vn 0.014557 -0.949278 0.314035 +vn 0.056703 -0.947539 0.314524 +vn 0.162053 -0.986755 0.002014 +vn 0.157933 -0.933592 0.321604 +vn 0.392376 -0.919767 0.004334 +vn 0.378307 -0.856655 0.350688 +vn 0.783776 -0.620991 0.005249 +vn 0.726829 -0.553880 0.406079 +vn 0.994812 -0.101627 0.001984 +vn 0.908139 -0.082766 0.410321 +vn 0.003082 -0.939787 0.341685 +vn 0.002167 -0.619495 0.784967 +vn 0.011536 -0.679403 0.733634 +vn 0.044679 -0.675588 0.735923 +vn 0.123325 -0.652272 0.747856 +vn 0.275399 -0.556871 0.783593 +vn 0.460067 -0.316263 0.829615 +vn 0.563036 -0.041200 0.825373 +vn -0.000427 0.122166 0.992492 +vn 0.000397 0.003632 0.999969 +vn 0.002869 0.011841 0.999908 +vn 0.004852 0.029298 0.999542 +vn -0.008179 0.053499 0.998505 +vn -0.046510 0.041536 0.998047 +vn -0.039155 0.003113 0.999207 +vn -0.850551 0.473769 -0.228217 +vn -0.897885 0.424177 -0.117649 +vn -0.880886 0.473281 0.000000 +vn -0.013611 0.682394 0.730827 +vn -0.053896 0.680441 0.730796 +vn -0.147557 0.656789 0.739464 +vn -0.325968 0.560564 0.761223 +vn -0.537645 0.315806 0.781762 +vn -0.611530 0.029939 0.790613 +vn -0.904172 0.427137 0.000000 +vn -0.897885 0.424146 0.117618 +vn -0.020112 0.949461 0.313150 +vn -0.081820 0.945433 0.315287 +vn -0.227699 0.916379 0.329173 +vn -0.504196 0.785302 0.359203 +vn -0.810633 0.443220 0.382611 +vn -0.921232 0.039705 0.386944 +vn -0.020569 0.949400 -0.313334 +vn -0.021729 0.999756 -0.000092 +vn -0.004242 0.950468 -0.310770 +vn -0.088260 0.996094 -0.000488 +vn -0.246895 0.969024 -0.001343 +vn -0.549730 0.835322 -0.002350 +vn -0.880673 0.473647 -0.001984 +vn -0.999084 0.042146 -0.000610 +vn -0.877041 0.418744 -0.235298 +vn -0.920286 0.391156 0.000000 +vn -0.905637 0.407056 -0.118656 +vn -0.083132 0.945006 -0.316202 +vn -0.230201 0.914823 -0.331797 +vn -0.505570 0.782800 -0.362743 +vn -0.808710 0.444960 -0.384625 +vn -0.920835 0.042055 -0.387646 +vn -0.897885 0.424146 -0.117618 +vn -0.901883 0.415448 -0.118168 +vn -0.014161 0.682394 -0.730796 +vn -0.055361 0.680074 -0.731010 +vn -0.150029 0.655660 -0.739982 +vn -0.327616 0.560594 -0.760491 +vn -0.537431 0.320933 -0.779809 +vn -0.611988 0.033387 -0.790155 +vn 0.015168 -0.949339 -0.313852 +vn 0.011902 -0.679403 -0.733634 +vn 0.003265 -0.939817 -0.341594 +vn 0.000183 0.004212 -0.999969 +vn 0.003510 0.014008 -0.999878 +vn 0.005921 0.035951 -0.999329 +vn -0.010132 0.064333 -0.997864 +vn -0.051576 0.048463 -0.997467 +vn -0.041597 0.003998 -0.999115 +vn 0.003082 -0.620106 -0.784478 +vn -0.000031 0.122440 -0.992462 +vn -0.897885 0.424177 0.117649 +vn 0.046449 -0.674398 -0.736869 +vn 0.125980 -0.648946 -0.750298 +vn 0.275430 -0.552477 -0.786676 +vn 0.455519 -0.320536 -0.830500 +vn 0.561693 -0.046480 -0.826014 +vn -0.888668 0.391644 0.238441 +vn 0.058046 -0.947630 -0.314005 +vn 0.159948 -0.933836 -0.319865 +vn 0.380169 -0.857753 -0.345927 +vn 0.725547 -0.560930 -0.398602 +vn 0.908597 -0.089236 -0.407971 +vn 0.003235 -0.999969 0.000031 +vn 0.973144 0.230110 0.000824 +vn 0.890896 0.211737 0.401776 +vn 0.912900 0.408094 0.002533 +vn 0.836970 0.380932 0.392834 +vn 0.829035 0.559160 0.003784 +vn 0.764519 0.528550 0.368969 +vn 0.718650 0.695334 0.003937 +vn 0.668294 0.663717 0.335917 +vn 0.579577 0.814905 0.002838 +vn 0.542650 0.779687 0.312357 +vn 0.495163 0.868770 0.002258 +vn 0.458052 0.820643 0.341624 +vn 0.561205 0.137028 0.816218 +vn 0.532029 0.253456 0.807886 +vn 0.497543 0.363445 0.787591 +vn 0.449538 0.472060 0.758293 +vn 0.373669 0.563555 0.736686 +vn 0.289041 0.531114 0.796442 +vn -0.023225 -0.005249 0.999695 +vn -0.016785 -0.010254 0.999786 +vn -0.011444 -0.012940 0.999847 +vn -0.009796 -0.013276 0.999847 +vn -0.014801 -0.013916 0.999786 +vn -0.089755 -0.176122 0.980255 +vn -0.585772 -0.152379 0.795984 +vn -0.538896 -0.288766 0.791314 +vn -0.484146 -0.407910 0.774071 +vn -0.424635 -0.509781 0.748161 +vn -0.355907 -0.584765 0.728935 +vn -0.889828 -0.237159 0.389782 +vn -0.808740 -0.446852 0.382366 +vn -0.702475 -0.613269 0.361095 +vn -0.590625 -0.734855 0.333293 +vn -0.483291 -0.816767 0.315104 +vn -0.912076 0.409955 0.000000 +vn -0.965606 -0.259987 -0.000458 +vn -0.872433 -0.488693 -0.001465 +vn -0.748436 -0.663167 -0.002197 +vn -0.621601 -0.783288 -0.002136 +vn -0.507065 -0.861873 -0.001251 +vn -0.438215 -0.854366 0.279183 +vn -0.456130 -0.889889 -0.000732 +vn -0.889126 -0.238868 -0.390332 +vn -0.807001 -0.448531 -0.384075 +vn -0.700980 -0.613392 -0.363750 +vn -0.590442 -0.733757 -0.336039 +vn -0.484787 -0.815332 -0.316477 +vn -0.440962 -0.852931 -0.279305 +vn -0.359691 -0.584185 -0.727531 +vn -0.358074 -0.682241 -0.637410 +vn -0.585467 -0.154668 -0.795770 +vn -0.538499 -0.291696 -0.790490 +vn -0.484512 -0.409772 -0.772851 +vn -0.426496 -0.510056 -0.746910 +vn -0.909543 -0.399274 -0.115207 +vn -0.971191 -0.204688 -0.121891 +vn -0.912931 -0.326609 -0.244606 +vn -0.020478 -0.017853 -0.999603 +vn -0.024537 -0.005737 -0.999664 +vn -0.020844 -0.012207 -0.999695 +vn -0.017548 -0.016846 -0.999695 +vn -0.016724 -0.018097 -0.999695 +vn -0.909116 -0.400311 0.115055 +vn -0.873775 -0.472610 0.114475 +vn -0.795892 -0.566485 0.213538 +vn -0.353069 -0.684103 0.638203 +vn 0.559679 0.139714 -0.816828 +vn 0.528581 0.255501 -0.809473 +vn 0.494217 0.362987 -0.789911 +vn 0.449049 0.469283 -0.760308 +vn 0.378246 0.560869 -0.736412 +vn -0.091983 -0.174383 -0.980346 +vn 0.295267 0.530625 -0.794488 +vn 0.890500 0.214759 -0.401044 +vn 0.836634 0.384075 -0.390515 +vn 0.765191 0.530198 -0.365123 +vn 0.671041 0.663228 -0.331339 +vn 0.547929 0.777642 -0.308206 +vn 0.464522 0.818842 -0.337199 +vn 0.931486 0.265572 -0.248543 +vn 0.939543 0.342357 0.000000 +vn 0.947539 0.295114 -0.122684 +vn -0.351421 0.936186 0.001953 +vn -0.144444 0.989502 0.003174 +vn -0.126743 0.878811 0.459975 +vn -0.716758 0.697287 -0.000946 +vn -0.299997 0.838313 0.455214 +vn -0.621876 0.660207 0.421155 +vn -0.901822 0.432081 -0.004517 +vn -0.807031 0.443434 0.389904 +vn -0.930204 0.366863 -0.008484 +vn -0.824549 0.383312 0.416059 +vn -0.850673 0.525529 -0.011628 +vn -0.722465 0.508988 0.467910 +vn -0.668447 0.743645 -0.011139 +vn -0.531449 0.686514 0.496170 +vn -0.116459 0.505448 0.854946 +vn -0.258400 0.470656 0.843593 +vn -0.407605 0.396985 0.822321 +vn -0.450270 0.352367 0.820399 +vn -0.385876 0.395734 0.833338 +vn -0.270669 0.487838 0.829890 +vn 0.141606 -0.001190 0.989898 +vn -0.067690 0.525346 0.848170 +vn 0.989593 0.100253 0.103122 +vn 0.970244 0.213324 0.114475 +vn 0.960418 0.152654 0.232917 +vn 0.241829 0.092502 0.965880 +vn 0.209296 0.170660 0.962828 +vn 0.096194 0.178625 0.979186 +vn 0.009552 0.154332 0.987945 +vn -0.000122 0.151952 0.988372 +vn 0.361248 -0.477279 0.801019 +vn 0.607929 -0.282540 0.741997 +vn 0.679220 -0.106754 0.726096 +vn 0.583911 -0.078524 0.807978 +vn 0.402722 -0.205237 0.891995 +vn 0.279519 -0.338694 0.898404 +vn 0.488601 -0.768700 0.412671 +vn 0.784570 -0.501511 0.364544 +vn 0.893918 -0.279611 0.350291 +vn 0.861415 -0.285287 0.420179 +vn 0.679373 -0.540452 0.496323 +vn 0.458327 -0.754540 0.469588 +vn 0.524155 -0.851588 -0.000153 +vn 0.827143 -0.561968 0.001679 +vn 0.943205 -0.332133 0.003479 +vn 0.933256 -0.359081 0.005737 +vn 0.756859 -0.653493 0.006470 +vn 0.492843 -0.870083 0.004120 +vn 0.322489 -0.946562 -0.001129 +vn 0.912839 -0.326609 0.244942 +vn 0.824396 -0.565996 0.000000 +vn 0.894162 -0.447676 0.000000 +vn 0.486557 -0.770501 -0.411756 +vn 0.783990 -0.504074 -0.362285 +vn 0.895199 -0.281899 -0.345134 +vn 0.863735 -0.289010 -0.412824 +vn 0.682119 -0.544267 -0.488296 +vn 0.461928 -0.758202 -0.460128 +vn 0.357463 -0.479141 -0.801599 +vn 0.605884 -0.285867 -0.742393 +vn 0.679739 -0.108646 -0.725333 +vn 0.583636 -0.077883 -0.808222 +vn 0.401440 -0.199225 -0.893918 +vn 0.281961 -0.330638 -0.900632 +vn 0.135228 -0.002380 -0.990783 +vn 0.235755 0.091128 -0.967498 +vn 0.200720 0.170629 -0.964660 +vn 0.086123 0.184576 -0.979003 +vn 0.000671 0.174322 -0.984680 +vn -0.007141 0.169012 -0.985565 +vn 0.966613 -0.042848 -0.252602 +vn 0.960418 0.152654 -0.232917 +vn 0.989593 0.100223 -0.103092 +vn -0.119297 0.503342 -0.855770 +vn -0.261269 0.472793 -0.841517 +vn -0.414075 0.399792 -0.817713 +vn -0.459700 0.357036 -0.813105 +vn -0.394024 0.408490 -0.823298 +vn -0.277871 0.487381 -0.827754 +vn -0.072207 0.520127 -0.851009 +vn -0.298654 0.840297 -0.452376 +vn -0.617512 0.663961 -0.421613 +vn -0.801324 0.450209 -0.393872 +vn -0.819422 0.389691 -0.420270 +vn -0.721274 0.506912 -0.471969 +vn -0.538347 0.670644 -0.510239 +vn -0.482009 0.876125 -0.005127 +vn -0.394635 0.815363 0.423536 +vn -0.321909 0.946745 -0.002594 +vn -0.255287 0.921995 0.291086 +vn 0.004242 0.999969 0.000397 +vn -0.002960 0.999939 -0.010102 +vn 0.853450 0.521073 -0.007050 +vn 0.392041 0.688986 -0.609546 +vn 0.805170 -0.592517 -0.023621 +vn 0.588763 -0.206122 -0.781579 +vn 0.681478 -0.731040 -0.033296 +vn 0.485031 -0.441237 -0.754967 +vn -0.206824 0.638203 0.741539 +vn -0.129490 0.862056 0.489944 +vn -0.033418 0.999176 0.022340 +vn 0.047700 0.864040 -0.501114 +vn 0.099307 0.538743 -0.836573 +vn 0.053560 0.251839 -0.966277 +vn 0.020112 0.322611 0.946287 +vn 0.021943 0.748894 0.662282 +vn -0.025941 0.995605 0.089908 +vn -0.059175 0.930876 -0.360424 +vn -0.080172 0.784448 -0.614948 +vn -0.142582 0.557604 -0.817743 +vn 0.281747 -0.174993 0.943388 +vn 0.303903 0.444136 0.842830 +vn 0.034333 0.983764 0.175970 +vn -0.113865 0.956420 -0.268777 +vn -0.155339 0.858852 -0.488021 +vn -0.207404 0.641865 -0.738182 +vn 0.467238 -0.683187 0.561144 +vn 0.699515 0.004364 0.714560 +vn 0.355296 0.891934 0.279641 +vn -0.170354 0.971465 -0.164861 +vn -0.245552 0.901181 -0.357097 +vn -0.248726 0.651082 -0.717063 +vn 0.494430 -0.869167 0.006317 +vn 0.933134 -0.358898 0.019868 +vn 0.703146 0.710685 0.021790 +vn -0.203650 0.978942 -0.012574 +vn -0.326456 0.942869 -0.066073 +vn -0.397595 0.857082 -0.327525 +vn 0.460616 -0.712546 -0.529221 +vn 0.695486 -0.098544 -0.711722 +vn 0.397534 0.853816 -0.336070 +vn -0.198248 0.963439 0.180151 +vn -0.306833 0.888516 0.341075 +vn -0.393689 0.807672 0.438887 +vn 0.276559 -0.211951 -0.937315 +vn 0.294626 0.366161 -0.882656 +vn 0.046632 0.973235 -0.224982 +vn -0.146733 0.912168 0.382611 +vn -0.202643 0.700797 0.683950 +vn -0.232673 0.506485 0.830226 +vn 0.011689 0.309397 -0.950835 +vn 0.013245 0.708640 -0.705435 +vn -0.027589 0.995758 -0.087680 +vn -0.047395 0.829371 0.556658 +vn -0.015259 0.386608 0.922086 +vn 0.004639 0.119510 0.992798 +vn -0.211035 0.631001 -0.746513 +vn -0.138768 0.848781 -0.510147 +vn -0.024995 0.999664 -0.001190 +vn 0.120426 0.724570 0.678579 +vn 0.260750 0.006531 0.965361 +vn 0.272500 -0.255898 0.927488 +vn -0.395581 0.809961 -0.432905 +vn -0.258827 0.918851 -0.297800 +vn 0.004730 0.999878 0.013031 +vn 0.466628 0.599780 0.649983 +vn 0.621937 -0.400861 0.672628 +vn 0.551042 -0.592181 0.587878 +vn 0.649068 0.384991 -0.656087 +vn 0.055971 0.691214 0.720450 +vn -0.115940 0.804590 0.582354 +vn -0.262185 0.897946 0.353435 +vn -0.341655 0.885006 -0.316263 +vn -0.081423 0.793085 -0.603626 +vn -0.155675 0.857753 -0.489883 +vn 0.728690 0.365978 0.578784 +vn 0.318674 0.539384 0.779382 +vn 0.953551 0.300150 -0.024415 +vn -0.133976 0.836818 -0.530808 +vn 0.095401 0.667959 -0.738029 +vn 0.000000 0.999969 0.000000 +vn -0.992523 -0.122013 0.000000 +vn -0.937346 -0.348338 0.000000 +vn -0.905148 -0.348827 -0.242836 +vn -0.958617 -0.122227 -0.257057 +vn -0.832057 0.554674 0.000000 +vn -0.803217 0.555376 -0.215339 +vn -0.048616 0.998810 0.000000 +vn -0.046236 0.998840 -0.012726 +vn 0.544267 0.838893 0.000000 +vn 0.525376 0.839106 0.140843 +vn 0.783471 0.621387 0.000000 +vn 0.756371 0.621845 0.202918 +vn 0.880886 0.473281 0.000000 +vn 0.850551 0.473769 0.228217 +vn -0.810907 -0.349376 -0.469375 +vn -0.859004 -0.122410 -0.497085 +vn -0.719657 0.555559 -0.416425 +vn -0.041749 0.998810 -0.024415 +vn 0.470077 0.839625 0.272011 +vn 0.677236 0.622608 0.391980 +vn 0.761803 0.474471 0.440962 +vn -0.662465 -0.349620 -0.662465 +vn -0.701773 -0.122440 -0.701773 +vn -0.587878 0.555650 -0.587878 +vn -0.034272 0.998810 -0.034272 +vn 0.383831 0.839808 0.383831 +vn 0.553148 0.622913 0.553148 +vn 0.622303 0.474776 0.622303 +vn -0.469375 -0.349376 -0.810907 +vn -0.497085 -0.122379 -0.859004 +vn -0.416425 0.555559 -0.719657 +vn -0.024415 0.998810 -0.041749 +vn 0.272011 0.839625 0.470077 +vn 0.391980 0.622608 0.677236 +vn 0.440962 0.474471 0.761834 +vn -0.242836 -0.348827 -0.905148 +vn -0.257057 -0.122227 -0.958617 +vn -0.215339 0.555376 -0.803217 +vn -0.012726 0.998840 -0.046205 +vn 0.140843 0.839106 0.525376 +vn 0.202918 0.621845 0.756371 +vn 0.228217 0.473769 0.850551 +vn 0.000000 -0.348338 -0.937346 +vn 0.000000 -0.122013 -0.992523 +vn 0.000000 0.554674 -0.832057 +vn 0.000000 0.998810 -0.048616 +vn 0.000000 0.838893 0.544267 +vn 0.000000 0.621387 0.783471 +vn 0.000000 0.473281 0.880886 +vn 0.242836 -0.348827 -0.905148 +vn 0.257057 -0.122227 -0.958617 +vn 0.215308 0.555376 -0.803217 +vn 0.012726 0.998840 -0.046205 +vn -0.140843 0.839106 0.525376 +vn -0.202918 0.621845 0.756340 +vn -0.228217 0.473769 0.850551 +vn 0.469375 -0.349376 -0.810907 +vn 0.497085 -0.122379 -0.859004 +vn 0.416425 0.555559 -0.719657 +vn 0.024415 0.998810 -0.041749 +vn -0.272011 0.839625 0.470077 +vn -0.391980 0.622608 0.677236 +vn -0.440962 0.474502 0.761803 +vn 0.662465 -0.349620 -0.662465 +vn 0.701773 -0.122471 -0.701773 +vn 0.587878 0.555650 -0.587878 +vn 0.034272 0.998810 -0.034272 +vn -0.383831 0.839808 0.383831 +vn -0.553148 0.622913 0.553148 +vn -0.622303 0.474776 0.622303 +vn 0.810907 -0.349406 -0.469375 +vn 0.859004 -0.122379 -0.497085 +vn 0.719657 0.555559 -0.416425 +vn 0.041749 0.998810 -0.024415 +vn -0.470077 0.839625 0.272011 +vn -0.677236 0.622608 0.391980 +vn -0.761803 0.474471 0.440962 +vn 0.905148 -0.348827 -0.242836 +vn 0.958617 -0.122227 -0.257057 +vn 0.803217 0.555376 -0.215339 +vn 0.046205 0.998840 -0.012726 +vn -0.525376 0.839106 0.140843 +vn -0.756340 0.621876 0.202918 +vn -0.850551 0.473769 0.228217 +vn 0.937346 -0.348338 0.000000 +vn 0.992523 -0.122013 0.000000 +vn 0.832026 0.554674 0.000000 +vn 0.048616 0.998810 0.000000 +vn -0.544267 0.838893 0.000000 +vn -0.783471 0.621387 0.000000 +vn 0.905148 -0.348827 0.242836 +vn 0.958617 -0.122227 0.257057 +vn 0.803217 0.555376 0.215308 +vn 0.046205 0.998840 0.012726 +vn -0.525376 0.839106 -0.140843 +vn -0.756340 0.621876 -0.202918 +vn 0.810907 -0.349406 0.469375 +vn 0.859004 -0.122379 0.497085 +vn 0.719657 0.555559 0.416425 +vn 0.041749 0.998810 0.024415 +vn -0.470077 0.839625 -0.272011 +vn -0.677236 0.622608 -0.391980 +vn -0.761803 0.474471 -0.440962 +vn 0.662465 -0.349620 0.662465 +vn 0.701773 -0.122471 0.701773 +vn 0.587878 0.555650 0.587878 +vn 0.034272 0.998810 0.034272 +vn -0.383831 0.839808 -0.383831 +vn -0.553148 0.622913 -0.553148 +vn -0.622303 0.474776 -0.622303 +vn 0.469375 -0.349376 0.810907 +vn 0.497085 -0.122379 0.859004 +vn 0.416425 0.555559 0.719657 +vn 0.024415 0.998810 0.041749 +vn -0.272011 0.839625 -0.470077 +vn -0.391980 0.622608 -0.677236 +vn -0.440962 0.474471 -0.761803 +vn 0.242836 -0.348827 0.905148 +vn 0.257057 -0.122227 0.958617 +vn 0.215339 0.555376 0.803217 +vn 0.012726 0.998840 0.046205 +vn -0.140843 0.839106 -0.525376 +vn -0.202918 0.621845 -0.756371 +vn -0.228217 0.473769 -0.850551 +vn 0.000000 -0.348338 0.937346 +vn 0.000000 -0.122013 0.992523 +vn 0.000000 0.554674 0.832057 +vn 0.000000 0.998810 0.048616 +vn 0.000000 0.838893 -0.544267 +vn 0.000000 0.621387 -0.783471 +vn 0.000000 0.473281 -0.880886 +vn -0.242836 -0.348827 0.905148 +vn -0.257057 -0.122227 0.958617 +vn -0.215308 0.555376 0.803217 +vn -0.012726 0.998840 0.046205 +vn 0.140843 0.839106 -0.525376 +vn 0.202918 0.621845 -0.756371 +vn 0.228217 0.473769 -0.850551 +vn -0.469375 -0.349376 0.810907 +vn -0.497085 -0.122379 0.859004 +vn -0.416425 0.555559 0.719657 +vn -0.024415 0.998810 0.041749 +vn 0.272011 0.839625 -0.470077 +vn 0.391980 0.622608 -0.677236 +vn 0.440962 0.474471 -0.761803 +vn -0.662465 -0.349620 0.662465 +vn -0.701773 -0.122440 0.701773 +vn -0.587878 0.555650 0.587878 +vn -0.034272 0.998810 0.034272 +vn 0.383831 0.839808 -0.383831 +vn 0.553148 0.622913 -0.553148 +vn 0.622303 0.474776 -0.622303 +vn -0.810907 -0.349376 0.469375 +vn -0.859004 -0.122410 0.497085 +vn -0.719657 0.555528 0.416425 +vn -0.041749 0.998810 0.024415 +vn 0.470077 0.839625 -0.272011 +vn 0.677236 0.622639 -0.391980 +vn 0.761803 0.474471 -0.440962 +vn -0.905148 -0.348827 0.242836 +vn -0.958617 -0.122227 0.257057 +vn -0.803217 0.555376 0.215339 +vn -0.046236 0.998840 0.012726 +vn 0.525376 0.839106 -0.140843 +vn 0.756371 0.621845 -0.202918 +vn 0.850551 0.473769 -0.228217 +vn 0.908292 0.418256 0.000000 +vn 0.877041 0.418744 0.235298 +vn 0.920286 0.391156 0.000000 +vn 0.888668 0.391644 0.238441 +vn 0.907315 0.342753 0.243446 +vn 0.785638 0.419416 0.454756 +vn 0.796075 0.392285 0.460799 +vn 0.812830 0.343333 0.470504 +vn 0.931486 0.265542 0.248543 +vn 0.834162 0.266366 0.482864 +vn 0.855312 0.152379 0.495132 +vn 0.966613 -0.042848 0.252602 +vn 0.864498 -0.045808 0.500504 +vn 0.641804 0.419691 0.641804 +vn 0.650349 0.392499 0.650349 +vn 0.664052 0.343577 0.664052 +vn 0.681509 0.266579 0.681509 +vn 0.698813 0.152501 0.698813 +vn 0.706351 -0.045869 0.706351 +vn 0.454756 0.419416 0.785638 +vn 0.460799 0.392285 0.796075 +vn 0.470504 0.343333 0.812830 +vn 0.482864 0.266366 0.834162 +vn 0.495132 0.152409 0.855312 +vn 0.500504 -0.045808 0.864498 +vn 0.235298 0.418744 0.877041 +vn 0.238441 0.391644 0.888668 +vn 0.243446 0.342753 0.907315 +vn 0.249855 0.265908 0.931028 +vn 0.256172 0.152104 0.954558 +vn 0.258980 -0.045717 0.964782 +vn 0.000000 0.418256 0.908292 +vn 0.000000 0.391156 0.920286 +vn 0.000000 0.342357 0.939543 +vn 0.000000 0.265542 0.964080 +vn 0.000000 0.151891 0.988372 +vn 0.000000 -0.045656 0.998932 +vn -0.235298 0.418744 0.877041 +vn -0.238441 0.391644 0.888668 +vn -0.243446 0.342753 0.907315 +vn -0.249855 0.265877 0.931028 +vn -0.256172 0.152104 0.954558 +vn -0.258980 -0.045717 0.964782 +vn -0.454756 0.419416 0.785638 +vn -0.460799 0.392285 0.796075 +vn -0.470504 0.343333 0.812830 +vn -0.482864 0.266366 0.834162 +vn -0.495132 0.152379 0.855312 +vn -0.500504 -0.045808 0.864498 +vn -0.641804 0.419691 0.641804 +vn -0.650349 0.392499 0.650349 +vn -0.664052 0.343577 0.664052 +vn -0.681509 0.266579 0.681509 +vn -0.698813 0.152501 0.698813 +vn -0.706351 -0.045869 0.706351 +vn -0.785638 0.419416 0.454756 +vn -0.796075 0.392285 0.460799 +vn -0.812830 0.343364 0.470504 +vn -0.834162 0.266366 0.482864 +vn -0.855312 0.152379 0.495132 +vn -0.864498 -0.045808 0.500504 +vn -0.907315 0.342753 0.243446 +vn -0.931028 0.265908 0.249855 +vn -0.954558 0.152104 0.256172 +vn -0.964782 -0.045717 0.258980 +vn -0.939543 0.342357 0.000000 +vn -0.964080 0.265542 0.000000 +vn -0.988372 0.151891 0.000000 +vn -0.888668 0.391644 -0.238441 +vn -0.907315 0.342753 -0.243446 +vn -0.931028 0.265877 -0.249855 +vn -0.954558 0.152104 -0.256172 +vn -0.785638 0.419416 -0.454756 +vn -0.796075 0.392285 -0.460799 +vn -0.812830 0.343333 -0.470504 +vn -0.834162 0.266366 -0.482864 +vn -0.855312 0.152379 -0.495132 +vn -0.964782 -0.045717 -0.258980 +vn -0.864498 -0.045808 -0.500504 +vn -0.641804 0.419691 -0.641804 +vn -0.650349 0.392499 -0.650349 +vn -0.664052 0.343577 -0.664052 +vn -0.681509 0.266579 -0.681509 +vn -0.698813 0.152501 -0.698813 +vn -0.706351 -0.045869 -0.706351 +vn -0.454756 0.419416 -0.785638 +vn -0.460799 0.392285 -0.796075 +vn -0.470504 0.343333 -0.812830 +vn -0.482864 0.266366 -0.834162 +vn -0.495132 0.152379 -0.855312 +vn -0.500504 -0.045808 -0.864498 +vn -0.235298 0.418744 -0.877041 +vn -0.238441 0.391644 -0.888668 +vn -0.243446 0.342753 -0.907315 +vn -0.249855 0.265908 -0.931028 +vn -0.256172 0.152104 -0.954558 +vn -0.258980 -0.045717 -0.964782 +vn 0.000000 0.418256 -0.908292 +vn 0.000000 0.391156 -0.920286 +vn 0.000000 0.342357 -0.939543 +vn 0.000000 0.265542 -0.964080 +vn 0.000000 0.151891 -0.988372 +vn 0.000000 -0.045656 -0.998932 +vn 0.235298 0.418744 -0.877041 +vn 0.238441 0.391644 -0.888668 +vn 0.243446 0.342753 -0.907315 +vn 0.249855 0.265877 -0.931028 +vn 0.256172 0.152104 -0.954558 +vn 0.258980 -0.045717 -0.964782 +vn 0.454756 0.419416 -0.785638 +vn 0.460799 0.392285 -0.796075 +vn 0.470504 0.343333 -0.812830 +vn 0.482864 0.266366 -0.834162 +vn 0.495132 0.152379 -0.855312 +vn 0.500504 -0.045808 -0.864498 +vn 0.641804 0.419691 -0.641804 +vn 0.650349 0.392499 -0.650349 +vn 0.664052 0.343577 -0.664052 +vn 0.681509 0.266579 -0.681509 +vn 0.698813 0.152501 -0.698813 +vn 0.706351 -0.045869 -0.706351 +vn 0.785638 0.419416 -0.454756 +vn 0.796075 0.392285 -0.460799 +vn 0.812830 0.343364 -0.470504 +vn 0.834162 0.266366 -0.482864 +vn 0.855312 0.152379 -0.495132 +vn 0.864498 -0.045808 -0.500504 +vn 0.877041 0.418744 -0.235298 +vn 0.888668 0.391644 -0.238441 +vn 0.907315 0.342753 -0.243446 +vn 0.795892 -0.566485 0.213538 +vn 0.712180 -0.701987 0.000000 +vn 0.687399 -0.702445 0.184393 +vn 0.652974 -0.757347 0.000000 +vn 0.630146 -0.757805 0.169012 +vn 0.724021 -0.689749 0.000000 +vn 0.698752 -0.690329 0.187414 +vn 0.886410 -0.462874 0.000000 +vn 0.855861 -0.463454 0.229530 +vn 0.817774 -0.327158 0.473434 +vn 0.712729 -0.567248 0.412549 +vn 0.615345 -0.703146 0.356151 +vn 0.564043 -0.758446 0.326456 +vn 0.625660 -0.690939 0.362102 +vn 0.766625 -0.464125 0.443678 +vn 0.668111 -0.327403 0.668111 +vn 0.582171 -0.567522 0.582171 +vn 0.502579 -0.703421 0.502579 +vn 0.460646 -0.758660 0.460646 +vn 0.510971 -0.691183 0.510971 +vn 0.626209 -0.464370 0.626240 +vn 0.473434 -0.327158 0.817774 +vn 0.412549 -0.567248 0.712729 +vn 0.356151 -0.703146 0.615375 +vn 0.326456 -0.758446 0.564043 +vn 0.362102 -0.690939 0.625660 +vn 0.443678 -0.464125 0.766625 +vn 0.245003 -0.326609 0.912839 +vn 0.213538 -0.566485 0.795892 +vn 0.184393 -0.702445 0.687399 +vn 0.169012 -0.757805 0.630146 +vn 0.187414 -0.690329 0.698752 +vn 0.229530 -0.463454 0.855831 +vn 0.000000 -0.326243 0.945250 +vn 0.000000 -0.565996 0.824396 +vn 0.000000 -0.701987 0.712180 +vn 0.000000 -0.757347 0.652974 +vn 0.000000 -0.689749 0.724021 +vn 0.000000 -0.462905 0.886380 +vn -0.245003 -0.326609 0.912839 +vn -0.213538 -0.566485 0.795892 +vn -0.184393 -0.702445 0.687399 +vn -0.169012 -0.757805 0.630146 +vn -0.187414 -0.690329 0.698752 +vn -0.229530 -0.463454 0.855861 +vn -0.473434 -0.327158 0.817774 +vn -0.412549 -0.567248 0.712729 +vn -0.356151 -0.703146 0.615375 +vn -0.326456 -0.758446 0.564043 +vn -0.362102 -0.690939 0.625660 +vn -0.443678 -0.464125 0.766625 +vn -0.668111 -0.327403 0.668111 +vn -0.582171 -0.567522 0.582171 +vn -0.502579 -0.703421 0.502579 +vn -0.460646 -0.758660 0.460646 +vn -0.510971 -0.691183 0.510971 +vn -0.626209 -0.464370 0.626209 +vn -0.817774 -0.327158 0.473434 +vn -0.712729 -0.567248 0.412549 +vn -0.615375 -0.703146 0.356151 +vn -0.564043 -0.758446 0.326456 +vn -0.625660 -0.690939 0.362102 +vn -0.766625 -0.464125 0.443678 +vn -0.912931 -0.326609 0.244575 +vn -0.687399 -0.702445 0.184393 +vn -0.630146 -0.757805 0.169012 +vn -0.698752 -0.690329 0.187414 +vn -0.855831 -0.463485 0.229530 +vn -0.824396 -0.565996 0.000000 +vn -0.712180 -0.701987 0.000000 +vn -0.652974 -0.757347 0.000000 +vn -0.724021 -0.689749 0.000000 +vn -0.886410 -0.462874 0.000000 +vn -0.795892 -0.566485 -0.213538 +vn -0.687399 -0.702445 -0.184393 +vn -0.630146 -0.757805 -0.169012 +vn -0.698752 -0.690329 -0.187414 +vn -0.855831 -0.463454 -0.229530 +vn -0.817774 -0.327158 -0.473434 +vn -0.712729 -0.567217 -0.412549 +vn -0.615375 -0.703146 -0.356151 +vn -0.564043 -0.758446 -0.326456 +vn -0.625660 -0.690939 -0.362102 +vn -0.766625 -0.464125 -0.443678 +vn -0.668111 -0.327403 -0.668111 +vn -0.582171 -0.567522 -0.582171 +vn -0.502579 -0.703421 -0.502579 +vn -0.460646 -0.758660 -0.460646 +vn -0.510971 -0.691183 -0.510971 +vn -0.626209 -0.464370 -0.626209 +vn -0.473434 -0.327158 -0.817774 +vn -0.412549 -0.567248 -0.712729 +vn -0.356151 -0.703146 -0.615375 +vn -0.326456 -0.758446 -0.564043 +vn -0.362102 -0.690939 -0.625660 +vn -0.443678 -0.464125 -0.766625 +vn -0.245003 -0.326609 -0.912839 +vn -0.213538 -0.566485 -0.795892 +vn -0.184393 -0.702445 -0.687399 +vn -0.169012 -0.757805 -0.630146 +vn -0.187414 -0.690329 -0.698752 +vn -0.229530 -0.463454 -0.855831 +vn 0.000000 -0.326243 -0.945250 +vn 0.000000 -0.565996 -0.824396 +vn 0.000000 -0.701987 -0.712180 +vn 0.000000 -0.757347 -0.652974 +vn 0.000000 -0.689749 -0.724021 +vn 0.000000 -0.462905 -0.886380 +vn 0.245003 -0.326609 -0.912839 +vn 0.213538 -0.566485 -0.795892 +vn 0.184393 -0.702445 -0.687399 +vn 0.169012 -0.757805 -0.630146 +vn 0.187445 -0.690329 -0.698752 +vn 0.229530 -0.463454 -0.855861 +vn 0.473434 -0.327158 -0.817774 +vn 0.412549 -0.567248 -0.712729 +vn 0.356151 -0.703146 -0.615375 +vn 0.326456 -0.758446 -0.564043 +vn 0.362102 -0.690939 -0.625660 +vn 0.443678 -0.464125 -0.766625 +vn 0.668111 -0.327403 -0.668111 +vn 0.582171 -0.567522 -0.582171 +vn 0.502579 -0.703421 -0.502579 +vn 0.460646 -0.758660 -0.460646 +vn 0.510971 -0.691183 -0.510971 +vn 0.626209 -0.464370 -0.626209 +vn 0.817774 -0.327158 -0.473434 +vn 0.712729 -0.567248 -0.412549 +vn 0.615375 -0.703146 -0.356151 +vn 0.564043 -0.758446 -0.326456 +vn 0.625660 -0.690939 -0.362102 +vn 0.766625 -0.464125 -0.443678 +vn 0.912839 -0.326609 -0.244942 +vn 0.795892 -0.566485 -0.213538 +vn 0.687399 -0.702445 -0.184393 +vn 0.630146 -0.757805 -0.169012 +vn 0.698752 -0.690329 -0.187414 +vn 0.855861 -0.463454 -0.229530 +vn 0.025666 -0.999664 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.024781 -0.999664 -0.006623 +vn 0.068667 -0.997620 0.000000 +vn 0.066256 -0.997620 -0.017731 +vn 0.157170 -0.987548 0.000000 +vn 0.151677 -0.987579 -0.040620 +vn 0.373150 -0.927763 0.000000 +vn 0.360118 -0.927885 -0.096469 +vn 0.789148 -0.614154 0.000000 +vn 0.762017 -0.614399 -0.204505 +vn 0.022156 -0.999664 -0.012787 +vn 0.059236 -0.997650 -0.034272 +vn 0.135624 -0.987640 -0.078463 +vn 0.322153 -0.928129 -0.186377 +vn 0.682333 -0.615131 -0.394971 +vn 0.018067 -0.999664 -0.018067 +vn 0.048341 -0.997650 -0.048341 +vn 0.110691 -0.987640 -0.110691 +vn 0.262947 -0.928251 -0.262947 +vn 0.557329 -0.615375 -0.557329 +vn 0.012787 -0.999664 -0.022156 +vn 0.034272 -0.997650 -0.059236 +vn 0.078463 -0.987640 -0.135624 +vn 0.186377 -0.928129 -0.322153 +vn 0.394971 -0.615131 -0.682302 +vn 0.006623 -0.999664 -0.024781 +vn 0.017731 -0.997620 -0.066256 +vn 0.040620 -0.987579 -0.151677 +vn 0.096469 -0.927885 -0.360118 +vn 0.204474 -0.614399 -0.762017 +vn 0.000000 -0.999664 -0.025666 +vn 0.000000 -0.997620 -0.068667 +vn 0.000000 -0.987548 -0.157170 +vn 0.000000 -0.927763 -0.373150 +vn 0.000000 -0.614154 -0.789148 +vn -0.006623 -0.999664 -0.024781 +vn -0.017731 -0.997620 -0.066256 +vn -0.040620 -0.987579 -0.151677 +vn -0.096469 -0.927885 -0.360118 +vn -0.204474 -0.614399 -0.762017 +vn -0.012787 -0.999664 -0.022156 +vn -0.034272 -0.997650 -0.059236 +vn -0.078463 -0.987640 -0.135624 +vn -0.186377 -0.928129 -0.322153 +vn -0.394971 -0.615131 -0.682333 +vn -0.018067 -0.999664 -0.018067 +vn -0.048341 -0.997650 -0.048341 +vn -0.110691 -0.987640 -0.110691 +vn -0.262947 -0.928251 -0.262947 +vn -0.557329 -0.615375 -0.557329 +vn -0.022156 -0.999664 -0.012787 +vn -0.059236 -0.997650 -0.034272 +vn -0.135624 -0.987640 -0.078463 +vn -0.322153 -0.928129 -0.186377 +vn -0.682302 -0.615131 -0.394971 +vn -0.024781 -0.999664 -0.006623 +vn -0.066256 -0.997620 -0.017731 +vn -0.151677 -0.987579 -0.040620 +vn -0.360118 -0.927885 -0.096469 +vn -0.762017 -0.614399 -0.204474 +vn -0.025666 -0.999664 0.000000 +vn -0.068667 -0.997620 0.000000 +vn -0.157170 -0.987548 0.000000 +vn -0.373150 -0.927763 0.000000 +vn -0.789148 -0.614154 0.000000 +vn -0.024781 -0.999664 0.006623 +vn -0.066256 -0.997620 0.017731 +vn -0.151677 -0.987579 0.040620 +vn -0.360149 -0.927885 0.096469 +vn -0.762017 -0.614399 0.204474 +vn -0.022156 -0.999664 0.012787 +vn -0.059236 -0.997650 0.034272 +vn -0.135624 -0.987640 0.078463 +vn -0.322153 -0.928129 0.186377 +vn -0.682333 -0.615131 0.394971 +vn -0.018067 -0.999664 0.018067 +vn -0.048341 -0.997650 0.048341 +vn -0.110691 -0.987640 0.110691 +vn -0.262947 -0.928251 0.262947 +vn -0.557329 -0.615375 0.557329 +vn -0.012787 -0.999664 0.022156 +vn -0.034272 -0.997650 0.059236 +vn -0.078463 -0.987640 0.135624 +vn -0.186377 -0.928129 0.322153 +vn -0.394971 -0.615131 0.682302 +vn -0.006623 -0.999664 0.024781 +vn -0.017731 -0.997620 0.066256 +vn -0.040620 -0.987579 0.151677 +vn -0.096469 -0.927885 0.360118 +vn -0.204474 -0.614399 0.762017 +vn 0.000000 -0.999664 0.025666 +vn 0.000000 -0.997620 0.068667 +vn 0.000000 -0.987548 0.157170 +vn 0.000000 -0.927763 0.373150 +vn 0.000000 -0.614154 0.789148 +vn 0.006623 -0.999664 0.024781 +vn 0.017731 -0.997620 0.066256 +vn 0.040620 -0.987579 0.151677 +vn 0.096469 -0.927885 0.360149 +vn 0.204474 -0.614399 0.762017 +vn 0.012787 -0.999664 0.022156 +vn 0.034272 -0.997650 0.059236 +vn 0.078463 -0.987640 0.135624 +vn 0.186377 -0.928129 0.322153 +vn 0.394971 -0.615131 0.682333 +vn 0.018067 -0.999664 0.018067 +vn 0.048341 -0.997650 0.048341 +vn 0.110691 -0.987640 0.110691 +vn 0.262947 -0.928251 0.262947 +vn 0.557329 -0.615375 0.557329 +vn 0.022156 -0.999664 0.012787 +vn 0.059236 -0.997650 0.034272 +vn 0.135624 -0.987640 0.078463 +vn 0.322153 -0.928129 0.186346 +vn 0.682302 -0.615131 0.394971 +vn 0.024781 -0.999664 0.006623 +vn 0.066256 -0.997620 0.017731 +vn 0.151677 -0.987579 0.040620 +vn 0.360118 -0.927885 0.096469 +vn 0.762017 -0.614399 0.204474 +vn 0.464827 -0.373638 -0.802667 +vn 0.655812 -0.373882 -0.655812 +vn 0.000000 -0.372539 0.927976 +vn -0.240699 -0.373028 0.896023 +vn -0.802667 -0.373608 0.464827 +vn 0.896023 -0.372997 -0.240699 +vn -0.927976 -0.372539 0.000000 +vn 0.927976 -0.372539 0.000000 +vn 0.717063 0.696982 0.000000 +vn 0.990387 -0.138310 -0.000061 +vn 0.956694 -0.138737 0.255806 +vn 0.692129 0.697470 0.185583 +vn 0.857326 -0.139317 0.495529 +vn 0.620045 0.697653 0.358837 +vn 0.700125 -0.139531 0.700217 +vn 0.506516 0.697714 0.506546 +vn 0.495468 -0.139286 0.857356 +vn 0.358776 0.697714 0.620014 +vn 0.255867 -0.138737 0.956694 +vn 0.185583 0.697531 0.692068 +vn 0.000061 -0.138310 0.990387 +vn 0.000000 0.696982 0.717063 +vn -0.255806 -0.138737 0.956694 +vn -0.185583 0.697470 0.692129 +vn -0.495529 -0.139317 0.857326 +vn -0.358837 0.697653 0.620045 +vn -0.700217 -0.139531 0.700156 +vn -0.506546 0.697714 0.506516 +vn -0.857356 -0.139286 0.495468 +vn -0.620014 0.697714 0.358776 +vn -0.956694 -0.138737 0.255867 +vn -0.692068 0.697531 0.185583 +vn -0.990387 -0.138310 0.000061 +vn -0.717063 0.696982 0.000000 +vn -0.956694 -0.138737 -0.255806 +vn -0.692129 0.697470 -0.185583 +vn -0.857326 -0.139317 -0.495529 +vn -0.620045 0.697653 -0.358837 +vn -0.700125 -0.139531 -0.700217 +vn -0.506516 0.697714 -0.506546 +vn -0.495468 -0.139286 -0.857356 +vn -0.358776 0.697714 -0.620014 +vn -0.255867 -0.138737 -0.956694 +vn -0.185583 0.697531 -0.692068 +vn -0.000061 -0.138310 -0.990387 +vn 0.000000 0.696982 -0.717063 +vn 0.255806 -0.138737 -0.956694 +vn 0.185583 0.697470 -0.692129 +vn 0.495529 -0.139317 -0.857326 +vn 0.358837 0.697653 -0.620045 +vn 0.700217 -0.139531 -0.700156 +vn 0.506546 0.697714 -0.506516 +vn 0.857356 -0.139286 -0.495468 +vn 0.620014 0.697714 -0.358776 +vn 0.956694 -0.138737 -0.255867 +vn 0.692068 0.697531 -0.185583 +vn 0.292520 0.956236 0.000000 +vn 0.282083 0.956389 0.075686 +vn 0.177953 0.984008 0.000000 +vn 0.171606 0.984069 0.046022 +vn 0.158879 0.987274 0.000000 +vn 0.153264 0.987304 0.041078 +vn 0.217719 0.975982 0.000000 +vn 0.210059 0.976043 0.056276 +vn 0.504715 0.863277 0.000000 +vn 0.487197 0.863460 0.130558 +vn 0.693258 0.720664 0.000000 +vn 0.669057 0.721183 0.179449 +vn 0.252388 0.956511 0.146092 +vn 0.153508 0.984130 0.088839 +vn 0.137059 0.987365 0.079318 +vn 0.187872 0.976135 0.108676 +vn 0.435926 0.863887 0.252205 +vn 0.598956 0.721824 0.346660 +vn 0.206091 0.956572 0.206091 +vn 0.125340 0.984161 0.125340 +vn 0.111911 0.987396 0.111911 +vn 0.153356 0.976196 0.153356 +vn 0.355907 0.864071 0.355907 +vn 0.489151 0.722098 0.489151 +vn 0.146092 0.956511 0.252388 +vn 0.088839 0.984130 0.153508 +vn 0.079318 0.987365 0.137059 +vn 0.108676 0.976135 0.187872 +vn 0.252205 0.863887 0.435926 +vn 0.346660 0.721824 0.598956 +vn 0.075686 0.956389 0.282083 +vn 0.046022 0.984069 0.171606 +vn 0.041078 0.987304 0.153264 +vn 0.056276 0.976043 0.210059 +vn 0.130558 0.863460 0.487197 +vn 0.179449 0.721183 0.669057 +vn 0.000000 0.956236 0.292520 +vn 0.000000 0.984008 0.177953 +vn 0.000000 0.987274 0.158879 +vn 0.000000 0.975982 0.217719 +vn 0.000000 0.863277 0.504715 +vn 0.000000 0.720664 0.693258 +vn -0.075686 0.956389 0.282083 +vn -0.046022 0.984069 0.171606 +vn -0.041078 0.987304 0.153264 +vn -0.056276 0.976043 0.210059 +vn -0.130558 0.863460 0.487197 +vn -0.179449 0.721183 0.669057 +vn -0.146092 0.956511 0.252388 +vn -0.088839 0.984130 0.153508 +vn -0.079318 0.987365 0.137059 +vn -0.108676 0.976135 0.187872 +vn -0.252205 0.863887 0.435926 +vn -0.346660 0.721824 0.598956 +vn -0.206091 0.956572 0.206091 +vn -0.125340 0.984161 0.125340 +vn -0.111911 0.987396 0.111911 +vn -0.153356 0.976196 0.153356 +vn -0.355907 0.864071 0.355907 +vn -0.489151 0.722098 0.489151 +vn -0.252388 0.956511 0.146092 +vn -0.153508 0.984130 0.088839 +vn -0.137059 0.987365 0.079318 +vn -0.187872 0.976135 0.108676 +vn -0.435926 0.863887 0.252205 +vn -0.598956 0.721824 0.346660 +vn -0.282083 0.956389 0.075686 +vn -0.171606 0.984069 0.046022 +vn -0.153264 0.987304 0.041078 +vn -0.210059 0.976043 0.056276 +vn -0.487197 0.863460 0.130558 +vn -0.669057 0.721183 0.179449 +vn -0.292520 0.956236 0.000000 +vn -0.177953 0.984008 0.000000 +vn -0.158879 0.987274 0.000000 +vn -0.217719 0.975982 0.000000 +vn -0.504715 0.863277 0.000000 +vn -0.693258 0.720664 0.000000 +vn -0.282083 0.956389 -0.075686 +vn -0.171606 0.984069 -0.046022 +vn -0.153264 0.987304 -0.041078 +vn -0.210059 0.976043 -0.056276 +vn -0.487197 0.863460 -0.130558 +vn -0.669057 0.721183 -0.179449 +vn -0.252388 0.956511 -0.146092 +vn -0.153508 0.984130 -0.088839 +vn -0.137059 0.987365 -0.079318 +vn -0.187872 0.976135 -0.108676 +vn -0.435926 0.863887 -0.252205 +vn -0.598956 0.721824 -0.346660 +vn -0.206091 0.956572 -0.206091 +vn -0.125340 0.984161 -0.125340 +vn -0.111911 0.987396 -0.111911 +vn -0.153356 0.976196 -0.153356 +vn -0.355907 0.864071 -0.355907 +vn -0.489151 0.722098 -0.489151 +vn -0.146092 0.956511 -0.252388 +vn -0.088839 0.984130 -0.153508 +vn -0.079318 0.987365 -0.137059 +vn -0.108676 0.976135 -0.187872 +vn -0.252205 0.863887 -0.435926 +vn -0.346660 0.721824 -0.598956 +vn -0.075686 0.956389 -0.282083 +vn -0.046022 0.984069 -0.171606 +vn -0.041078 0.987304 -0.153264 +vn -0.056276 0.976043 -0.210059 +vn -0.130558 0.863460 -0.487197 +vn -0.179449 0.721183 -0.669057 +vn 0.000000 0.956236 -0.292520 +vn 0.000000 0.984008 -0.177953 +vn 0.000000 0.987274 -0.158879 +vn 0.000000 0.975982 -0.217719 +vn 0.000000 0.863277 -0.504715 +vn 0.000000 0.720664 -0.693258 +vn 0.075686 0.956389 -0.282083 +vn 0.046022 0.984069 -0.171606 +vn 0.041078 0.987304 -0.153264 +vn 0.056276 0.976043 -0.210059 +vn 0.130558 0.863460 -0.487197 +vn 0.179449 0.721183 -0.669057 +vn 0.146092 0.956511 -0.252388 +vn 0.088839 0.984130 -0.153508 +vn 0.079318 0.987365 -0.137059 +vn 0.108676 0.976135 -0.187872 +vn 0.252205 0.863887 -0.435926 +vn 0.346660 0.721824 -0.598956 +vn 0.206091 0.956572 -0.206091 +vn 0.125340 0.984161 -0.125340 +vn 0.111911 0.987396 -0.111911 +vn 0.153356 0.976196 -0.153356 +vn 0.355907 0.864071 -0.355907 +vn 0.489151 0.722098 -0.489151 +vn 0.252388 0.956511 -0.146092 +vn 0.153508 0.984130 -0.088839 +vn 0.137059 0.987365 -0.079318 +vn 0.187872 0.976135 -0.108676 +vn 0.435926 0.863887 -0.252205 +vn 0.598956 0.721824 -0.346660 +vn 0.282083 0.956389 -0.075686 +vn 0.171606 0.984069 -0.046022 +vn 0.153264 0.987304 -0.041078 +vn 0.210059 0.976043 -0.056276 +vn 0.487197 0.863460 -0.130558 +vn 0.669057 0.721183 -0.179449 +vn 0.363842 0.931455 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.351451 0.931516 0.093509 +vn 0.968261 0.249916 0.000000 +vn 0.935423 0.249763 0.250130 +vn 0.842860 -0.538102 0.000000 +vn 0.813959 -0.538713 0.217292 +vn 0.786767 -0.617206 -0.000031 +vn 0.759514 -0.618000 0.202857 +vn 0.314432 0.931791 0.181280 +vn 0.838404 0.249855 0.484359 +vn 0.729026 -0.539720 0.420911 +vn 0.680013 -0.619068 0.392743 +vn 0.256386 0.931913 0.256417 +vn 0.684652 0.249886 0.684652 +vn 0.595050 -0.540147 0.595050 +vn 0.555010 -0.619526 0.555040 +vn 0.181280 0.931791 0.314432 +vn 0.484359 0.249825 0.838404 +vn 0.420881 -0.539720 0.729026 +vn 0.392712 -0.619098 0.680013 +vn 0.093509 0.931516 0.351451 +vn 0.250160 0.249763 0.935423 +vn 0.217322 -0.538713 0.813959 +vn 0.202887 -0.618030 0.759484 +vn 0.000000 0.931455 0.363842 +vn 0.000000 0.249916 0.968261 +vn 0.000000 -0.538102 0.842860 +vn 0.000031 -0.617206 0.786767 +vn -0.093509 0.931516 0.351451 +vn -0.250130 0.249763 0.935423 +vn -0.217292 -0.538682 0.813959 +vn -0.202857 -0.618000 0.759514 +vn -0.181280 0.931791 0.314432 +vn -0.484359 0.249855 0.838404 +vn -0.420911 -0.539720 0.729026 +vn -0.392743 -0.619068 0.680013 +vn -0.256417 0.931913 0.256386 +vn -0.684652 0.249886 0.684652 +vn -0.595050 -0.540147 0.595050 +vn -0.555040 -0.619526 0.555010 +vn -0.314432 0.931791 0.181280 +vn -0.838404 0.249825 0.484359 +vn -0.729026 -0.539720 0.420881 +vn -0.680013 -0.619098 0.392712 +vn -0.351451 0.931516 0.093509 +vn -0.935423 0.249763 0.250160 +vn -0.813959 -0.538713 0.217292 +vn -0.759484 -0.618030 0.202887 +vn -0.363842 0.931455 0.000000 +vn -0.968261 0.249916 0.000000 +vn -0.842860 -0.538102 0.000000 +vn -0.786767 -0.617206 0.000031 +vn -0.351451 0.931516 -0.093509 +vn -0.935423 0.249763 -0.250130 +vn -0.813959 -0.538713 -0.217292 +vn -0.759514 -0.618000 -0.202857 +vn -0.314432 0.931791 -0.181280 +vn -0.838404 0.249855 -0.484359 +vn -0.729026 -0.539720 -0.420911 +vn -0.680013 -0.619068 -0.392743 +vn -0.256386 0.931913 -0.256417 +vn -0.684652 0.249886 -0.684652 +vn -0.595050 -0.540147 -0.595050 +vn -0.555010 -0.619526 -0.555040 +vn -0.181280 0.931791 -0.314432 +vn -0.484359 0.249825 -0.838404 +vn -0.420881 -0.539720 -0.729026 +vn -0.392712 -0.619098 -0.680013 +vn -0.093509 0.931516 -0.351451 +vn -0.250160 0.249763 -0.935423 +vn -0.217322 -0.538713 -0.813959 +vn -0.202887 -0.618030 -0.759484 +vn 0.000000 0.931455 -0.363842 +vn 0.000000 0.249916 -0.968261 +vn 0.000000 -0.538102 -0.842860 +vn -0.000031 -0.617206 -0.786767 +vn 0.093509 0.931516 -0.351451 +vn 0.250130 0.249763 -0.935423 +vn 0.217292 -0.538682 -0.813959 +vn 0.202857 -0.618000 -0.759514 +vn 0.181280 0.931791 -0.314432 +vn 0.484359 0.249855 -0.838404 +vn 0.420911 -0.539720 -0.729026 +vn 0.392743 -0.619068 -0.680013 +vn 0.256417 0.931913 -0.256386 +vn 0.684652 0.249886 -0.684652 +vn 0.595050 -0.540147 -0.595050 +vn 0.555040 -0.619526 -0.555010 +vn 0.314432 0.931791 -0.181280 +vn 0.838404 0.249825 -0.484359 +vn 0.729026 -0.539720 -0.420881 +vn 0.680013 -0.619098 -0.392712 +vn 0.351451 0.931516 -0.093509 +vn 0.935423 0.249763 -0.250160 +vn 0.813959 -0.538713 -0.217292 +vn 0.759484 -0.618030 -0.202887 +vn -0.354198 0.930296 -0.095187 +vn 0.095187 0.930296 0.354198 +vn 0.354198 0.930296 0.095187 +vn 0.183721 0.930387 0.317179 +vn -0.183721 0.930387 -0.317179 +vn -0.367443 0.930021 0.000000 +vn -0.183721 0.930387 0.317179 +vn 0.367412 0.930021 0.000000 +vn -0.317179 0.930387 0.183721 +vn -0.095187 0.930296 -0.354198 +vn 0.000000 0.930021 -0.367443 +vn -0.354198 0.930296 0.095187 +vn 0.095187 0.930296 -0.354198 +vn 0.000000 0.930021 0.367443 +vn -0.317179 0.930387 -0.183721 +vn 0.317179 0.930387 -0.183721 +vn -0.095187 0.930296 0.354198 +vn 0.317179 0.930387 0.183721 +vn 0.354198 0.930296 -0.095187 +vn 0.183721 0.930387 -0.317179 +vn -0.034730 0.999390 0.000000 +vn 0.033479 0.999390 -0.009003 +vn 0.034730 0.999390 0.000000 +vn 0.009003 0.999390 -0.033479 +vn 0.000000 0.999390 -0.034730 +vn -0.259163 0.930387 0.259163 +vn -0.017335 0.999390 0.029939 +vn 0.947539 0.295083 0.122654 +vn -0.004486 0.999969 0.000000 +vn -0.004151 0.950468 0.310739 +vn -0.003021 0.719291 0.694662 +vn -0.998688 0.050722 0.000000 +vn -0.003143 0.719321 -0.694632 +vn 0.970214 0.213324 -0.114505 +vn -0.136235 0.879482 -0.455947 +vn 0.949858 0.312662 0.000000 +vn 0.055757 -0.017579 -0.998260 +vn 0.201300 -0.540880 -0.816645 +vn 0.974456 -0.186071 -0.125645 +vn 0.988098 -0.096286 0.119938 +vn 0.974456 -0.186041 0.125614 +vn -0.879574 -0.475723 0.000000 +vn -0.873775 -0.472610 -0.114475 +vn 0.988067 -0.096286 -0.119938 +vn 0.295480 -0.855464 -0.425214 +vn -0.976196 -0.174993 -0.127903 +vn -0.971007 -0.205725 0.121677 +vn -0.976196 -0.174963 0.127903 +vn -0.976196 -0.174993 0.127903 +vn 0.896054 -0.372997 0.240699 +vn -0.802667 -0.373638 -0.464827 +vn -0.655812 -0.373852 -0.655812 +vn -0.240699 -0.373028 -0.896023 +vn -0.464827 -0.373638 -0.802667 +vn -0.896023 -0.373028 0.240699 +vn 0.000000 -0.372539 -0.927976 +vn -0.655812 -0.373852 0.655812 +vn 0.240699 -0.373028 0.896023 +vn -0.896023 -0.373028 -0.240699 +vn 0.802667 -0.373638 -0.464827 +vn 0.655812 -0.373882 0.655812 +vn 0.464827 -0.373638 0.802667 +vn -0.464827 -0.373638 0.802667 +vn 0.240699 -0.373028 -0.896023 +vn 0.802667 -0.373638 0.464827 +vn -0.033479 0.999390 0.009003 +vn -0.259163 0.930387 -0.259163 +vn -0.024445 0.999390 -0.024445 +vn -0.029939 0.999390 -0.017335 +vn 0.259163 0.930387 -0.259163 +vn 0.024445 0.999390 -0.024445 +vn 0.017335 0.999390 -0.029939 +vn 0.029939 0.999390 -0.017335 +vn 0.033479 0.999390 0.009003 +vn -0.009003 0.999390 0.033479 +vn 0.000000 0.999390 0.034730 +vn -0.017335 0.999390 -0.029939 +vn 0.259163 0.930387 0.259163 +vn 0.029939 0.999390 0.017335 +vn -0.009003 0.999390 -0.033479 +vn 0.024445 0.999390 0.024445 +vn 0.017335 0.999390 0.029939 +vn 0.009003 0.999390 0.033479 +vn -0.033479 0.999390 -0.009003 +vn -0.024445 0.999390 0.024445 +vn -0.029939 0.999390 0.017335 +vn 0.055757 -0.017579 0.998260 +vn 0.294198 -0.855403 0.426252 +vn 0.201300 -0.540880 0.816614 +s 1 +f 34//1 1243//2 593//3 +f 52//4 27//5 40//6 +f 52//4 40//6 65//7 +f 77//8 52//4 65//7 +f 77//8 65//7 84//9 +f 107//10 77//8 84//9 +f 107//10 84//9 85//11 +f 115//12 107//10 85//11 +f 115//12 85//11 99//13 +f 129//14 115//12 99//13 +f 129//14 99//13 128//15 +f 1252//16 36//17 40//6 +f 65//7 40//6 64//18 +f 65//7 64//18 58//19 +f 84//9 65//7 58//19 +f 84//9 58//19 59//20 +f 85//11 84//9 59//20 +f 85//11 59//20 70//21 +f 99//13 85//11 70//21 +f 99//13 70//21 98//22 +f 128//15 99//13 98//22 +f 128//15 98//22 114//23 +f 1244//24 33//25 64//18 +f 58//19 64//18 33//25 +f 58//19 33//25 35//26 +f 59//20 58//19 35//26 +f 59//20 35//26 45//27 +f 70//21 59//20 45//27 +f 70//21 45//27 69//28 +f 98//22 70//21 69//28 +f 98//22 69//28 83//29 +f 114//23 98//22 83//29 +f 114//23 83//29 113//30 +f 553//31 1//32 566//33 +f 35//26 33//25 20//34 +f 35//26 20//34 24//35 +f 45//27 35//26 24//35 +f 45//27 24//35 44//36 +f 69//28 45//27 44//36 +f 69//28 44//36 57//37 +f 83//29 69//28 57//37 +f 83//29 57//37 82//38 +f 113//30 83//29 82//38 +f 113//30 82//38 112//39 +f 566//33 1283//40 9//41 +f 24//35 20//34 18//42 +f 24//35 18//42 23//43 +f 44//36 24//35 23//43 +f 44//36 23//43 32//44 +f 57//37 44//36 32//44 +f 57//37 32//44 56//45 +f 82//38 57//37 56//45 +f 82//38 56//45 81//46 +f 112//39 82//38 81//46 +f 112//39 81//46 111//47 +f 4//48 8//49 1250//50 +f 23//43 18//42 8//49 +f 23//43 8//49 17//51 +f 32//44 23//43 17//51 +f 32//44 17//51 31//52 +f 56//45 32//44 31//52 +f 56//45 31//52 55//53 +f 81//46 56//45 55//53 +f 81//46 55//53 80//54 +f 111//47 81//46 80//54 +f 111//47 80//54 110//55 +f 565//56 592//57 1233//58 +f 17//51 8//49 4//48 +f 17//51 4//48 16//59 +f 31//52 17//51 16//59 +f 31//52 16//59 30//60 +f 55//53 31//52 30//60 +f 55//53 30//60 54//61 +f 80//54 55//53 54//61 +f 80//54 54//61 79//62 +f 110//55 80//54 79//62 +f 110//55 79//62 109//63 +f 1//32 565//56 2//64 +f 6//65 2//64 565//56 +f 16//59 4//48 7//66 +f 16//59 7//66 22//67 +f 30//60 16//59 22//67 +f 30//60 22//67 43//68 +f 54//61 30//60 43//68 +f 54//61 43//68 68//69 +f 79//62 54//61 68//69 +f 79//62 68//69 97//70 +f 109//63 79//62 97//70 +f 109//63 97//70 127//71 +f 565//56 1233//58 1249//58 +f 13//72 14//73 5//74 +f 22//67 7//66 15//75 +f 22//67 15//75 29//76 +f 43//68 22//67 29//76 +f 43//68 29//76 42//77 +f 68//69 43//68 42//77 +f 68//69 42//77 67//78 +f 97//70 68//69 67//78 +f 97//70 67//78 96//79 +f 127//71 97//70 96//79 +f 127//71 96//79 126//80 +f 11//81 15//75 1240//82 +f 1289//83 34//1 593//3 +f 29//76 15//75 14//73 +f 29//76 14//73 21//84 +f 42//77 29//76 21//84 +f 42//77 21//84 41//85 +f 67//78 42//77 41//85 +f 67//78 41//85 66//86 +f 96//79 67//78 66//86 +f 96//79 66//86 95//87 +f 126//80 96//79 95//87 +f 126//80 95//87 125//88 +f 636//89 1243//2 26//2 +f 636//89 26//2 592//57 +f 21//84 14//73 13//72 +f 21//84 13//72 28//90 +f 41//85 21//84 28//90 +f 41//85 28//90 53//91 +f 66//86 41//85 53//91 +f 66//86 53//91 78//92 +f 95//87 66//86 78//92 +f 95//87 78//92 108//93 +f 125//88 95//87 108//93 +f 125//88 108//93 136//94 +f 12//95 13//72 5//74 +f 28//90 13//72 27//5 +f 28//90 27//5 52//4 +f 53//91 28//90 52//4 +f 53//91 52//4 77//8 +f 78//92 53//91 77//8 +f 78//92 77//8 107//10 +f 108//93 78//92 107//10 +f 108//93 107//10 115//12 +f 136//94 108//93 115//12 +f 136//94 115//12 129//14 +f 148//96 129//14 128//15 +f 148//96 128//15 143//97 +f 121//98 148//96 143//97 +f 121//98 143//97 122//99 +f 92//100 121//98 122//99 +f 92//100 122//99 93//101 +f 62//102 92//100 93//101 +f 62//102 93//101 63//103 +f 39//104 62//102 63//103 +f 39//104 63//103 51//105 +f 10//106 39//104 51//105 +f 10//106 51//105 49//107 +f 143//97 128//15 114//23 +f 143//97 114//23 142//108 +f 122//99 143//97 142//108 +f 122//99 142//108 123//109 +f 93//101 122//99 123//109 +f 93//101 123//109 94//110 +f 63//103 93//101 94//110 +f 63//103 94//110 76//111 +f 51//105 63//103 76//111 +f 51//105 76//111 75//112 +f 49//107 51//105 75//112 +f 49//107 75//112 61//113 +f 142//108 114//23 113//30 +f 142//108 113//30 141//114 +f 123//109 142//108 141//114 +f 123//109 141//114 124//115 +f 94//110 123//109 124//115 +f 94//110 124//115 106//116 +f 76//111 94//110 106//116 +f 76//111 106//116 105//117 +f 75//112 76//111 105//117 +f 75//112 105//117 91//118 +f 61//113 75//112 91//118 +f 61//113 91//118 90//119 +f 141//114 113//30 112//39 +f 141//114 112//39 140//120 +f 124//115 141//114 140//120 +f 124//115 140//120 135//121 +f 106//116 124//115 135//121 +f 106//116 135//121 134//122 +f 105//117 106//116 134//122 +f 105//117 134//122 120//123 +f 91//118 105//117 120//123 +f 91//118 120//123 119//124 +f 90//119 91//118 119//124 +f 140//120 112//39 111//47 +f 140//120 111//47 139//125 +f 135//121 140//120 139//125 +f 135//121 139//125 155//126 +f 134//122 135//121 155//126 +f 134//122 155//126 147//127 +f 120//123 134//122 147//127 +f 120//123 147//127 144//128 +f 119//124 120//123 144//128 +f 119//124 144//128 116//129 +f 26//2 1234//130 592//57 +f 139//125 111//47 110//55 +f 139//125 110//55 138//131 +f 155//126 139//125 138//131 +f 155//126 138//131 156//132 +f 147//127 155//126 156//132 +f 147//127 156//132 145//133 +f 144//128 147//127 145//133 +f 144//128 145//133 117//134 +f 116//129 144//128 117//134 +f 116//129 117//134 88//135 +f 27//5 13//72 12//95 +f 1242//136 88//135 71//137 +f 138//131 110//55 109//63 +f 138//131 109//63 137//138 +f 156//132 138//131 137//138 +f 156//132 137//138 154//139 +f 145//133 156//132 154//139 +f 145//133 154//139 131//140 +f 117//134 145//133 131//140 +f 117//134 131//140 101//141 +f 88//135 117//134 101//141 +f 88//135 101//141 86//142 +f 60//143 74//144 1248//145 +f 137//138 109//63 127//71 +f 137//138 127//71 151//146 +f 154//139 137//138 151//146 +f 154//139 151//146 153//147 +f 131//140 154//139 153//147 +f 131//140 153//147 130//148 +f 101//141 131//140 130//148 +f 101//141 130//148 100//149 +f 86//142 101//141 100//149 +f 86//142 100//149 74//144 +f 47//150 1235//151 631//152 +f 74//144 48//153 1248//145 +f 151//146 127//71 126//80 +f 151//146 126//80 150//154 +f 153//147 151//146 150//154 +f 153//147 150//154 146//155 +f 130//148 153//147 146//155 +f 130//148 146//155 118//156 +f 100//149 130//148 118//156 +f 100//149 118//156 89//157 +f 74//144 100//149 89//157 +f 74//144 89//157 48//153 +f 1247//158 87//159 715//160 +f 104//161 116//129 1242//136 +f 150//154 126//80 125//88 +f 150//154 125//88 149//162 +f 146//155 150//154 149//162 +f 146//155 149//162 132//163 +f 118//156 146//155 132//163 +f 118//156 132//163 102//164 +f 89//157 118//156 102//164 +f 89//157 102//164 72//165 +f 48//153 89//157 72//165 +f 48//153 72//165 46//166 +f 37//167 48//153 46//166 +f 37//167 46//166 38//168 +f 149//162 125//88 136//94 +f 149//162 136//94 152//169 +f 132//163 149//162 152//169 +f 132//163 152//169 133//170 +f 102//164 132//163 133//170 +f 102//164 133//170 103//171 +f 72//165 102//164 103//171 +f 72//165 103//171 73//172 +f 46//166 72//165 73//172 +f 46//166 73//172 50//173 +f 38//168 46//166 50//173 +f 38//168 50//173 25//174 +f 152//169 136//94 129//14 +f 152//169 129//14 148//96 +f 133//170 152//169 148//96 +f 133//170 148//96 121//98 +f 103//171 133//170 121//98 +f 103//171 121//98 92//100 +f 73//172 103//171 92//100 +f 73//172 92//100 62//102 +f 50//173 73//172 62//102 +f 50//173 62//102 39//104 +f 25//174 50//173 39//104 +f 39//104 10//106 25//174 +f 539//175 509//176 159//177 +f 160//178 158//179 157//180 +f 166//181 160//178 163//182 +f 166//181 163//182 173//183 +f 177//184 166//181 173//183 +f 177//184 173//183 183//185 +f 189//186 177//184 183//185 +f 189//186 183//185 197//187 +f 205//188 189//186 197//187 +f 205//188 197//187 216//189 +f 225//190 205//188 216//189 +f 225//190 216//189 235//191 +f 173//183 163//182 172//192 +f 173//183 172//192 184//193 +f 183//185 173//183 184//193 +f 183//185 184//193 198//194 +f 197//187 183//185 198//194 +f 197//187 198//194 217//195 +f 216//189 197//187 217//195 +f 216//189 217//195 236//196 +f 235//191 216//189 236//196 +f 235//191 236//196 253//197 +f 182//198 172//192 1254//199 +f 1255//200 167//201 595//202 +f 184//193 172//192 182//198 +f 184//193 182//198 196//203 +f 198//194 184//193 196//203 +f 198//194 196//203 214//204 +f 217//195 198//194 214//204 +f 217//195 214//204 232//205 +f 236//196 217//195 232//205 +f 236//196 232//205 250//206 +f 253//197 236//196 250//206 +f 253//197 250//206 267//207 +f 196//203 182//198 199//208 +f 196//203 199//208 215//209 +f 214//204 196//203 215//209 +f 214//204 215//209 233//210 +f 232//205 214//204 233//210 +f 232//205 233//210 251//211 +f 250//206 232//205 251//211 +f 250//206 251//211 257//212 +f 267//207 250//206 257//212 +f 267//207 257//212 256//213 +f 215//209 199//208 218//214 +f 215//209 218//214 234//215 +f 233//210 215//209 234//215 +f 233//210 234//215 241//216 +f 251//211 233//210 241//216 +f 251//211 241//216 240//217 +f 257//212 251//211 240//217 +f 257//212 240//217 239//218 +f 256//213 257//212 239//218 +f 256//213 239//218 238//219 +f 234//215 218//214 219//220 +f 234//215 219//220 224//221 +f 241//216 234//215 224//221 +f 241//216 224//221 223//222 +f 240//217 241//216 223//222 +f 240//217 223//222 222//223 +f 239//218 240//217 222//223 +f 239//218 222//223 221//224 +f 238//219 239//218 221//224 +f 238//219 221//224 220//225 +f 219//220 218//214 1285//226 +f 648//227 691//228 207//229 +f 224//221 219//220 208//230 +f 224//221 208//230 204//231 +f 223//222 224//221 204//231 +f 223//222 204//231 203//232 +f 222//223 223//222 203//232 +f 222//223 203//232 202//233 +f 221//224 222//223 202//233 +f 221//224 202//233 201//234 +f 220//225 221//224 201//234 +f 220//225 201//234 212//235 +f 204//231 208//230 191//236 +f 204//231 191//236 188//237 +f 203//232 204//231 188//237 +f 203//232 188//237 187//238 +f 202//233 203//232 187//238 +f 202//233 187//238 186//239 +f 201//234 202//233 186//239 +f 201//234 186//239 194//240 +f 212//235 201//234 194//240 +f 212//235 194//240 211//241 +f 188//237 191//236 174//242 +f 188//237 174//242 176//243 +f 187//238 188//237 176//243 +f 187//238 176//243 175//244 +f 186//239 187//238 175//244 +f 186//239 175//244 180//245 +f 194//240 186//239 180//245 +f 194//240 180//245 193//246 +f 211//241 194//240 193//246 +f 211//241 193//246 210//247 +f 613//248 585//249 1258//250 +f 176//243 174//242 168//251 +f 176//243 168//251 165//252 +f 175//244 176//243 165//252 +f 175//244 165//252 170//253 +f 180//245 175//244 170//253 +f 180//245 170//253 179//254 +f 193//246 180//245 179//254 +f 193//246 179//254 192//255 +f 210//247 193//246 192//255 +f 210//247 192//255 209//256 +f 168//251 174//242 164//257 +f 165//252 168//251 161//258 +f 165//252 161//258 162//259 +f 170//253 165//252 162//259 +f 170//253 162//259 171//260 +f 179//254 170//253 171//260 +f 179//254 171//260 181//261 +f 192//255 179//254 181//261 +f 192//255 181//261 195//262 +f 209//256 192//255 195//262 +f 209//256 195//262 213//263 +f 160//178 161//258 158//179 +f 161//258 160//178 162//259 +f 162//259 160//178 166//181 +f 171//260 162//259 166//181 +f 171//260 166//181 177//184 +f 181//261 171//260 177//184 +f 181//261 177//184 189//186 +f 195//262 181//261 189//186 +f 195//262 189//186 205//188 +f 213//263 195//262 205//188 +f 213//263 205//188 225//190 +f 242//264 225//190 235//191 +f 242//264 235//191 252//265 +f 258//266 242//264 252//265 +f 258//266 252//265 268//267 +f 273//268 258//266 268//267 +f 273//268 268//267 283//269 +f 287//270 273//268 283//269 +f 287//270 283//269 298//271 +f 300//272 287//270 298//271 +f 300//272 298//271 299//273 +f 312//274 300//272 299//273 +f 312//274 299//273 310//275 +f 252//265 235//191 253//197 +f 252//265 253//197 269//276 +f 268//267 252//265 269//276 +f 268//267 269//276 284//277 +f 283//269 268//267 284//277 +f 283//269 284//277 286//278 +f 298//271 283//269 286//278 +f 298//271 286//278 285//279 +f 299//273 298//271 285//279 +f 299//273 285//279 296//280 +f 310//275 299//273 296//280 +f 310//275 296//280 309//281 +f 269//276 253//197 267//207 +f 269//276 267//207 272//282 +f 284//277 269//276 272//282 +f 284//277 272//282 271//283 +f 286//278 284//277 271//283 +f 286//278 271//283 270//284 +f 285//279 286//278 270//284 +f 285//279 270//284 281//285 +f 296//280 285//279 281//285 +f 296//280 281//285 295//286 +f 309//281 296//280 295//286 +f 309//281 295//286 308//287 +f 272//282 267//207 256//213 +f 272//282 256//213 255//288 +f 271//283 272//282 255//288 +f 271//283 255//288 254//289 +f 270//284 271//283 254//289 +f 270//284 254//289 265//290 +f 281//285 270//284 265//290 +f 281//285 265//290 280//291 +f 295//286 281//285 280//291 +f 295//286 280//291 294//292 +f 308//287 295//286 294//292 +f 308//287 294//292 307//293 +f 255//288 256//213 238//219 +f 255//288 238//219 237//294 +f 254//289 255//288 237//294 +f 254//289 237//294 248//295 +f 265//290 254//289 248//295 +f 265//290 248//295 264//296 +f 280//291 265//290 264//296 +f 280//291 264//296 279//297 +f 294//292 280//291 279//297 +f 294//292 279//297 293//298 +f 307//293 294//292 293//298 +f 307//293 293//298 306//299 +f 237//294 238//219 220//225 +f 237//294 220//225 230//300 +f 248//295 237//294 230//300 +f 248//295 230//300 247//301 +f 264//296 248//295 247//301 +f 264//296 247//301 263//302 +f 279//297 264//296 263//302 +f 279//297 263//302 278//303 +f 293//298 279//297 278//303 +f 293//298 278//303 292//304 +f 306//299 293//298 292//304 +f 306//299 292//304 305//305 +f 230//300 220//225 212//235 +f 230//300 212//235 229//306 +f 247//301 230//300 229//306 +f 247//301 229//306 246//307 +f 263//302 247//301 246//307 +f 263//302 246//307 262//308 +f 278//303 263//302 262//308 +f 278//303 262//308 277//309 +f 292//304 278//303 277//309 +f 292//304 277//309 291//310 +f 305//305 292//304 291//310 +f 305//305 291//310 304//311 +f 229//306 212//235 211//241 +f 229//306 211//241 228//312 +f 246//307 229//306 228//312 +f 246//307 228//312 245//313 +f 262//308 246//307 245//313 +f 262//308 245//313 261//314 +f 277//309 262//308 261//314 +f 277//309 261//314 276//315 +f 291//310 277//309 276//315 +f 291//310 276//315 290//316 +f 304//311 291//310 290//316 +f 304//311 290//316 303//317 +f 228//312 211//241 210//247 +f 228//312 210//247 227//318 +f 245//313 228//312 227//318 +f 245//313 227//318 244//319 +f 261//314 245//313 244//319 +f 261//314 244//319 260//320 +f 276//315 261//314 260//320 +f 276//315 260//320 275//321 +f 290//316 276//315 275//321 +f 290//316 275//321 289//322 +f 303//317 290//316 289//322 +f 303//317 289//322 302//323 +f 227//318 210//247 209//256 +f 227//318 209//256 226//324 +f 244//319 227//318 226//324 +f 244//319 226//324 243//325 +f 260//320 244//319 243//325 +f 260//320 243//325 259//326 +f 275//321 260//320 259//326 +f 275//321 259//326 274//327 +f 289//322 275//321 274//327 +f 289//322 274//327 288//328 +f 302//323 289//322 288//328 +f 302//323 288//328 301//329 +f 226//324 209//256 213//263 +f 226//324 213//263 231//330 +f 243//325 226//324 231//330 +f 243//325 231//330 249//331 +f 259//326 243//325 249//331 +f 259//326 249//331 266//332 +f 274//327 259//326 266//332 +f 274//327 266//332 282//333 +f 288//328 274//327 282//333 +f 288//328 282//333 297//334 +f 301//329 288//328 297//334 +f 301//329 297//334 311//335 +f 231//330 213//263 225//190 +f 231//330 225//190 242//264 +f 249//331 231//330 242//264 +f 249//331 242//264 258//266 +f 266//332 249//331 258//266 +f 266//332 258//266 273//268 +f 282//333 266//332 273//268 +f 282//333 273//268 287//270 +f 297//334 282//333 287//270 +f 297//334 287//270 300//272 +f 311//335 297//334 300//272 +f 311//335 300//272 312//274 +f 312//274 310//275 323//336 +f 302//323 315//337 316//338 +f 304//311 317//339 318//340 +f 303//317 316//338 317//339 +f 309//281 308//287 321//341 +f 307//293 306//299 319//342 +f 311//335 313//343 314//344 +f 301//329 314//344 315//337 +f 312//274 324//345 313//343 +f 306//299 305//305 318//340 +f 308//287 307//293 320//346 +f 310//275 309//281 322//347 +f 322//347 321//341 325//348 +f 314//344 313//343 325//348 +f 323//336 322//347 325//348 +f 319//342 318//340 325//348 +f 315//337 314//344 325//348 +f 321//341 320//346 325//348 +f 324//345 323//336 325//348 +f 320//346 319//342 325//348 +f 317//339 316//338 325//348 +f 316//338 315//337 325//348 +f 313//343 324//345 325//348 +f 318//340 317//339 325//348 +f 326//349 327//350 328//351 +f 326//349 328//351 329//352 +f 333//353 326//349 329//352 +f 333//353 329//352 338//354 +f 347//355 333//353 338//354 +f 347//355 338//354 354//356 +f 364//357 347//355 354//356 +f 364//357 354//356 374//358 +f 386//359 364//357 374//358 +f 386//359 374//358 398//360 +f 412//361 386//359 398//360 +f 412//361 398//360 429//362 +f 329//352 328//351 334//363 +f 329//352 334//363 339//364 +f 338//354 329//352 339//364 +f 338//354 339//364 355//365 +f 354//356 338//354 355//365 +f 354//356 355//365 375//366 +f 374//358 354//356 375//366 +f 374//358 375//366 399//367 +f 398//360 374//358 399//367 +f 398//360 399//367 430//368 +f 429//362 398//360 430//368 +f 429//362 430//368 464//369 +f 339//364 334//363 342//370 +f 339//364 342//370 356//371 +f 355//365 339//364 356//371 +f 355//365 356//371 376//372 +f 375//366 355//365 376//372 +f 375//366 376//372 400//373 +f 399//367 375//366 400//373 +f 399//367 400//373 431//374 +f 430//368 399//367 431//374 +f 430//368 431//374 465//375 +f 464//369 430//368 465//375 +f 464//369 465//375 497//376 +f 356//371 342//370 351//377 +f 356//371 351//377 370//378 +f 376//372 356//371 370//378 +f 376//372 370//378 393//379 +f 400//373 376//372 393//379 +f 400//373 393//379 422//380 +f 431//374 400//373 422//380 +f 431//374 422//380 457//381 +f 465//375 431//374 457//381 +f 465//375 457//381 490//382 +f 497//376 465//375 490//382 +f 497//376 490//382 521//383 +f 370//378 351//377 361//384 +f 370//378 361//384 382//385 +f 393//379 370//378 382//385 +f 393//379 382//385 408//386 +f 422//380 393//379 408//386 +f 422//380 408//386 439//387 +f 457//381 422//380 439//387 +f 457//381 439//387 473//388 +f 490//382 457//381 473//388 +f 490//382 473//388 504//389 +f 521//383 490//382 504//389 +f 521//383 504//389 535//390 +f 382//385 361//384 369//391 +f 382//385 369//391 392//392 +f 408//386 382//385 392//392 +f 408//386 392//392 421//393 +f 439//387 408//386 421//393 +f 439//387 421//393 456//394 +f 473//388 439//387 456//394 +f 473//388 456//394 489//395 +f 504//389 473//388 489//395 +f 504//389 489//395 520//396 +f 535//390 504//389 520//396 +f 535//390 520//396 550//397 +f 392//392 369//391 380//398 +f 392//392 380//398 407//399 +f 421//393 392//392 407//399 +f 421//393 407//399 438//400 +f 456//394 421//393 438//400 +f 456//394 438//400 472//401 +f 489//395 456//394 472//401 +f 489//395 472//401 503//402 +f 520//396 489//395 503//402 +f 520//396 503//402 534//403 +f 550//397 520//396 534//403 +f 550//397 534//403 563//404 +f 407//399 380//398 391//405 +f 407//399 391//405 420//406 +f 438//400 407//399 420//406 +f 438//400 420//406 455//407 +f 472//401 438//400 455//407 +f 472//401 455//407 488//408 +f 503//402 472//401 488//408 +f 503//402 488//408 519//409 +f 534//403 503//402 519//409 +f 534//403 519//409 549//410 +f 563//404 534//403 549//410 +f 563//404 549//410 578//411 +f 420//406 391//405 404//412 +f 420//406 404//412 437//413 +f 455//407 420//406 437//413 +f 455//407 437//413 471//414 +f 488//408 455//407 471//414 +f 488//408 471//414 502//415 +f 519//409 488//408 502//415 +f 519//409 502//415 533//416 +f 549//410 519//409 533//416 +f 549//410 533//416 562//417 +f 578//411 549//410 562//417 +f 578//411 562//417 589//418 +f 437//413 404//412 419//419 +f 437//413 419//419 454//420 +f 471//414 437//413 454//420 +f 471//414 454//420 487//421 +f 502//415 471//414 487//421 +f 502//415 487//421 518//422 +f 533//416 502//415 518//422 +f 533//416 518//422 548//423 +f 562//417 533//416 548//423 +f 562//417 548//423 577//424 +f 589//418 562//417 577//424 +f 589//418 577//424 594//425 +f 454//420 419//419 436//426 +f 454//420 436//426 470//427 +f 487//421 454//420 470//427 +f 487//421 470//427 501//428 +f 518//422 487//421 501//428 +f 518//422 501//428 532//429 +f 548//423 518//422 532//429 +f 548//423 532//429 555//430 +f 577//424 548//423 555//430 +f 577//424 555//430 567//431 +f 594//425 577//424 567//431 +f 594//425 567//431 582//432 +f 470//427 436//426 453//433 +f 470//427 453//433 486//434 +f 501//428 470//427 486//434 +f 501//428 486//434 508//435 +f 532//429 501//428 508//435 +f 532//429 508//435 525//436 +f 555//430 532//429 525//436 +f 555//430 525//436 538//437 +f 567//431 555//430 538//437 +f 567//431 538//437 554//438 +f 582//432 567//431 554//438 +f 582//432 554//438 566//33 +f 486//434 453//433 462//439 +f 486//434 462//439 477//440 +f 508//435 486//434 477//440 +f 508//435 477//440 494//441 +f 525//436 508//435 494//441 +f 525//436 494//441 507//442 +f 538//437 525//436 507//442 +f 538//437 507//442 524//443 +f 554//438 538//437 524//443 +f 554//438 524//443 537//444 +f 566//33 554//438 537//444 +f 566//33 537//444 553//31 +f 477//440 462//439 443//445 +f 477//440 443//445 461//446 +f 494//441 477//440 461//446 +f 494//441 461//446 476//447 +f 507//442 494//441 476//447 +f 507//442 476//447 493//448 +f 524//443 507//442 493//448 +f 524//443 493//448 506//449 +f 537//444 524//443 506//449 +f 537//444 506//449 523//450 +f 553//31 537//444 523//450 +f 553//31 523//450 536//451 +f 461//446 443//445 426//452 +f 461//446 426//452 442//453 +f 476//447 461//446 442//453 +f 476//447 442//453 460//454 +f 493//448 476//447 460//454 +f 493//448 460//454 475//455 +f 506//449 493//448 475//455 +f 506//449 475//455 492//456 +f 523//450 506//449 492//456 +f 523//450 492//456 505//457 +f 536//451 523//450 505//457 +f 536//451 505//457 522//458 +f 442//453 426//452 411//459 +f 442//453 411//459 425//460 +f 460//454 442//453 425//460 +f 460//454 425//460 441//461 +f 475//455 460//454 441//461 +f 475//455 441//461 459//462 +f 492//456 475//455 459//462 +f 492//456 459//462 474//463 +f 505//457 492//456 474//463 +f 505//457 474//463 491//464 +f 522//458 505//457 491//464 +f 522//458 491//464 499//465 +f 425//460 411//459 396//466 +f 425//460 396//466 410//467 +f 441//461 425//460 410//467 +f 441//461 410//467 424//468 +f 459//462 441//461 424//468 +f 459//462 424//468 440//469 +f 474//463 459//462 440//469 +f 474//463 440//469 458//470 +f 491//464 474//463 458//470 +f 491//464 458//470 467//471 +f 499//465 491//464 467//471 +f 499//465 467//471 466//472 +f 410//467 396//466 385//473 +f 410//467 385//473 395//474 +f 424//468 410//467 395//474 +f 424//468 395//474 409//475 +f 440//469 424//468 409//475 +f 440//469 409//475 423//476 +f 458//470 440//469 423//476 +f 458//470 423//476 433//477 +f 467//471 458//470 433//477 +f 467//471 433//477 432//478 +f 466//472 467//471 432//478 +f 466//472 432//478 434//479 +f 395//474 385//473 372//480 +f 395//474 372//480 383//481 +f 409//475 395//474 383//481 +f 409//475 383//481 394//482 +f 423//476 409//475 394//482 +f 423//476 394//482 402//483 +f 433//477 423//476 402//483 +f 433//477 402//483 401//484 +f 432//478 433//477 401//484 +f 432//478 401//484 403//485 +f 434//479 432//478 403//485 +f 434//479 403//485 417//486 +f 383//481 372//480 362//487 +f 383//481 362//487 371//488 +f 394//482 383//481 371//488 +f 394//482 371//488 378//489 +f 402//483 394//482 378//489 +f 402//483 378//489 377//490 +f 401//484 402//483 377//490 +f 401//484 377//490 379//491 +f 403//485 401//484 379//491 +f 403//485 379//491 390//492 +f 417//486 403//485 390//492 +f 417//486 390//492 416//493 +f 371//488 362//487 352//494 +f 371//488 352//494 358//495 +f 378//489 371//488 358//495 +f 378//489 358//495 357//496 +f 377//490 378//489 357//496 +f 377//490 357//496 359//497 +f 379//491 377//490 359//497 +f 379//491 359//497 367//498 +f 390//492 379//491 367//498 +f 390//492 367//498 389//499 +f 416//493 390//492 389//499 +f 416//493 389//499 415//500 +f 358//495 352//494 345//501 +f 358//495 345//501 340//502 +f 357//496 358//495 340//502 +f 357//496 340//502 341//503 +f 359//497 357//496 341//503 +f 359//497 341//503 349//504 +f 367//498 359//497 349//504 +f 367//498 349//504 366//505 +f 389//499 367//498 366//505 +f 389//499 366//505 388//506 +f 415//500 389//499 388//506 +f 415//500 388//506 414//507 +f 340//502 345//501 335//508 +f 340//502 335//508 330//509 +f 341//503 340//502 330//509 +f 341//503 330//509 336//510 +f 349//504 341//503 336//510 +f 349//504 336//510 348//511 +f 366//505 349//504 348//511 +f 366//505 348//511 365//512 +f 388//506 366//505 365//512 +f 388//506 365//512 387//513 +f 414//507 388//506 387//513 +f 414//507 387//513 413//514 +f 330//509 335//508 327//350 +f 327//350 326//349 330//509 +f 330//509 326//349 336//510 +f 336//510 326//349 333//353 +f 348//511 336//510 333//353 +f 348//511 333//353 347//355 +f 365//512 348//511 347//355 +f 365//512 347//355 364//357 +f 387//513 365//512 364//357 +f 387//513 364//357 386//359 +f 413//514 387//513 386//359 +f 413//514 386//359 412//361 +f 445//515 412//361 429//362 +f 445//515 429//362 463//516 +f 478//517 445//515 463//516 +f 478//517 463//516 495//518 +f 509//176 478//517 495//518 +f 509//176 495//518 526//519 +f 463//516 429//362 464//369 +f 463//516 464//369 496//520 +f 495//518 463//516 496//520 +f 495//518 496//520 527//521 +f 526//519 495//518 527//521 +f 526//519 527//521 557//522 +f 556//523 526//519 557//522 +f 556//523 557//522 583//524 +f 595//202 556//523 583//524 +f 595//202 583//524 611//525 +f 621//526 595//202 611//525 +f 621//526 611//525 638//527 +f 496//520 464//369 497//376 +f 496//520 497//376 528//528 +f 527//521 496//520 528//528 +f 527//521 528//528 558//529 +f 557//522 527//521 558//529 +f 557//522 558//529 584//530 +f 583//524 557//522 584//530 +f 583//524 584//530 612//531 +f 611//525 583//524 612//531 +f 611//525 612//531 639//532 +f 638//527 611//525 639//532 +f 638//527 639//532 664//533 +f 528//528 497//376 521//383 +f 528//528 521//383 551//534 +f 558//529 528//528 551//534 +f 558//529 551//534 580//535 +f 584//530 558//529 580//535 +f 584//530 580//535 608//536 +f 612//531 584//530 608//536 +f 612//531 608//536 634//537 +f 639//532 612//531 634//537 +f 639//532 634//537 661//538 +f 664//533 639//532 661//538 +f 664//533 661//538 688//539 +f 551//534 521//383 535//390 +f 551//534 535//390 564//540 +f 580//535 551//534 564//540 +f 580//535 564//540 591//541 +f 608//536 580//535 591//541 +f 608//536 591//541 618//542 +f 634//537 608//536 618//542 +f 634//537 618//542 644//543 +f 661//538 634//537 644//543 +f 661//538 644//543 670//544 +f 688//539 661//538 670//544 +f 688//539 670//544 698//545 +f 564//540 535//390 550//397 +f 564//540 550//397 579//546 +f 591//541 564//540 579//546 +f 591//541 579//546 607//547 +f 618//542 591//541 607//547 +f 618//542 607//547 633//548 +f 644//543 618//542 633//548 +f 644//543 633//548 660//549 +f 670//544 644//543 660//549 +f 670//544 660//549 687//550 +f 698//545 670//544 687//550 +f 698//545 687//550 717//551 +f 579//546 550//397 563//404 +f 579//546 563//404 590//552 +f 607//547 579//546 590//552 +f 607//547 590//552 617//553 +f 633//548 607//547 617//553 +f 633//548 617//553 643//554 +f 660//549 633//548 643//554 +f 660//549 643//554 669//555 +f 687//550 660//549 669//555 +f 687//550 669//555 697//556 +f 717//551 687//550 697//556 +f 717//551 697//556 727//557 +f 590//552 563//404 578//411 +f 590//552 578//411 606//558 +f 617//553 590//552 606//558 +f 617//553 606//558 632//559 +f 643//554 617//553 632//559 +f 643//554 632//559 659//560 +f 669//555 643//554 659//560 +f 669//555 659//560 673//561 +f 697//556 669//555 673//561 +f 697//556 673//561 700//562 +f 727//557 697//556 700//562 +f 727//557 700//562 699//563 +f 606//558 578//411 589//418 +f 606//558 589//418 616//564 +f 632//559 606//558 616//564 +f 632//559 616//564 637//565 +f 659//560 632//559 637//565 +f 659//560 637//565 647//566 +f 673//561 659//560 647//566 +f 673//561 647//566 672//567 +f 700//562 673//561 672//567 +f 700//562 672//567 671//568 +f 699//563 700//562 671//568 +f 699//563 671//568 689//569 +f 616//564 589//418 594//425 +f 616//564 594//425 610//570 +f 637//565 616//564 610//570 +f 637//565 610//570 620//571 +f 647//566 637//565 620//571 +f 647//566 620//571 646//572 +f 672//567 647//566 646//572 +f 672//567 646//572 645//573 +f 671//568 672//567 645//573 +f 671//568 645//573 662//574 +f 689//569 671//568 662//574 +f 689//569 662//574 668//575 +f 610//570 594//425 582//432 +f 610//570 582//432 593//3 +f 620//571 610//570 593//3 +f 620//571 593//3 636//89 +f 646//572 620//571 636//89 +f 646//572 636//89 619//576 +f 645//573 646//572 619//576 +f 645//573 619//576 635//577 +f 662//574 645//573 635//577 +f 662//574 635//577 642//578 +f 668//575 662//574 642//578 +f 668//575 642//578 641//579 +f 593//3 582//432 566//33 +f 619//576 636//89 592//57 +f 619//576 592//57 609//580 +f 635//577 619//576 609//580 +f 635//577 609//580 615//581 +f 642//578 635//577 615//581 +f 642//578 615//581 614//582 +f 641//579 642//578 614//582 +f 592//57 565//56 581//583 +f 609//580 592//57 581//583 +f 609//580 581//583 587//584 +f 615//581 609//580 587//584 +f 615//581 587//584 586//585 +f 614//582 615//581 586//585 +f 614//582 586//585 588//586 +f 565//56 553//31 536//451 +f 565//56 536//451 552//587 +f 581//583 565//56 552//587 +f 581//583 552//587 560//588 +f 587//584 581//583 560//588 +f 587//584 560//588 559//589 +f 586//585 587//584 559//589 +f 586//585 559//589 561//590 +f 588//586 586//585 561//590 +f 588//586 561//590 576//591 +f 605//592 588//586 576//591 +f 605//592 576//591 604//593 +f 552//587 536//451 522//458 +f 552//587 522//458 530//594 +f 560//588 552//587 530//594 +f 560//588 530//594 529//595 +f 559//589 560//588 529//595 +f 559//589 529//595 531//596 +f 561//590 559//589 531//596 +f 561//590 531//596 547//597 +f 576//591 561//590 547//597 +f 576//591 547//597 575//598 +f 604//593 576//591 575//598 +f 604//593 575//598 603//599 +f 530//594 522//458 499//465 +f 530//594 499//465 498//600 +f 529//595 530//594 498//600 +f 529//595 498//600 500//601 +f 531//596 529//595 500//601 +f 531//596 500//601 517//602 +f 547//597 531//596 517//602 +f 547//597 517//602 546//603 +f 575//598 547//597 546//603 +f 575//598 546//603 574//604 +f 603//599 575//598 574//604 +f 603//599 574//604 602//605 +f 498//600 499//465 466//472 +f 498//600 466//472 468//606 +f 500//601 498//600 468//606 +f 500//601 468//606 485//607 +f 517//602 500//601 485//607 +f 517//602 485//607 516//608 +f 546//603 517//602 516//608 +f 546//603 516//608 545//609 +f 574//604 546//603 545//609 +f 574//604 545//609 573//610 +f 602//605 574//604 573//610 +f 602//605 573//610 601//611 +f 468//606 466//472 434//479 +f 468//606 434//479 451//612 +f 485//607 468//606 451//612 +f 485//607 451//612 484//613 +f 516//608 485//607 484//613 +f 516//608 484//613 515//614 +f 545//609 516//608 515//614 +f 545//609 515//614 544//615 +f 573//610 545//609 544//615 +f 573//610 544//615 572//616 +f 601//611 573//610 572//616 +f 601//611 572//616 600//617 +f 451//612 434//479 417//486 +f 451//612 417//486 450//618 +f 484//613 451//612 450//618 +f 484//613 450//618 483//619 +f 515//614 484//613 483//619 +f 515//614 483//619 514//620 +f 544//615 515//614 514//620 +f 544//615 514//620 543//621 +f 572//616 544//615 543//621 +f 572//616 543//621 571//622 +f 600//617 572//616 571//622 +f 600//617 571//622 599//623 +f 450//618 417//486 416//493 +f 450//618 416//493 449//624 +f 483//619 450//618 449//624 +f 483//619 449//624 482//625 +f 514//620 483//619 482//625 +f 514//620 482//625 513//626 +f 543//621 514//620 513//626 +f 543//621 513//626 542//627 +f 571//622 543//621 542//627 +f 571//622 542//627 570//628 +f 599//623 571//622 570//628 +f 599//623 570//628 598//629 +f 449//624 416//493 415//500 +f 449//624 415//500 448//630 +f 482//625 449//624 448//630 +f 482//625 448//630 481//631 +f 513//626 482//625 481//631 +f 513//626 481//631 512//632 +f 542//627 513//626 512//632 +f 542//627 512//632 541//633 +f 570//628 542//627 541//633 +f 570//628 541//633 569//634 +f 598//629 570//628 569//634 +f 598//629 569//634 597//635 +f 448//630 415//500 414//507 +f 448//630 414//507 447//636 +f 481//631 448//630 447//636 +f 481//631 447//636 480//637 +f 512//632 481//631 480//637 +f 512//632 480//637 511//638 +f 541//633 512//632 511//638 +f 541//633 511//638 540//639 +f 569//634 541//633 540//639 +f 569//634 540//639 568//640 +f 597//635 569//634 568//640 +f 597//635 568//640 596//641 +f 447//636 414//507 413//514 +f 447//636 413//514 446//642 +f 480//637 447//636 446//642 +f 480//637 446//642 479//643 +f 511//638 480//637 479//643 +f 511//638 479//643 510//644 +f 540//639 511//638 510//644 +f 540//639 510//644 539//175 +f 568//640 540//639 539//175 +f 568//640 539//175 585//249 +f 596//641 568//640 585//249 +f 596//641 585//249 613//248 +f 446//642 413//514 412//361 +f 446//642 412//361 445//515 +f 479//643 446//642 445//515 +f 479//643 445//515 478//517 +f 510//644 479//643 478//517 +f 510//644 478//517 509//176 +f 539//175 510//644 509//176 +f 691//228 648//227 674//645 +f 702//646 691//228 674//645 +f 702//646 674//645 701//647 +f 731//648 702//646 701//647 +f 731//648 701//647 730//649 +f 759//650 731//648 730//649 +f 759//650 730//649 758//651 +f 786//652 759//650 758//651 +f 786//652 758//651 785//653 +f 648//227 621//526 638//527 +f 648//227 638//527 663//654 +f 674//645 648//227 663//654 +f 674//645 663//654 690//655 +f 701//647 674//645 690//655 +f 701//647 690//655 720//656 +f 730//649 701//647 720//656 +f 730//649 720//656 749//657 +f 758//651 730//649 749//657 +f 758//651 749//657 777//658 +f 785//653 758//651 777//658 +f 785//653 777//658 805//659 +f 663//654 638//527 664//533 +f 663//654 664//533 692//660 +f 690//655 663//654 692//660 +f 690//655 692//660 721//661 +f 720//656 690//655 721//661 +f 720//656 721//661 750//662 +f 749//657 720//656 750//662 +f 749//657 750//662 778//663 +f 777//658 749//657 778//663 +f 777//658 778//663 806//664 +f 805//659 777//658 806//664 +f 805//659 806//664 833//665 +f 692//660 664//533 688//539 +f 692//660 688//539 718//666 +f 721//661 692//660 718//666 +f 721//661 718//666 747//667 +f 750//662 721//661 747//667 +f 750//662 747//667 775//668 +f 778//663 750//662 775//668 +f 778//663 775//668 803//669 +f 806//664 778//663 803//669 +f 806//664 803//669 831//670 +f 833//665 806//664 831//670 +f 833//665 831//670 838//671 +f 718//666 688//539 698//545 +f 718//666 698//545 728//672 +f 747//667 718//666 728//672 +f 747//667 728//672 756//673 +f 775//668 747//667 756//673 +f 775//668 756//673 784//674 +f 803//669 775//668 784//674 +f 803//669 784//674 804//675 +f 831//670 803//669 804//675 +f 831//670 804//675 811//676 +f 838//671 831//670 811//676 +f 838//671 811//676 830//677 +f 728//672 698//545 717//551 +f 728//672 717//551 746//678 +f 756//673 728//672 746//678 +f 756//673 746//678 757//679 +f 784//674 756//673 757//679 +f 784//674 757//679 776//680 +f 804//675 784//674 776//680 +f 804//675 776//680 783//681 +f 811//676 804//675 783//681 +f 811//676 783//681 802//682 +f 830//677 811//676 802//682 +f 830//677 802//682 810//683 +f 746//678 717//551 727//557 +f 746//678 727//557 729//684 +f 757//679 746//678 729//684 +f 757//679 729//684 748//685 +f 776//680 757//679 748//685 +f 776//680 748//685 755//686 +f 783//681 776//680 755//686 +f 783//681 755//686 774//687 +f 802//682 783//681 774//687 +f 802//682 774//687 782//688 +f 810//683 802//682 782//688 +f 810//683 782//688 809//689 +f 729//684 727//557 699//563 +f 729//684 699//563 719//690 +f 748//685 729//684 719//690 +f 748//685 719//690 726//691 +f 755//686 748//685 726//691 +f 755//686 726//691 745//692 +f 774//687 755//686 745//692 +f 774//687 745//692 754//693 +f 782//688 774//687 754//693 +f 782//688 754//693 781//694 +f 809//689 782//688 781//694 +f 809//689 781//694 780//695 +f 719//690 699//563 689//569 +f 719//690 689//569 696//696 +f 726//691 719//690 696//696 +f 726//691 696//696 716//697 +f 745//692 726//691 716//697 +f 745//692 716//697 725//698 +f 754//693 745//692 725//698 +f 754//693 725//698 753//699 +f 781//694 754//693 753//699 +f 781//694 753//699 752//700 +f 780//695 781//694 752//700 +f 780//695 752//700 773//701 +f 696//696 689//569 668//575 +f 696//696 668//575 686//702 +f 716//697 696//696 686//702 +f 716//697 686//702 695//703 +f 725//698 716//697 695//703 +f 725//698 695//703 724//704 +f 753//699 725//698 724//704 +f 753//699 724//704 723//705 +f 752//700 753//699 723//705 +f 752//700 723//705 744//706 +f 773//701 752//700 744//706 +f 773//701 744//706 772//707 +f 686//702 668//575 641//579 +f 686//702 641//579 667//708 +f 695//703 686//702 667//708 +f 695//703 667//708 715//160 +f 724//704 695//703 715//160 +f 724//704 715//160 694//709 +f 723//705 724//704 694//709 +f 723//705 694//709 714//710 +f 744//706 723//705 714//710 +f 744//706 714//710 743//711 +f 772//707 744//706 743//711 +f 772//707 743//711 771//712 +f 694//709 715//160 666//713 +f 694//709 666//713 685//714 +f 714//710 694//709 685//714 +f 714//710 685//714 713//715 +f 743//711 714//710 713//715 +f 743//711 713//715 742//716 +f 771//712 743//711 742//716 +f 771//712 742//716 770//717 +f 666//713 631//152 658//718 +f 685//714 666//713 658//718 +f 685//714 658//718 684//719 +f 713//715 685//714 684//719 +f 713//715 684//719 712//720 +f 742//716 713//715 712//720 +f 742//716 712//720 741//721 +f 770//717 742//716 741//721 +f 770//717 741//721 769//722 +f 631//152 605//592 604//593 +f 631//152 604//593 630//723 +f 658//718 631//152 630//723 +f 658//718 630//723 657//724 +f 684//719 658//718 657//724 +f 684//719 657//724 683//725 +f 712//720 684//719 683//725 +f 712//720 683//725 711//726 +f 741//721 712//720 711//726 +f 741//721 711//726 740//727 +f 769//722 741//721 740//727 +f 769//722 740//727 768//728 +f 630//723 604//593 603//599 +f 630//723 603//599 629//729 +f 657//724 630//723 629//729 +f 657//724 629//729 656//730 +f 683//725 657//724 656//730 +f 683//725 656//730 682//731 +f 711//726 683//725 682//731 +f 711//726 682//731 710//732 +f 740//727 711//726 710//732 +f 740//727 710//732 739//733 +f 768//728 740//727 739//733 +f 768//728 739//733 767//734 +f 629//729 603//599 602//605 +f 629//729 602//605 628//735 +f 656//730 629//729 628//735 +f 656//730 628//735 655//736 +f 682//731 656//730 655//736 +f 682//731 655//736 681//737 +f 710//732 682//731 681//737 +f 710//732 681//737 709//738 +f 739//733 710//732 709//738 +f 739//733 709//738 738//739 +f 767//734 739//733 738//739 +f 767//734 738//739 766//740 +f 628//735 602//605 601//611 +f 628//735 601//611 627//741 +f 655//736 628//735 627//741 +f 655//736 627//741 654//742 +f 681//737 655//736 654//742 +f 681//737 654//742 680//743 +f 709//738 681//737 680//743 +f 709//738 680//743 708//744 +f 738//739 709//738 708//744 +f 738//739 708//744 737//745 +f 766//740 738//739 737//745 +f 766//740 737//745 765//746 +f 627//741 601//611 600//617 +f 627//741 600//617 626//747 +f 654//742 627//741 626//747 +f 654//742 626//747 653//748 +f 680//743 654//742 653//748 +f 680//743 653//748 679//749 +f 708//744 680//743 679//749 +f 708//744 679//749 707//750 +f 737//745 708//744 707//750 +f 737//745 707//750 736//751 +f 765//746 737//745 736//751 +f 765//746 736//751 764//752 +f 626//747 600//617 599//623 +f 626//747 599//623 625//753 +f 653//748 626//747 625//753 +f 653//748 625//753 652//754 +f 679//749 653//748 652//754 +f 679//749 652//754 678//755 +f 707//750 679//749 678//755 +f 707//750 678//755 706//756 +f 736//751 707//750 706//756 +f 736//751 706//756 735//757 +f 764//752 736//751 735//757 +f 764//752 735//757 763//758 +f 625//753 599//623 598//629 +f 625//753 598//629 624//759 +f 652//754 625//753 624//759 +f 652//754 624//759 651//760 +f 678//755 652//754 651//760 +f 678//755 651//760 677//761 +f 706//756 678//755 677//761 +f 706//756 677//761 705//762 +f 735//757 706//756 705//762 +f 735//757 705//762 734//763 +f 763//758 735//757 734//763 +f 763//758 734//763 762//764 +f 624//759 598//629 597//635 +f 624//759 597//635 623//765 +f 651//760 624//759 623//765 +f 651//760 623//765 650//766 +f 677//761 651//760 650//766 +f 677//761 650//766 676//767 +f 705//762 677//761 676//767 +f 705//762 676//767 704//768 +f 734//763 705//762 704//768 +f 734//763 704//768 733//769 +f 762//764 734//763 733//769 +f 762//764 733//769 761//770 +f 623//765 597//635 596//641 +f 623//765 596//641 622//771 +f 650//766 623//765 622//771 +f 650//766 622//771 649//772 +f 676//767 650//766 649//772 +f 676//767 649//772 675//773 +f 704//768 676//767 675//773 +f 704//768 675//773 703//774 +f 733//769 704//768 703//774 +f 733//769 703//774 732//775 +f 761//770 733//769 732//775 +f 761//770 732//775 760//776 +f 622//771 596//641 613//248 +f 622//771 613//248 640//777 +f 649//772 622//771 640//777 +f 649//772 640//777 665//778 +f 675//773 649//772 665//778 +f 675//773 665//778 693//779 +f 703//774 675//773 693//779 +f 703//774 693//779 722//780 +f 732//775 703//774 722//780 +f 732//775 722//780 751//781 +f 760//776 732//775 751//781 +f 760//776 751//781 779//782 +f 693//779 665//778 691//228 +f 693//779 691//228 702//646 +f 722//780 693//779 702//646 +f 722//780 702//646 731//648 +f 751//781 722//780 731//648 +f 751//781 731//648 759//650 +f 779//782 751//781 759//650 +f 779//782 759//650 786//652 +f 917//783 918//784 913//785 +f 892//786 917//783 913//785 +f 892//786 913//785 887//787 +f 866//788 892//786 887//787 +f 866//788 887//787 861//789 +f 840//790 866//788 861//789 +f 840//790 861//789 834//791 +f 813//792 840//790 834//791 +f 813//792 834//791 807//793 +f 786//652 813//792 807//793 +f 786//652 807//793 779//782 +f 913//785 918//784 893//794 +f 887//787 913//785 893//794 +f 887//787 893//794 867//795 +f 861//789 887//787 867//795 +f 861//789 867//795 841//796 +f 834//791 861//789 841//796 +f 834//791 841//796 814//797 +f 807//793 834//791 814//797 +f 807//793 814//797 787//798 +f 779//782 807//793 787//798 +f 779//782 787//798 760//776 +f 893//794 918//784 894//799 +f 867//795 893//794 894//799 +f 867//795 894//799 868//800 +f 841//796 867//795 868//800 +f 841//796 868//800 842//801 +f 814//797 841//796 842//801 +f 814//797 842//801 815//802 +f 787//798 814//797 815//802 +f 787//798 815//802 788//803 +f 760//776 787//798 788//803 +f 760//776 788//803 761//770 +f 894//799 918//784 895//804 +f 868//800 894//799 895//804 +f 868//800 895//804 869//805 +f 842//801 868//800 869//805 +f 842//801 869//805 843//806 +f 815//802 842//801 843//806 +f 815//802 843//806 816//807 +f 788//803 815//802 816//807 +f 788//803 816//807 789//808 +f 761//770 788//803 789//808 +f 761//770 789//808 762//764 +f 895//804 918//784 896//809 +f 869//805 895//804 896//809 +f 869//805 896//809 870//810 +f 843//806 869//805 870//810 +f 843//806 870//810 844//811 +f 816//807 843//806 844//811 +f 816//807 844//811 817//812 +f 789//808 816//807 817//812 +f 789//808 817//812 790//813 +f 762//764 789//808 790//813 +f 762//764 790//813 763//758 +f 896//809 918//784 897//814 +f 870//810 896//809 897//814 +f 870//810 897//814 871//815 +f 844//811 870//810 871//815 +f 844//811 871//815 845//816 +f 817//812 844//811 845//816 +f 817//812 845//816 818//817 +f 790//813 817//812 818//817 +f 790//813 818//817 791//818 +f 763//758 790//813 791//818 +f 763//758 791//818 764//752 +f 897//814 918//784 898//819 +f 871//815 897//814 898//819 +f 871//815 898//819 872//820 +f 845//816 871//815 872//820 +f 845//816 872//820 846//821 +f 818//817 845//816 846//821 +f 818//817 846//821 819//822 +f 791//818 818//817 819//822 +f 791//818 819//822 792//823 +f 764//752 791//818 792//823 +f 764//752 792//823 765//746 +f 898//819 918//784 899//824 +f 872//820 898//819 899//824 +f 872//820 899//824 873//825 +f 846//821 872//820 873//825 +f 846//821 873//825 847//826 +f 819//822 846//821 847//826 +f 819//822 847//826 820//827 +f 792//823 819//822 820//827 +f 792//823 820//827 793//828 +f 765//746 792//823 793//828 +f 765//746 793//828 766//740 +f 899//824 918//784 900//829 +f 873//825 899//824 900//829 +f 873//825 900//829 874//830 +f 847//826 873//825 874//830 +f 847//826 874//830 848//831 +f 820//827 847//826 848//831 +f 820//827 848//831 821//832 +f 793//828 820//827 821//832 +f 793//828 821//832 794//833 +f 766//740 793//828 794//833 +f 766//740 794//833 767//734 +f 900//829 918//784 901//834 +f 874//830 900//829 901//834 +f 874//830 901//834 875//835 +f 848//831 874//830 875//835 +f 848//831 875//835 849//836 +f 821//832 848//831 849//836 +f 821//832 849//836 822//837 +f 794//833 821//832 822//837 +f 794//833 822//837 795//838 +f 767//734 794//833 795//838 +f 767//734 795//838 768//728 +f 901//834 918//784 902//839 +f 875//835 901//834 902//839 +f 875//835 902//839 876//840 +f 849//836 875//835 876//840 +f 849//836 876//840 850//841 +f 822//837 849//836 850//841 +f 822//837 850//841 823//842 +f 795//838 822//837 823//842 +f 795//838 823//842 796//843 +f 768//728 795//838 796//843 +f 768//728 796//843 769//722 +f 902//839 918//784 903//844 +f 876//840 902//839 903//844 +f 876//840 903//844 877//845 +f 850//841 876//840 877//845 +f 850//841 877//845 851//846 +f 823//842 850//841 851//846 +f 823//842 851//846 824//847 +f 796//843 823//842 824//847 +f 796//843 824//847 797//848 +f 769//722 796//843 797//848 +f 769//722 797//848 770//717 +f 903//844 918//784 904//849 +f 877//845 903//844 904//849 +f 877//845 904//849 878//850 +f 851//846 877//845 878//850 +f 851//846 878//850 852//851 +f 824//847 851//846 852//851 +f 824//847 852//851 825//852 +f 797//848 824//847 825//852 +f 797//848 825//852 798//853 +f 770//717 797//848 798//853 +f 770//717 798//853 771//712 +f 904//849 918//784 905//854 +f 878//850 904//849 905//854 +f 878//850 905//854 879//855 +f 852//851 878//850 879//855 +f 852//851 879//855 853//856 +f 825//852 852//851 853//856 +f 825//852 853//856 826//857 +f 798//853 825//852 826//857 +f 798//853 826//857 799//858 +f 771//712 798//853 799//858 +f 771//712 799//858 772//707 +f 905//854 918//784 906//859 +f 879//855 905//854 906//859 +f 879//855 906//859 880//860 +f 853//856 879//855 880//860 +f 853//856 880//860 854//861 +f 826//857 853//856 854//861 +f 826//857 854//861 827//862 +f 799//858 826//857 827//862 +f 799//858 827//862 800//863 +f 772//707 799//858 800//863 +f 772//707 800//863 773//701 +f 906//859 918//784 907//864 +f 880//860 906//859 907//864 +f 880//860 907//864 881//865 +f 854//861 880//860 881//865 +f 854//861 881//865 855//866 +f 827//862 854//861 855//866 +f 827//862 855//866 828//867 +f 800//863 827//862 828//867 +f 800//863 828//867 801//868 +f 773//701 800//863 801//868 +f 773//701 801//868 780//695 +f 907//864 918//784 908//869 +f 881//865 907//864 908//869 +f 881//865 908//869 882//870 +f 855//866 881//865 882//870 +f 855//866 882//870 856//871 +f 828//867 855//866 856//871 +f 828//867 856//871 829//872 +f 801//868 828//867 829//872 +f 801//868 829//872 808//873 +f 780//695 801//868 808//873 +f 780//695 808//873 809//689 +f 908//869 918//784 909//874 +f 882//870 908//869 909//874 +f 882//870 909//874 883//875 +f 856//871 882//870 883//875 +f 856//871 883//875 857//876 +f 829//872 856//871 857//876 +f 829//872 857//876 836//877 +f 808//873 829//872 836//877 +f 808//873 836//877 835//878 +f 809//689 808//873 835//878 +f 809//689 835//878 810//683 +f 909//874 918//784 910//879 +f 883//875 909//874 910//879 +f 883//875 910//879 884//880 +f 857//876 883//875 884//880 +f 857//876 884//880 863//881 +f 836//877 857//876 863//881 +f 836//877 863//881 862//882 +f 835//878 836//877 862//882 +f 835//878 862//882 837//883 +f 810//683 835//878 837//883 +f 810//683 837//883 830//677 +f 910//879 918//784 911//884 +f 884//880 910//879 911//884 +f 884//880 911//884 889//885 +f 863//881 884//880 889//885 +f 863//881 889//885 888//886 +f 862//882 863//881 888//886 +f 862//882 888//886 864//887 +f 837//883 862//882 864//887 +f 837//883 864//887 858//888 +f 830//677 837//883 858//888 +f 830//677 858//888 838//671 +f 911//884 918//784 915//889 +f 889//885 911//884 915//889 +f 889//885 915//889 914//890 +f 888//886 889//885 914//890 +f 888//886 914//890 890//891 +f 864//887 888//886 890//891 +f 864//887 890//891 885//892 +f 858//888 864//887 885//892 +f 858//888 885//892 859//893 +f 838//671 858//888 859//893 +f 838//671 859//893 833//665 +f 915//889 918//784 919//894 +f 914//890 915//889 919//894 +f 914//890 919//894 912//895 +f 890//891 914//890 912//895 +f 890//891 912//895 886//896 +f 885//892 890//891 886//896 +f 885//892 886//896 860//897 +f 859//893 885//892 860//897 +f 859//893 860//897 832//898 +f 833//665 859//893 832//898 +f 833//665 832//898 805//659 +f 919//894 918//784 916//899 +f 912//895 919//894 916//899 +f 912//895 916//899 891//900 +f 886//896 912//895 891//900 +f 886//896 891//900 865//901 +f 860//897 886//896 865//901 +f 860//897 865//901 839//902 +f 832//898 860//897 839//902 +f 832//898 839//902 812//903 +f 805//659 832//898 812//903 +f 805//659 812//903 785//653 +f 916//899 918//784 917//783 +f 891//900 916//899 917//783 +f 891//900 917//783 892//786 +f 865//901 891//900 892//786 +f 865//901 892//786 866//788 +f 839//902 865//901 866//788 +f 839//902 866//788 840//790 +f 812//903 839//902 840//790 +f 812//903 840//790 813//792 +f 785//653 812//903 813//792 +f 785//653 813//792 786//652 +f 404//412 1267//904 1268//905 +f 384//906 373//907 372//480 +f 346//908 345//501 352//494 +f 435//909 436//426 419//419 +f 331//910 327//350 335//508 +f 462//439 453//433 1265//911 +f 920//912 921//913 922//914 +f 920//912 922//914 923//915 +f 923//915 922//914 927//916 +f 923//915 927//916 933//917 +f 933//917 927//916 940//918 +f 933//917 940//918 949//919 +f 949//919 940//918 959//920 +f 949//919 959//920 971//921 +f 971//921 959//920 984//922 +f 971//921 984//922 999//923 +f 999//923 984//922 1011//924 +f 999//923 1011//924 1027//925 +f 1027//925 1011//924 1042//926 +f 1027//925 1042//926 1059//927 +f 1059//927 1042//926 1077//928 +f 1059//927 1077//928 1095//929 +f 1095//929 1077//928 1110//930 +f 1095//929 1110//930 1129//931 +f 1129//931 1110//930 1144//932 +f 1129//931 1144//932 1163//933 +f 1163//933 1144//932 1179//934 +f 1163//933 1179//934 1196//935 +f 1196//935 1179//934 1210//936 +f 1196//935 1210//936 1220//937 +f 1220//937 1210//936 1212//938 +f 1220//937 1212//938 1201//939 +f 1201//939 1212//938 1181//940 +f 1201//939 1181//940 1169//941 +f 1169//941 1181//940 1147//942 +f 1169//941 1147//942 1135//943 +f 1135//943 1147//942 1113//944 +f 1135//943 1113//944 1102//945 +f 1102//945 1113//944 1081//946 +f 1102//945 1081//946 1065//947 +f 1065//947 1081//946 1046//948 +f 1065//947 1046//948 1032//949 +f 1032//949 1046//948 1016//950 +f 1032//949 1016//950 1003//951 +f 1003//951 1016//950 988//952 +f 1003//951 988//952 974//953 +f 974//953 988//952 962//954 +f 974//953 962//954 951//955 +f 951//955 962//954 942//956 +f 951//955 942//956 934//957 +f 934//957 942//956 928//958 +f 934//957 928//958 924//959 +f 924//959 928//958 921//913 +f 921//913 920//912 924//959 +f 926//960 920//912 923//915 +f 926//960 923//915 932//961 +f 938//962 926//960 932//961 +f 938//962 932//961 947//963 +f 956//964 938//962 947//963 +f 956//964 947//963 968//965 +f 980//966 956//964 968//965 +f 980//966 968//965 995//967 +f 1006//968 980//966 995//967 +f 1006//968 995//967 1022//969 +f 1036//970 1006//968 1022//969 +f 1036//970 1022//969 1053//971 +f 932//961 923//915 933//917 +f 932//961 933//917 948//972 +f 947//963 932//961 948//972 +f 947//963 948//972 969//973 +f 968//965 947//963 969//973 +f 968//965 969//973 996//974 +f 995//967 968//965 996//974 +f 995//967 996//974 1023//975 +f 1022//969 995//967 1023//975 +f 1022//969 1023//975 1054//976 +f 1053//971 1022//969 1054//976 +f 1053//971 1054//976 1089//977 +f 948//972 933//917 949//919 +f 948//972 949//919 970//978 +f 969//973 948//972 970//978 +f 969//973 970//978 997//979 +f 996//974 969//973 997//979 +f 996//974 997//979 1024//980 +f 1023//975 996//974 1024//980 +f 1023//975 1024//980 1055//981 +f 1054//976 1023//975 1055//981 +f 1054//976 1055//981 1090//982 +f 1089//977 1054//976 1090//982 +f 1089//977 1090//982 1109//983 +f 970//978 949//919 971//921 +f 970//978 971//921 998//984 +f 997//979 970//978 998//984 +f 997//979 998//984 1025//985 +f 1024//980 997//979 1025//985 +f 1024//980 1025//985 1056//986 +f 1055//981 1024//980 1056//986 +f 1055//981 1056//986 1091//987 +f 1090//982 1055//981 1091//987 +f 1090//982 1091//987 1124//988 +f 1109//983 1090//982 1124//988 +f 1109//983 1124//988 1122//989 +f 998//984 971//921 999//923 +f 998//984 999//923 1026//990 +f 1025//985 998//984 1026//990 +f 1025//985 1026//990 1057//991 +f 1056//986 1025//985 1057//991 +f 1056//986 1057//991 1092//992 +f 1091//987 1056//986 1092//992 +f 1091//987 1092//992 1125//993 +f 1124//988 1091//987 1125//993 +f 1124//988 1125//993 1156//994 +f 1122//989 1124//988 1156//994 +f 1122//989 1156//994 1142//995 +f 1026//990 999//923 1027//925 +f 1026//990 1027//925 1058//996 +f 1057//991 1026//990 1058//996 +f 1057//991 1058//996 1093//997 +f 1092//992 1057//991 1093//997 +f 1092//992 1093//997 1126//998 +f 1125//993 1092//992 1126//998 +f 1125//993 1126//998 1159//999 +f 1156//994 1125//993 1159//999 +f 1156//994 1159//999 1176//1000 +f 1142//995 1156//994 1176//1000 +f 1142//995 1176//1000 1157//1001 +f 1058//996 1027//925 1059//927 +f 1058//996 1059//927 1094//1002 +f 1093//997 1058//996 1094//1002 +f 1093//997 1094//1002 1127//1003 +f 1126//998 1093//997 1127//1003 +f 1126//998 1127//1003 1160//1004 +f 1159//999 1126//998 1160//1004 +f 1159//999 1160//1004 1192//1005 +f 1176//1000 1159//999 1192//1005 +f 1176//1000 1192//1005 1189//1006 +f 1157//1001 1176//1000 1189//1006 +f 1157//1001 1189//1006 1178//1007 +f 1094//1002 1059//927 1095//929 +f 1094//1002 1095//929 1128//1008 +f 1127//1003 1094//1002 1128//1008 +f 1127//1003 1128//1008 1161//1009 +f 1160//1004 1127//1003 1161//1009 +f 1160//1004 1161//1009 1193//1010 +f 1192//1005 1160//1004 1193//1010 +f 1192//1005 1193//1010 1215//1011 +f 1189//1006 1192//1005 1215//1011 +f 1189//1006 1215//1011 1207//1012 +f 1178//1007 1189//1006 1207//1012 +f 1178//1007 1207//1012 1191//1013 +f 1128//1008 1095//929 1129//931 +f 1128//1008 1129//931 1162//1014 +f 1161//1009 1128//1008 1162//1014 +f 1161//1009 1162//1014 1194//1015 +f 1193//1010 1161//1009 1194//1015 +f 1193//1010 1194//1015 1217//1016 +f 1215//1011 1193//1010 1217//1016 +f 1215//1011 1217//1016 1227//1017 +f 1207//1012 1215//1011 1227//1017 +f 1207//1012 1227//1017 1216//1018 +f 1191//1013 1207//1012 1216//1018 +f 1191//1013 1216//1018 1209//1019 +f 1162//1014 1129//931 1163//933 +f 1162//1014 1163//933 1195//1020 +f 1194//1015 1162//1014 1195//1020 +f 1194//1015 1195//1020 1218//1021 +f 1217//1016 1194//1015 1218//1021 +f 1217//1016 1218//1021 1230//1022 +f 1227//1017 1217//1016 1230//1022 +f 1227//1017 1230//1022 1229//1023 +f 1216//1018 1227//1017 1229//1023 +f 1216//1018 1229//1023 1225//1024 +f 1209//1019 1216//1018 1225//1024 +f 1209//1019 1225//1024 1203//1025 +f 1195//1020 1163//933 1196//935 +f 1195//1020 1196//935 1219//1026 +f 1218//1021 1195//1020 1219//1026 +f 1218//1021 1219//1026 1231//1027 +f 1230//1022 1218//1021 1231//1027 +f 1230//1022 1231//1027 1232//1028 +f 1229//1023 1230//1022 1232//1028 +f 1229//1023 1232//1028 1228//1029 +f 1225//1024 1229//1023 1228//1029 +f 1225//1024 1228//1029 1214//1030 +f 1203//1025 1225//1024 1214//1030 +f 1203//1025 1214//1030 1184//1031 +f 1219//1026 1196//935 1220//937 +f 1219//1026 1220//937 1224//1032 +f 1231//1027 1219//1026 1224//1032 +f 1231//1027 1224//1032 1223//1033 +f 1232//1028 1231//1027 1223//1033 +f 1232//1028 1223//1033 1222//1034 +f 1228//1029 1232//1028 1222//1034 +f 1228//1029 1222//1034 1221//1035 +f 1214//1030 1228//1029 1221//1035 +f 1214//1030 1221//1035 1204//1036 +f 1184//1031 1214//1030 1204//1036 +f 1184//1031 1204//1036 1171//1037 +f 1224//1032 1220//937 1201//939 +f 1224//1032 1201//939 1200//1038 +f 1223//1033 1224//1032 1200//1038 +f 1223//1033 1200//1038 1199//1039 +f 1222//1034 1223//1033 1199//1039 +f 1222//1034 1199//1039 1198//1040 +f 1221//1035 1222//1034 1198//1040 +f 1221//1035 1198//1040 1197//1041 +f 1204//1036 1221//1035 1197//1041 +f 1204//1036 1197//1041 1185//1042 +f 1171//1037 1204//1036 1185//1042 +f 1171//1037 1185//1042 1151//1043 +f 1200//1038 1201//939 1169//941 +f 1200//1038 1169//941 1168//1044 +f 1199//1039 1200//1038 1168//1044 +f 1199//1039 1168//1044 1167//1045 +f 1198//1040 1199//1039 1167//1045 +f 1198//1040 1167//1045 1166//1046 +f 1197//1041 1198//1040 1166//1046 +f 1197//1041 1166//1046 1165//1047 +f 1185//1042 1197//1041 1165//1047 +f 1185//1042 1165//1047 1164//1048 +f 1151//1043 1185//1042 1164//1048 +f 1151//1043 1164//1048 1137//1049 +f 1168//1044 1169//941 1135//943 +f 1168//1044 1135//943 1134//1050 +f 1167//1045 1168//1044 1134//1050 +f 1167//1045 1134//1050 1133//1051 +f 1166//1046 1167//1045 1133//1051 +f 1166//1046 1133//1051 1132//1052 +f 1165//1047 1166//1046 1132//1052 +f 1165//1047 1132//1052 1131//1053 +f 1164//1048 1165//1047 1131//1053 +f 1164//1048 1131//1053 1130//1054 +f 1137//1049 1164//1048 1130//1054 +f 1137//1049 1130//1054 1117//1055 +f 1134//1050 1135//943 1102//945 +f 1134//1050 1102//945 1101//1056 +f 1133//1051 1134//1050 1101//1056 +f 1133//1051 1101//1056 1100//1057 +f 1132//1052 1133//1051 1100//1057 +f 1132//1052 1100//1057 1099//1058 +f 1131//1053 1132//1052 1099//1058 +f 1131//1053 1099//1058 1098//1059 +f 1130//1054 1131//1053 1098//1059 +f 1130//1054 1098//1059 1097//1060 +f 1117//1055 1130//1054 1097//1060 +f 1117//1055 1097//1060 1096//1061 +f 1101//1056 1102//945 1065//947 +f 1101//1056 1065//947 1064//1062 +f 1100//1057 1101//1056 1064//1062 +f 1100//1057 1064//1062 1063//1063 +f 1099//1058 1100//1057 1063//1063 +f 1099//1058 1063//1063 1062//1064 +f 1098//1059 1099//1058 1062//1064 +f 1098//1059 1062//1064 1061//1065 +f 1097//1060 1098//1059 1061//1065 +f 1097//1060 1061//1065 1060//1066 +f 1096//1061 1097//1060 1060//1066 +f 1096//1061 1060//1066 1066//1067 +f 1064//1062 1065//947 1032//949 +f 1064//1062 1032//949 1031//1068 +f 1063//1063 1064//1062 1031//1068 +f 1063//1063 1031//1068 1030//1069 +f 1062//1064 1063//1063 1030//1069 +f 1062//1064 1030//1069 1029//1070 +f 1061//1065 1062//1064 1029//1070 +f 1061//1065 1029//1070 1028//1071 +f 1060//1066 1061//1065 1028//1071 +f 1060//1066 1028//1071 1033//1072 +f 1066//1067 1060//1066 1033//1072 +f 1066//1067 1033//1072 1050//1073 +f 1031//1068 1032//949 1003//951 +f 1031//1068 1003//951 1002//1074 +f 1030//1069 1031//1068 1002//1074 +f 1030//1069 1002//1074 1001//1075 +f 1029//1070 1030//1069 1001//1075 +f 1029//1070 1001//1075 1000//1076 +f 1028//1071 1029//1070 1000//1076 +f 1028//1071 1000//1076 1004//1077 +f 1033//1072 1028//1071 1004//1077 +f 1033//1072 1004//1077 1021//1078 +f 1050//1073 1033//1072 1021//1078 +f 1050//1073 1021//1078 1041//1079 +f 1002//1074 1003//951 974//953 +f 1002//1074 974//953 973//1080 +f 1001//1075 1002//1074 973//1080 +f 1001//1075 973//1080 972//1081 +f 1000//1076 1001//1075 972//1081 +f 1000//1076 972//1081 975//1082 +f 1004//1077 1000//1076 975//1082 +f 1004//1077 975//1082 992//1083 +f 1021//1078 1004//1077 992//1083 +f 1021//1078 992//1083 1010//1084 +f 1041//1079 1021//1078 1010//1084 +f 1041//1079 1010//1084 1040//1085 +f 973//1080 974//953 951//955 +f 973//1080 951//955 950//1086 +f 972//1081 973//1080 950//1086 +f 972//1081 950//1086 952//1087 +f 975//1082 972//1081 952//1087 +f 975//1082 952//1087 965//1088 +f 992//1083 975//1082 965//1088 +f 992//1083 965//1088 983//1089 +f 1010//1084 992//1083 983//1089 +f 1010//1084 983//1089 1009//1090 +f 1040//1085 1010//1084 1009//1090 +f 1040//1085 1009//1090 1039//1091 +f 950//1086 951//955 934//957 +f 950//1086 934//957 935//1092 +f 952//1087 950//1086 935//1092 +f 952//1087 935//1092 944//1093 +f 965//1088 952//1087 944//1093 +f 965//1088 944//1093 958//1094 +f 983//1089 965//1088 958//1094 +f 983//1089 958//1094 982//1095 +f 1009//1090 983//1089 982//1095 +f 1009//1090 982//1095 1008//1096 +f 1039//1091 1009//1090 1008//1096 +f 1039//1091 1008//1096 1038//1097 +f 935//1092 934//957 924//959 +f 935//1092 924//959 929//1098 +f 944//1093 935//1092 929//1098 +f 944//1093 929//1098 939//1099 +f 958//1094 944//1093 939//1099 +f 958//1094 939//1099 957//1100 +f 982//1095 958//1094 957//1100 +f 982//1095 957//1100 981//1101 +f 1008//1096 982//1095 981//1101 +f 1008//1096 981//1101 1007//1102 +f 1038//1097 1008//1096 1007//1102 +f 1038//1097 1007//1102 1037//1103 +f 924//959 920//912 929//1098 +f 929//1098 920//912 926//960 +f 939//1099 929//1098 926//960 +f 939//1099 926//960 938//962 +f 957//1100 939//1099 938//962 +f 957//1100 938//962 956//964 +f 981//1101 957//1100 956//964 +f 981//1101 956//964 980//966 +f 1007//1102 981//1101 980//966 +f 1007//1102 980//966 1006//968 +f 1037//1103 1007//1102 1006//968 +f 1037//1103 1006//968 1036//970 +f 993//1104 1005//1105 976//1106 +f 966//1107 993//1104 976//1106 +f 966//1107 976//1106 953//1108 +f 945//1109 966//1107 953//1108 +f 945//1109 953//1108 936//1110 +f 930//1111 945//1109 936//1110 +f 930//1111 936//1110 925//1112 +f 921//913 930//1111 925//1112 +f 921//913 925//1112 922//914 +f 976//1106 1005//1105 977//1113 +f 953//1108 976//1106 977//1113 +f 953//1108 977//1113 954//1114 +f 936//1110 953//1108 954//1114 +f 936//1110 954//1114 937//1115 +f 925//1112 936//1110 937//1115 +f 925//1112 937//1115 931//1116 +f 922//914 925//1112 931//1116 +f 922//914 931//1116 927//916 +f 977//1113 1005//1105 978//1117 +f 954//1114 977//1113 978//1117 +f 954//1114 978//1117 955//1118 +f 937//1115 954//1114 955//1118 +f 937//1115 955//1118 946//1119 +f 931//1116 937//1115 946//1119 +f 931//1116 946//1119 941//1120 +f 927//916 931//1116 941//1120 +f 927//916 941//1120 940//918 +f 978//1117 1005//1105 979//1121 +f 955//1118 978//1117 979//1121 +f 955//1118 979//1121 967//1122 +f 946//1119 955//1118 967//1122 +f 946//1119 967//1122 961//1123 +f 941//1120 946//1119 961//1123 +f 941//1120 961//1123 960//1124 +f 940//918 941//1120 960//1124 +f 940//918 960//1124 959//920 +f 979//1121 1005//1105 994//1125 +f 967//1122 979//1121 994//1125 +f 967//1122 994//1125 987//1126 +f 961//1123 967//1122 987//1126 +f 961//1123 987//1126 986//1127 +f 960//1124 961//1123 986//1127 +f 960//1124 986//1127 985//1128 +f 959//920 960//1124 985//1128 +f 959//920 985//1128 984//922 +f 994//1125 1005//1105 1015//1129 +f 987//1126 994//1125 1015//1129 +f 987//1126 1015//1129 1014//1130 +f 986//1127 987//1126 1014//1130 +f 986//1127 1014//1130 1013//1131 +f 985//1128 986//1127 1013//1131 +f 985//1128 1013//1131 1012//1132 +f 984//922 985//1128 1012//1132 +f 984//922 1012//1132 1011//924 +f 1015//1129 1005//1105 1035//1133 +f 1014//1130 1015//1129 1035//1133 +f 1014//1130 1035//1133 1045//1134 +f 1013//1131 1014//1130 1045//1134 +f 1013//1131 1045//1134 1044//1135 +f 1012//1132 1013//1131 1044//1135 +f 1012//1132 1044//1135 1043//1136 +f 1011//924 1012//1132 1043//1136 +f 1011//924 1043//1136 1042//926 +f 1035//1133 1005//1105 1052//1137 +f 1045//1134 1035//1133 1052//1137 +f 1045//1134 1052//1137 1080//1138 +f 1044//1135 1045//1134 1080//1138 +f 1044//1135 1080//1138 1079//1139 +f 1043//1136 1044//1135 1079//1139 +f 1043//1136 1079//1139 1078//1140 +f 1042//926 1043//1136 1078//1140 +f 1042//926 1078//1140 1077//928 +f 1052//1137 1005//1105 1068//1141 +f 1080//1138 1052//1137 1068//1141 +f 1080//1138 1068//1141 1106//1142 +f 1079//1139 1080//1138 1106//1142 +f 1079//1139 1106//1142 1112//1143 +f 1078//1140 1079//1139 1112//1143 +f 1078//1140 1112//1143 1111//1144 +f 1077//928 1078//1140 1111//1144 +f 1077//928 1111//1144 1110//930 +f 1068//1141 1005//1105 1087//1145 +f 1106//1142 1068//1141 1087//1145 +f 1106//1142 1087//1145 1120//1146 +f 1112//1143 1106//1142 1120//1146 +f 1112//1143 1120//1146 1146//1147 +f 1111//1144 1112//1143 1146//1147 +f 1111//1144 1146//1147 1145//1148 +f 1110//930 1111//1144 1145//1148 +f 1110//930 1145//1148 1144//932 +f 1087//1145 1005//1105 1107//1149 +f 1120//1146 1087//1145 1107//1149 +f 1120//1146 1107//1149 1140//1150 +f 1146//1147 1120//1146 1140//1150 +f 1146//1147 1140//1150 1174//1151 +f 1145//1148 1146//1147 1174//1151 +f 1145//1148 1174//1151 1180//1152 +f 1144//932 1145//1148 1180//1152 +f 1144//932 1180//1152 1179//934 +f 1107//1149 1005//1105 1121//1153 +f 1140//1150 1107//1149 1121//1153 +f 1140//1150 1121//1153 1154//1154 +f 1174//1151 1140//1150 1154//1154 +f 1174//1151 1154//1154 1188//1155 +f 1180//1152 1174//1151 1188//1155 +f 1180//1152 1188//1155 1211//1156 +f 1179//934 1180//1152 1211//1156 +f 1179//934 1211//1156 1210//936 +f 1121//1153 1005//1105 1141//1157 +f 1154//1154 1121//1153 1141//1157 +f 1154//1154 1141//1157 1175//1158 +f 1188//1155 1154//1154 1175//1158 +f 1188//1155 1175//1158 1206//1159 +f 1211//1156 1188//1155 1206//1159 +f 1211//1156 1206//1159 1226//1160 +f 1210//936 1211//1156 1226//1160 +f 1210//936 1226//1160 1212//938 +f 1141//1157 1005//1105 1155//1161 +f 1175//1158 1141//1157 1155//1161 +f 1175//1158 1155//1161 1187//1162 +f 1206//1159 1175//1158 1187//1162 +f 1206//1159 1187//1162 1205//1163 +f 1226//1160 1206//1159 1205//1163 +f 1226//1160 1205//1163 1213//1164 +f 1212//938 1226//1160 1213//1164 +f 1212//938 1213//1164 1181//940 +f 1155//1161 1005//1105 1153//1165 +f 1187//1162 1155//1161 1153//1165 +f 1187//1162 1153//1165 1173//1166 +f 1205//1163 1187//1162 1173//1166 +f 1205//1163 1173//1166 1186//1167 +f 1213//1164 1205//1163 1186//1167 +f 1213//1164 1186//1167 1182//1168 +f 1181//940 1213//1164 1182//1168 +f 1181//940 1182//1168 1147//942 +f 1153//1165 1005//1105 1139//1169 +f 1173//1166 1153//1165 1139//1169 +f 1173//1166 1139//1169 1152//1170 +f 1186//1167 1173//1166 1152//1170 +f 1186//1167 1152//1170 1172//1171 +f 1182//1168 1186//1167 1172//1171 +f 1182//1168 1172//1171 1148//1172 +f 1147//942 1182//1168 1148//1172 +f 1147//942 1148//1172 1113//944 +f 1139//1169 1005//1105 1119//1173 +f 1152//1170 1139//1169 1119//1173 +f 1152//1170 1119//1173 1138//1174 +f 1172//1171 1152//1170 1138//1174 +f 1172//1171 1138//1174 1149//1175 +f 1148//1172 1172//1171 1149//1175 +f 1148//1172 1149//1175 1114//1176 +f 1113//944 1148//1172 1114//1176 +f 1113//944 1114//1176 1081//946 +f 1119//1173 1005//1105 1105//1177 +f 1138//1174 1119//1173 1105//1177 +f 1138//1174 1105//1177 1118//1178 +f 1149//1175 1138//1174 1118//1178 +f 1149//1175 1118//1178 1115//1179 +f 1114//1176 1149//1175 1115//1179 +f 1114//1176 1115//1179 1082//1180 +f 1081//946 1114//1176 1082//1180 +f 1081//946 1082//1180 1046//948 +f 1105//1177 1005//1105 1086//1181 +f 1118//1178 1105//1177 1086//1181 +f 1118//1178 1086//1181 1104//1182 +f 1115//1179 1118//1178 1104//1182 +f 1115//1179 1104//1182 1083//1183 +f 1082//1180 1115//1179 1083//1183 +f 1082//1180 1083//1183 1047//1184 +f 1046//948 1082//1180 1047//1184 +f 1046//948 1047//1184 1016//950 +f 1086//1181 1005//1105 1067//1185 +f 1104//1182 1086//1181 1067//1185 +f 1104//1182 1067//1185 1084//1186 +f 1083//1183 1104//1182 1084//1186 +f 1083//1183 1084//1186 1048//1187 +f 1047//1184 1083//1183 1048//1187 +f 1047//1184 1048//1187 1017//1188 +f 1016//950 1047//1184 1017//1188 +f 1016//950 1017//1188 988//952 +f 1067//1185 1005//1105 1051//1189 +f 1084//1186 1067//1185 1051//1189 +f 1084//1186 1051//1189 1049//1190 +f 1048//1187 1084//1186 1049//1190 +f 1048//1187 1049//1190 1018//1191 +f 1017//1188 1048//1187 1018//1191 +f 1017//1188 1018//1191 989//1192 +f 988//952 1017//1188 989//1192 +f 988//952 989//1192 962//954 +f 1051//1189 1005//1105 1034//1193 +f 1049//1190 1051//1189 1034//1193 +f 1049//1190 1034//1193 1019//1194 +f 1018//1191 1049//1190 1019//1194 +f 1018//1191 1019//1194 990//1195 +f 989//1192 1018//1191 990//1195 +f 989//1192 990//1195 963//1196 +f 962//954 989//1192 963//1196 +f 962//954 963//1196 942//956 +f 1034//1193 1005//1105 1020//1197 +f 1019//1194 1034//1193 1020//1197 +f 1019//1194 1020//1197 991//1198 +f 990//1195 1019//1194 991//1198 +f 990//1195 991//1198 964//1199 +f 963//1196 990//1195 964//1199 +f 963//1196 964//1199 943//1200 +f 942//956 963//1196 943//1200 +f 942//956 943//1200 928//958 +f 1020//1197 1005//1105 993//1104 +f 991//1198 1020//1197 993//1104 +f 991//1198 993//1104 966//1107 +f 964//1199 991//1198 966//1107 +f 964//1199 966//1107 945//1109 +f 943//1200 964//1199 945//1109 +f 943//1200 945//1109 930//1111 +f 928//958 943//1200 930//1111 +f 928//958 930//1111 921//913 +f 1151//1043 1137//1049 1150//1201 +f 1142//995 1143//1202 1122//989 +f 1053//971 1089//977 1069//1203 +f 1122//989 1123//1204 1109//983 +f 1096//1061 1103//1205 1117//1055 +f 1171//1037 1170//1206 1184//1031 +f 1191//1013 1209//1019 1190//1207 +f 1036//970 1053//971 1070//1208 +f 1036//970 1070//1208 1037//1103 +f 1203//1025 1202//1209 1209//1019 +f 1066//1067 1085//1210 1096//1061 +f 1050//1073 1076//1211 1066//1067 +f 1184//1031 1183//1212 1203//1025 +f 1041//1079 1040//1085 1075//1213 +f 1171//1037 1151//1043 1170//1206 +f 1157//1001 1158//1214 1142//995 +f 1137//1049 1117//1055 1136//1215 +f 1038//1097 1072//1216 1039//1091 +f 1178//1007 1191//1013 1177//1217 +f 1089//977 1109//983 1088//1218 +f 1037//1103 1071//1219 1038//1097 +f 1050//1073 1041//1079 1076//1211 +f 1157//1001 1178//1007 1158//1214 +f 1040//1085 1039//1091 1074//1220 +f 1170//1206 1150//1201 452//1221 +f 1264//1222 1071//1219 1263//1223 +f 1261//1224 1262//1225 1076//1211 +f 1085//1210 1076//1211 1262//1225 +f 1190//1207 1208//1226 405//1227 +f 509//176 526//519 1260//1228 +f 1260//1228 526//519 556//523 +f 167//201 556//523 595//202 +f 595//202 621//526 1255//200 +f 172//192 163//182 1254//199 +f 8//49 18//42 3//1229 +f 3//1229 18//42 1288//1230 +f 15//75 7//66 1240//82 +f 1250//50 8//49 3//1229 +f 1//32 1283//40 566//33 +f 593//3 566//33 9//41 +f 19//1231 20//34 33//25 +f 1243//2 636//89 593//3 +f 64//18 40//6 36//17 +f 1244//24 64//18 36//17 +f 641//579 614//582 1237//1232 +f 1250//50 1239//1233 4//48 +f 7//66 4//48 1239//1233 +f 5//74 14//73 11//81 +f 1240//82 7//66 1239//1233 +f 1//32 553//31 565//56 +f 593//3 9//41 1289//83 +f 18//42 20//34 1288//1230 +f 40//6 27//5 1252//16 +f 1249//58 6//65 565//56 +f 14//73 15//75 11//81 +f 592//57 1234//130 1233//58 +f 1237//1232 614//582 588//586 +f 1237//1232 588//586 605//592 +f 539//175 159//177 1259//1234 +f 164//257 1257//1235 168//251 +f 509//176 1256//1236 159//177 +f 1258//250 585//249 1259//1234 +f 169//1237 164//257 174//242 +f 191//236 208//230 185//1238 +f 1290//1239 207//229 640//777 +f 621//526 1292//1240 1255//200 +f 163//182 160//178 157//180 +f 1284//1241 1292//1240 648//227 +f 1252//16 27//5 12//95 +f 119//124 116//129 104//161 +f 116//129 88//135 1242//136 +f 87//159 666//713 715//160 +f 87//159 1241//1242 666//713 +f 1253//1243 47//150 631//152 +f 631//152 666//713 1253//1243 +f 86//142 74//144 60//143 +f 640//777 1291//1244 1290//1239 +f 1291//1244 640//777 613//248 +f 208//230 219//220 200//1245 +f 665//778 640//777 207//229 +f 1285//226 200//1245 219//220 +f 648//227 207//229 1284//1241 +f 691//228 665//778 207//229 +f 605//592 1236//1246 1245//1246 +f 1235//151 605//592 631//152 +f 1248//145 48//153 37//167 +f 667//708 1251//1247 1247//158 +f 605//592 1235//151 1236//1246 +f 641//579 1238//1248 1246//1249 +f 641//579 1237//1232 1238//1248 +f 404//412 391//405 1267//904 +f 1265//911 453//433 436//426 +f 328//351 327//350 331//910 +f 443//445 462//439 469//1250 +f 342//370 1275//1251 344//1252 +f 342//370 334//363 1275//1251 +f 372//480 385//473 384//906 +f 351//377 1271//1253 361//384 +f 351//377 350//1254 1271//1253 +f 337//1255 335//508 345//501 +f 384//906 385//473 396//466 +f 361//384 368//1256 369//391 +f 361//384 1271//1253 368//1256 +f 352//494 1276//1257 346//908 +f 397//1258 396//466 411//459 +f 342//370 350//1254 351//377 +f 342//370 344//1252 350//1254 +f 380//398 369//391 368//1256 +f 334//363 328//351 332//1259 +f 404//412 418//1260 419//419 +f 404//412 1268//905 418//1260 +f 426//452 1286//1261 1282//1262 +f 1282//1262 411//459 426//452 +f 352//494 362//487 1277//1263 +f 1277//1263 1276//1257 352//494 +f 391//405 380//398 381//1264 +f 426//452 443//445 444//1265 +f 444//1265 1286//1261 426//452 +f 362//487 372//480 373//907 +f 373//907 1277//1263 362//487 +f 1202//1209 1183//1212 1270//1266 +f 1116//1267 428//1268 1136//1215 +f 428//1268 1287//1269 1136//1215 +f 1073//1270 353//1271 1074//1220 +f 353//1271 363//1272 1074//1220 +f 353//1271 1073//1270 1279//1273 +f 1070//1208 1069//1203 1263//1223 +f 1274//1274 1069//1203 1088//1218 +f 1177//1217 1273//1275 1272//1276 +f 1272//1276 1158//1214 1177//1217 +f 428//1268 1116//1267 427//1277 +f 1088//1218 1108//1278 343//1279 +f 1103//1205 1085//1210 1278//1280 +f 1108//1278 1123//1204 1280//1281 +f 1123//1204 1281//1282 1280//1281 +f 1143//1202 1158//1214 360//1283 +f 1158//1214 1272//1276 360//1283 +f 1075//1213 1261//1224 1076//1211 +f 1085//1210 1262//1225 1278//1280 +f 1123//1204 1143//1202 1281//1282 +f 1143//1202 360//1283 1281//1282 +f 1074//1220 363//1272 1075//1213 +f 363//1272 1261//1224 1075//1213 +f 1270//1266 1183//1212 452//1221 +f 1266//1284 1150//1201 1136//1215 +f 1273//1275 1177//1217 1190//1207 +f 1208//1226 1202//1209 406//1285 +f 1202//1209 1269//1286 406//1285 +f 1072//1216 1071//1219 1264//1222 +f 1241//1242 1253//1243 666//713 +f 71//137 86//142 60//143 +f 88//135 86//142 71//137 +f 1245//1246 1237//1232 605//592 +f 119//124 104//161 90//119 +f 667//708 1246//1249 1251//1247 +f 621//526 648//227 1292//1240 +f 208//230 200//1245 185//1238 +f 174//242 191//236 169//1237 +f 1258//250 1291//1244 613//248 +f 1244//24 19//1231 33//25 +f 1288//1230 20//34 19//1231 +f 199//208 182//198 178//1287 +f 206//1288 218//214 190//1289 +f 1260//1228 556//523 167//201 +f 157//180 1254//199 163//182 +f 178//1287 182//198 1254//199 +f 218//214 206//1288 1285//226 +f 161//258 1257//1235 158//179 +f 324//345 312//274 323//336 +f 303//317 302//323 316//338 +f 305//305 304//311 318//340 +f 304//311 303//317 317//339 +f 322//347 309//281 321//341 +f 320//346 307//293 319//342 +f 301//329 311//335 314//344 +f 302//323 301//329 315//337 +f 311//335 312//274 313//343 +f 319//342 306//299 318//340 +f 321//341 308//287 320//346 +f 323//336 310//275 322//347 +f 418//1260 435//909 419//419 +f 337//1255 331//910 335//508 +f 469//1250 462//439 1265//911 +f 1137//1049 1136//1215 1150//1201 +f 1143//1202 1123//1204 1122//989 +f 1089//977 1088//1218 1069//1203 +f 1123//1204 1108//1278 1109//983 +f 1103//1205 1116//1267 1117//1055 +f 1170//1206 1183//1212 1184//1031 +f 1209//1019 1208//1226 1190//1207 +f 1053//971 1069//1203 1070//1208 +f 1070//1208 1071//1219 1037//1103 +f 1202//1209 1208//1226 1209//1019 +f 1085//1210 1103//1205 1096//1061 +f 1076//1211 1085//1210 1066//1067 +f 1183//1212 1202//1209 1203//1025 +f 1040//1085 1074//1220 1075//1213 +f 1151//1043 1150//1201 1170//1206 +f 1158//1214 1143//1202 1142//995 +f 1117//1055 1116//1267 1136//1215 +f 1072//1216 1073//1270 1039//1091 +f 1191//1013 1190//1207 1177//1217 +f 1109//983 1108//1278 1088//1218 +f 1071//1219 1072//1216 1038//1097 +f 1041//1079 1075//1213 1076//1211 +f 1178//1007 1177//1217 1158//1214 +f 1039//1091 1073//1270 1074//1220 +f 1150//1201 1266//1284 452//1221 +f 1071//1219 1070//1208 1263//1223 +f 1208//1226 406//1285 405//1227 +f 1256//1236 509//176 1260//1228 +f 1257//1235 161//258 168//251 +f 585//249 539//175 1259//1234 +f 715//160 667//708 1247//158 +f 667//708 641//579 1246//1249 +f 435//909 1265//911 436//426 +f 332//1259 328//351 331//910 +f 444//1265 443//445 469//1250 +f 346//908 337//1255 345//501 +f 397//1258 384//906 396//466 +f 1282//1262 397//1258 411//459 +f 381//1264 380//398 368//1256 +f 1275//1251 334//363 332//1259 +f 1267//904 391//405 381//1264 +f 1269//1286 1202//1209 1270//1266 +f 1073//1270 1072//1216 1279//1273 +f 1069//1203 1274//1274 1263//1223 +f 343//1279 1274//1274 1088//1218 +f 1116//1267 1103//1205 427//1277 +f 1108//1278 1280//1281 343//1279 +f 427//1277 1103//1205 1278//1280 +f 1183//1212 1170//1206 452//1221 +f 1287//1269 1266//1284 1136//1215 +f 405//1227 1273//1275 1190//1207 +f 1279//1273 1072//1216 1264//1222 +f 191//236 185//1238 169//1237 +f 190//1289 199//208 178//1287 +f 218//214 199//208 190//1289 \ No newline at end of file diff --git a/base/src/main.cpp b/base/src/main.cpp index 9a0f6a0..7733fa2 100644 --- a/base/src/main.cpp +++ b/base/src/main.cpp @@ -25,6 +25,13 @@ const float PI = 3.14159f; int width, height; +//bloom related values +int blurAmount = 20; +glm::vec2 texelSize; +float blurScale = 5.0; +float blurStrength = 1.0; + + device_mesh_t uploadMesh(const mesh_t & mesh) { device_mesh_t out; //Allocate vertex array @@ -80,6 +87,7 @@ device_mesh_t uploadMesh(const mesh_t & mesh) { out.texname = mesh.texname; out.color = mesh.color; + out.isBloom = mesh.isBloom; return out; } @@ -162,6 +170,7 @@ void initMesh() { shape.material.diffuse[1], shape.material.diffuse[2]); mesh.texname = shape.material.diffuse_texname; + mesh.isBloom = shape.material.shininess; // added for glow draw_meshes.push_back(uploadMesh(mesh)); f=f+process; } @@ -212,12 +221,15 @@ GLuint normalTexture = 0; GLuint positionTexture = 0; GLuint colorTexture = 0; GLuint postTexture = 0; +// +GLuint bloomTexture = 0; GLuint FBO[2] = {0, 0}; GLuint pass_prog; GLuint point_prog; GLuint ambient_prog; +GLuint bloom_prog; GLuint diagnostic_prog; GLuint post_prog; void initShader() { @@ -231,6 +243,7 @@ void initShader() { const char * ambient_frag = "../../../res/shaders/ambient.frag"; const char * point_frag = "../../../res/shaders/point.frag"; const char * post_frag = "../../../res/shaders/post.frag"; + const char * bloom_frag = "../../../res/shaders/bloom.frag"; #else const char * pass_vert = "../res/shaders/pass.vert"; const char * shade_vert = "../res/shaders/shade.vert"; @@ -241,6 +254,7 @@ void initShader() { const char * ambient_frag = "../res/shaders/ambient.frag"; const char * point_frag = "../res/shaders/point.frag"; const char * post_frag = "../res/shaders/post.frag"; + const char * bloom_frag = "../res/shaders/bloom.frag"; #endif Utility::shaders_t shaders = Utility::loadShaders(pass_vert, pass_frag); @@ -251,6 +265,7 @@ void initShader() { glBindAttribLocation(pass_prog, mesh_attributes::TEXCOORD, "Texcoord"); Utility::attachAndLinkProgram(pass_prog,shaders); +/////////////////////////////////////////////////////////////////////////////////////// shaders = Utility::loadShaders(shade_vert, diagnostic_frag); @@ -261,6 +276,8 @@ void initShader() { Utility::attachAndLinkProgram(diagnostic_prog, shaders); +/////////////////////////////////////////////////////////////////////////////////////// + shaders = Utility::loadShaders(shade_vert, ambient_frag); ambient_prog = glCreateProgram(); @@ -269,7 +286,13 @@ void initShader() { glBindAttribLocation(ambient_prog, quad_attributes::TEXCOORD, "Texcoord"); Utility::attachAndLinkProgram(ambient_prog, shaders); - +/////////////////////////////////////////////////////////////////////////////////////// + shaders = Utility::loadShaders(shade_vert,bloom_frag); + bloom_prog = glCreateProgram(); + glBindAttribLocation(bloom_prog, quad_attributes::POSITION, "Position"); + glBindAttribLocation(bloom_prog, quad_attributes::TEXCOORD, "Texcoord"); + Utility::attachAndLinkProgram(bloom_prog, shaders); +//////////////////////////////////////////////////////////////////////////////////////// shaders = Utility::loadShaders(shade_vert, point_frag); point_prog = glCreateProgram(); @@ -279,6 +302,7 @@ void initShader() { Utility::attachAndLinkProgram(point_prog, shaders); +/////////////////////////////////////////////////////////////////////////////////////// shaders = Utility::loadShaders(post_vert, post_frag); post_prog = glCreateProgram(); @@ -295,6 +319,8 @@ void freeFBO() { glDeleteTextures(1,&positionTexture); glDeleteTextures(1,&colorTexture); glDeleteTextures(1,&postTexture); + // + glDeleteTextures(1,&bloomTexture); glDeleteFramebuffers(1,&FBO[0]); glDeleteFramebuffers(1,&FBO[1]); } @@ -360,13 +386,13 @@ void initNoise() { void initFBO(int w, int h) { GLenum FBOstatus; - glActiveTexture(GL_TEXTURE9); + glActiveTexture(GL_TEXTURE10); glGenTextures(1, &depthTexture); glGenTextures(1, &normalTexture); glGenTextures(1, &positionTexture); glGenTextures(1, &colorTexture); - + glGenTextures(1,&bloomTexture); //Set up depth FBO glBindTexture(GL_TEXTURE_2D, depthTexture); @@ -379,6 +405,17 @@ void initFBO(int w, int h) { glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); + // //Set up bloom map FBO + glBindTexture(GL_TEXTURE_2D,bloomTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); + ///////////////////////////////////////////////////////////////////// + //Set up normal FBO glBindTexture(GL_TEXTURE_2D, normalTexture); @@ -410,7 +447,7 @@ void initFBO(int w, int h) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); // creatwwe a framebuffer object glGenFramebuffers(1, &FBO[0]); @@ -421,11 +458,14 @@ void initFBO(int w, int h) { GLint normal_loc = glGetFragDataLocation(pass_prog,"out_Normal"); GLint position_loc = glGetFragDataLocation(pass_prog,"out_Position"); GLint color_loc = glGetFragDataLocation(pass_prog,"out_Color"); - GLenum draws [3]; + // + GLint bloom_loc = glGetFragDataLocation(pass_prog,"out_BloomMap"); + GLenum draws [4]; draws[normal_loc] = GL_COLOR_ATTACHMENT0; draws[position_loc] = GL_COLOR_ATTACHMENT1; draws[color_loc] = GL_COLOR_ATTACHMENT2; - glDrawBuffers(3, draws); + draws[bloom_loc] = GL_COLOR_ATTACHMENT3; + glDrawBuffers(4, draws); // attach the texture to FBO depth attachment point int test = GL_COLOR_ATTACHMENT0; @@ -437,6 +477,8 @@ void initFBO(int w, int h) { glFramebufferTexture(GL_FRAMEBUFFER, draws[position_loc], positionTexture, 0); glBindTexture(GL_TEXTURE_2D, colorTexture); glFramebufferTexture(GL_FRAMEBUFFER, draws[color_loc], colorTexture, 0); + glBindTexture(GL_TEXTURE_2D,bloomTexture); + glFramebufferTexture(GL_FRAMEBUFFER, draws[bloom_loc], bloomTexture, 0); // check FBO status FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -446,7 +488,7 @@ void initFBO(int w, int h) { } //Post Processing buffer! - glActiveTexture(GL_TEXTURE9); + glActiveTexture(GL_TEXTURE10); glGenTextures(1, &postTexture); @@ -459,7 +501,7 @@ void initFBO(int w, int h) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); // creatwwe a framebuffer object glGenFramebuffers(1, &FBO[1]); @@ -591,6 +633,8 @@ void draw_mesh() { for(int i=0; i NEARP) @@ -664,6 +713,7 @@ void draw_light(vec3 pos, float strength, mat4 sc, mat4 vp, float NEARP) { light.w = radius; glUniform4fv(glGetUniformLocation(point_prog, "u_Light"), 1, &(light[0])); glUniform1f(glGetUniformLocation(point_prog, "u_LightIl"), strength); + glUniform3fv(glGetUniformLocation(point_prog,"u_lightColor"),1,&(lightColor[0])); vec4 left = vp * vec4(pos + radius*cam.start_left, 1.0); vec4 up = vp * vec4(pos + radius*cam.up, 1.0); @@ -709,6 +759,9 @@ void updateDisplayText(char * disp) { case(DISPLAY_LIGHTS): sprintf(disp, "Displaying Lights"); break; + case(DISPLAY_BLOOM): + sprintf(disp,"Displaying Bloom"); + break; } } @@ -753,9 +806,12 @@ void display(void) glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_ONE, GL_ONE); + //glBlendFunc(GL_ZERO,GL_ZERO); + //glBlendFunc(GL_SRC_COLOR, GL_DST_COLOR); glClear(GL_COLOR_BUFFER_BIT); - if(display_type == DISPLAY_LIGHTS || display_type == DISPLAY_TOTAL) + if(display_type == DISPLAY_LIGHTS || display_type == DISPLAY_TOTAL || display_type == DISPLAY_BLOOM || display_type == DISPLAY_SIL) { + //std::cout<<"in"< indices; std::string texname; glm::vec3 color; + float isBloom; // 1 means it's glow source, otherwise it is normal material } mesh_t; typedef struct { @@ -48,6 +49,7 @@ typedef struct { unsigned int vbo_texcoords; glm::vec3 color; std::string texname; + float isBloom; } device_mesh_t; typedef struct { @@ -83,7 +85,9 @@ enum Display { DISPLAY_POSITION = 2, DISPLAY_COLOR = 3, DISPLAY_TOTAL = 4, - DISPLAY_LIGHTS = 5 + DISPLAY_LIGHTS = 5, + DISPLAY_BLOOM = 6, + DISPLAY_SIL = 7 }; char* loadFile(char *fname, GLint &fSize); From 30dfb625078127027e4ffde90d87591a5f0630e4 Mon Sep 17 00:00:00 2001 From: YuqinShao Date: Thu, 14 Nov 2013 11:19:15 -0500 Subject: [PATCH 2/7] toon shading works --- base/res/shaders/ambient.frag | 15 +++++------- base/res/shaders/point.frag | 13 ++++++---- base/res/shaders/post.frag | 29 ++++++++++++++++------- screenshots/Bloom.JPG | Bin 0 -> 38468 bytes screenshots/PointLight.JPG | Bin 0 -> 36210 bytes screenshots/ToonShadingWithSilhoutte.JPG | Bin 0 -> 44047 bytes 6 files changed, 34 insertions(+), 23 deletions(-) create mode 100644 screenshots/Bloom.JPG create mode 100644 screenshots/PointLight.JPG create mode 100644 screenshots/ToonShadingWithSilhoutte.JPG diff --git a/base/res/shaders/ambient.frag b/base/res/shaders/ambient.frag index 42571d7..cb74aa7 100644 --- a/base/res/shaders/ambient.frag +++ b/base/res/shaders/ambient.frag @@ -111,15 +111,12 @@ void main() { ambColor = vec4(vec3(0.0), 1.0); } else { float ambient = u_LightIl; - float diffuse = max(0.0, dot(normalize(light),normal)); - ambColor = vec4(color*(strength*diffuse + ambient),1.0);// * texture(u_Bloomtex,fs_Texcoord); - } - /*if(u_DisplayType == DISPLAY_BLOOM) - { - out_Color = ambColor * (1.0 - color4.a); - } - else*/ - out_Color = ambColor; + float diffuse = max(0.0, dot(normalize(light),normal)); + ambColor = vec4(color*(strength*diffuse + ambient),1.0); + } + + out_Color = ambColor; + return; } diff --git a/base/res/shaders/point.frag b/base/res/shaders/point.frag index 50ef0e0..6650e19 100644 --- a/base/res/shaders/point.frag +++ b/base/res/shaders/point.frag @@ -10,7 +10,8 @@ #define DISPLAY_COLOR 3 #define DISPLAY_TOTAL 4 #define DISPLAY_LIGHTS 5 - +#define DISPLAY_BLOOM 6 +#define DISPLAY_SIL 7 ///////////////////////////////////// // Uniforms, Attributes, and Outputs @@ -109,15 +110,16 @@ void main() { //vec3 lightColor = vec3(1.0,0.0,1.0); float Intensity = 2.0; if( u_DisplayType == DISPLAY_LIGHTS ) - { + { //Put some code here to visualize the fragment associated with this point light if(dist <= lightRadius) { vec3 markColor = vec3(1.0,1.0,1.0)*0.4 + color * 0.6; out_Color = vec4(markColor,1.0); } - } - else + + } + else { float diffuse = max(0.0,dot(normalize(lightVector),normal)); float isInradius = step(0.0,lightRadius - length(lightVector)); @@ -125,7 +127,8 @@ void main() { attenuation = attenuation / lightRadius + 1; attenuation = 1.0/(attenuation * attenuation); vec3 diffuseColor = Intensity * color * diffuse * u_lightColor * attenuation * isInradius; - out_Color = vec4(diffuseColor , 1.0); + out_Color = vec4(diffuseColor , 1.0); + } return; } diff --git a/base/res/shaders/post.frag b/base/res/shaders/post.frag index 0c9cfa1..7ecccce 100644 --- a/base/res/shaders/post.frag +++ b/base/res/shaders/post.frag @@ -36,6 +36,9 @@ uniform int u_blurAmount; uniform float u_blurScale; uniform float u_blurStrength; +uniform mat3 u_GX = mat3( -1.0, 0.0, 1.0,-2.0, 0.0, 2.0,-1.0, 0.0, 1.0 ); +uniform mat3 u_GY = mat3( 1.0, 2.0, 1.0,0.0, 0.0, 0.0,-1.0, -2.0, -1.0); + in vec2 fs_Texcoord; out vec4 out_Color; @@ -103,6 +106,10 @@ void main() { float gray = dot(color, vec3(0.2125, 0.7154, 0.0721)); float vin = min(2*distance(vec2(0.5), fs_Texcoord), 1.0); vec4 otherColor = vec4(mix(pow(color,vec3(1.0/1.8)),vec3(gray),vin), 1.0); + if(u_DisplayType == DISPLAY_SIL) + { + otherColor = vec4(color,1.0); + } vec4 glowColor = vec4(0.0); if(u_DisplayType == DISPLAY_BLOOM) { @@ -122,16 +129,20 @@ void main() { } else if(u_DisplayType == DISPLAY_SIL) { - vec3 color1 =vec3(0.0,0.0,0.0); - vec3 eyeVector = vec3(0.0,0.0,5.0) - position; - eyeVector = normalize(eyeVector); - float sil = max(dot(normal,eyeVector), 0.0); - if (sil < 0.1) - out_Color = vec4(color1,1.0); - else - out_Color = otherColor; + // I'm impelmenteng a sebel edge detection method + //reference http://rastergrid.com/blog/2011/01/frei-chen-edge-detector/#more-532 + float sumX = 0.0; float sumY = 0.0; + for(int i = -1; i<= 1; ++i) + { + for(int j = -1; j<=1; ++j) + { + vec3 tmpColor = texture(u_Colortex,fs_Texcoord + vec2(i*u_texelSizeX, j*u_texelSizeY)).rgb; + sumX += length(tmpColor) * u_GX[i+1][j+1]; + sumY += length(tmpColor) * u_GY[i+1][j+1]; + } + } + out_Color = clamp(0.5*sqrt(sumX*sumX + sumY*sumY) + otherColor,0.0,1.0); return; - } out_Color = otherColor; return; diff --git a/screenshots/Bloom.JPG b/screenshots/Bloom.JPG new file mode 100644 index 0000000000000000000000000000000000000000..6a93c3466e1c13f95b9a2108be41b891a7cdac20 GIT binary patch literal 38468 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 literal 0 HcmV?d00001 From d895036d3ad3489e7f56b9e6fd26245619580cf8 Mon Sep 17 00:00:00 2001 From: YuqinShao Date: Thu, 14 Nov 2013 22:32:22 -0500 Subject: [PATCH 3/7] add separable convolution for bloom --- base/PROJ_WIN/P6/P6/P6.vcxproj | 3 + base/PROJ_WIN/P6/P6/P6.vcxproj.filters | 9 + base/res/shaders/bloom.frag | 76 +++++++-- base/res/shaders/bloom.vert | 11 ++ base/res/shaders/horblur.frag | 111 +++++++++++++ base/res/shaders/post.frag | 47 +++--- base/res/shaders/verblur.frag | 86 ++++++++++ base/src/main.cpp | 222 ++++++++++++++++++++----- screenshots/Bloom_separable.JPG | Bin 0 -> 40709 bytes 9 files changed, 485 insertions(+), 80 deletions(-) create mode 100644 base/res/shaders/bloom.vert create mode 100644 base/res/shaders/horblur.frag create mode 100644 base/res/shaders/verblur.frag create mode 100644 screenshots/Bloom_separable.JPG diff --git a/base/PROJ_WIN/P6/P6/P6.vcxproj b/base/PROJ_WIN/P6/P6/P6.vcxproj index f8277cf..3343844 100644 --- a/base/PROJ_WIN/P6/P6/P6.vcxproj +++ b/base/PROJ_WIN/P6/P6/P6.vcxproj @@ -84,14 +84,17 @@ + + + diff --git a/base/PROJ_WIN/P6/P6/P6.vcxproj.filters b/base/PROJ_WIN/P6/P6/P6.vcxproj.filters index 3b584ca..1d49701 100644 --- a/base/PROJ_WIN/P6/P6/P6.vcxproj.filters +++ b/base/PROJ_WIN/P6/P6/P6.vcxproj.filters @@ -70,5 +70,14 @@ Resource Files + + Resource Files + + + Resource Files + + + Resource Files + \ No newline at end of file diff --git a/base/res/shaders/bloom.frag b/base/res/shaders/bloom.frag index 1a9bdbc..2aec4e3 100644 --- a/base/res/shaders/bloom.frag +++ b/base/res/shaders/bloom.frag @@ -11,12 +11,14 @@ #define DISPLAY_TOTAL 4 #define DISPLAY_LIGHTS 5 #define DISPLAY_BLOOM 6 - +#define DISPLAY_SIL 7 ///////////////////////////////////// // Uniforms, Attributes, and Outputs //////////////////////////////////// uniform mat4 u_Persp; +uniform sampler2D u_Bluredtex; +uniform sampler2D u_Blurtex; uniform sampler2D u_Depthtex; uniform sampler2D u_Normaltex; uniform sampler2D u_Positiontex; @@ -33,12 +35,20 @@ uniform int u_DisplayType; uniform int u_ScreenWidth; uniform int u_ScreenHeight; +uniform float u_texelSizeX; +uniform float u_texelSizeY; +uniform int u_blurAmount; +uniform float u_blurScale; +uniform float u_blurStrength; +uniform int u_blurStage;// 0 means horizontal, 1 means vertical + uniform vec4 u_Light; uniform float u_LightIl; in vec2 fs_Texcoord; out vec4 out_Color; +out vec4 out_verBlured; /////////////////////////////////////// @@ -70,7 +80,7 @@ vec3 samplePos(vec2 texcoords) { //Helper function to automicatlly sample and unpack positions vec3 sampleCol(vec2 texcoords) { - return texture(u_Colortex,texcoords).xyz; + return texture(u_Blurtex,texcoords).xyz; } //Get a random normal vector given a screen-space texture coordinate @@ -90,7 +100,7 @@ float getRandomScalar(vec2 texcoords) { texcoords.t*u_ScreenHeight/sz.y)).r; } -float Gaussian1D(float x, float y, float dev) +float Gaussian1D(float x, float dev) { return (1.0/sqrt(2.0*3.14159 * dev)) * exp(-(x*x)/(2.0*dev)); } @@ -104,24 +114,58 @@ float Gaussian2D(float x, float y, float dev) ////////////////////////////////// const float occlusion_strength = 1.5f; void main() { - vec4 color = texture(u_Bloomtex,fs_Texcoord); - vec4 texColor = vec4(0.0); - vec2 texelSize = vec2(1.0/float(u_ScreenWidth),1.0/float(u_ScreenHeight)); - int blurAmount = 10; - float blurScale = 2.0; - float dev = float(blurAmount) / 6.0; - for(int i = -blurAmount/2; i<=blurAmount/2; ++i) + vec3 color = sampleCol(fs_Texcoord); + vec4 otherColor = vec4(color,1.0); + vec4 glowColor = vec4(0.0); + /////////2D ///////////////////////////////////// + /*if(u_DisplayType == DISPLAY_BLOOM) { - for(int j = -blurAmount/2; j<=blurAmount/2; ++j) + + float dev = float(u_blurAmount) * 0.3; + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) { - //if(i <0 || j<0 || i>= u_ScreenWidth || j >= u_ScreenHeight) - //continue; - texColor += texture(u_Bloomtex,fs_Texcoord + vec2(texelSize.x * i * blurScale , texelSize.y * j* blurScale)) - * Gaussian2D(float(i)*0.4,float(j)*0.4,dev); + for(int j = -u_blurAmount/2; j<=u_blurAmount/2; ++j) + { + glowColor += texture(u_Bloomtex,fs_Texcoord + vec2(u_texelSizeX * i * u_blurScale , u_texelSizeY * j* u_blurScale)) + * Gaussian2D(float(i)*u_blurStrength,float(j)*u_blurStrength,dev); + } + } + out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + + return; + }*/ + ////////////////////////separable convolution//////////////////////////////// + if(u_DisplayType == DISPLAY_BLOOM) + { + float dev = float(u_blurAmount) * 0.3; + if(u_blurStage == 0) + { + //horizontal + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) + { + glowColor += texture(u_Bloomtex,fs_Texcoord + vec2(u_texelSizeX * i * u_blurScale , 0)) + * Gaussian1D(float(i)*u_blurStrength,dev); + } + out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + out_bluredTex = glowColor; + return; + } + else if(u_blurStage == 1) + { + //horizontal + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) + { + glowColor += texture(u_Bluredtex,fs_Texcoord + vec2(0, u_texelSizeY * i * u_blurScale)) + * Gaussian1D(float(i)*u_blurStrength,dev); + } + //out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + out_Color = glowColor; + return; } + } - out_Color = texColor; + out_Color = otherColor; return; } diff --git a/base/res/shaders/bloom.vert b/base/res/shaders/bloom.vert new file mode 100644 index 0000000..2a74e46 --- /dev/null +++ b/base/res/shaders/bloom.vert @@ -0,0 +1,11 @@ +#version 330 + +in vec3 Position; +in vec2 Texcoord; + +out vec2 fs_Texcoord; + +void main() { + fs_Texcoord = Texcoord; + gl_Position = vec4(Position,1.0f); +} diff --git a/base/res/shaders/horblur.frag b/base/res/shaders/horblur.frag new file mode 100644 index 0000000..18c1bd6 --- /dev/null +++ b/base/res/shaders/horblur.frag @@ -0,0 +1,111 @@ +#version 330 + +//////////////////////////// +// ENUMERATIONS +//////////////////////////// + +#define DISPLAY_DEPTH 0 +#define DISPLAY_NORMAL 1 +#define DISPLAY_POSITION 2 +#define DISPLAY_COLOR 3 +#define DISPLAY_TOTAL 4 +#define DISPLAY_LIGHTS 5 +#define DISPLAY_BLOOM 6 +#define DISPLAY_SIL 7 +///////////////////////////////////// +// Uniforms, Attributes, and Outputs +//////////////////////////////////// +uniform mat4 u_Persp; + +uniform sampler2D u_Blurtex; +uniform sampler2D u_Bloomtex; + +uniform int u_DisplayType; +uniform float u_texelSizeX; +uniform float u_texelSizeY; +uniform int u_blurAmount; +uniform float u_blurScale; +uniform float u_blurStrength; + +in vec2 fs_Texcoord; + +out vec4 out_Color; +out vec4 out_horBlured; +/////////////////////////////////////// + + + + +uniform float zerothresh = 1.0f; +uniform float falloff = 0.1f; + + +///////////////////////////////////// +// UTILITY FUNCTIONS +///////////////////////////////////// + +//Helper function to automicatlly sample and unpack positions +vec3 sampleCol(vec2 texcoords) { + return texture(u_Blurtex,texcoords).xyz; +} + + +float Gaussian1D(float x, float dev) +{ + return (1.0/sqrt(2.0*3.14159 * dev)) * exp(-(x*x)/(2.0*dev)); +} +float Gaussian2D(float x, float y, float dev) +{ + return ( 1.0 / (2.0*3.14159 * dev * dev)) * exp(-((x*x+y*y)/(2.0*dev*dev))); +} + +/////////////////////////////////// +// MAIN +////////////////////////////////// +const float occlusion_strength = 1.5f; +void main() { + vec3 color = sampleCol(fs_Texcoord); + vec4 otherColor = vec4(color,1.0); + vec4 glowColor = vec4(0.0); + /////////2D ///////////////////////////////////// + /*if(u_DisplayType == DISPLAY_BLOOM) + { + + float dev = float(u_blurAmount) * 0.3; + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) + { + for(int j = -u_blurAmount/2; j<=u_blurAmount/2; ++j) + { + glowColor += texture(u_Bloomtex,fs_Texcoord + vec2(u_texelSizeX * i * u_blurScale , u_texelSizeY * j* u_blurScale)) + * Gaussian2D(float(i)*u_blurStrength,float(j)*u_blurStrength,dev); + + } + } + out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + + return; + }*/ + ////////////////////////separable convolution//////////////////////////////// + if(u_DisplayType == DISPLAY_BLOOM) + { + /*out_Color = otherColor; + out_horBlured = glowColor; + return;*/ + + float dev = float(u_blurAmount) * 0.3; + //horizontal + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) + { + glowColor += texture(u_Bloomtex,fs_Texcoord + vec2(u_texelSizeX * i * u_blurScale , 0)) + * Gaussian1D(float(i)*u_blurStrength,dev); + } + //out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + out_horBlured = glowColor; + out_Color = otherColor; + return; + + } + out_Color = otherColor; + return; +} + diff --git a/base/res/shaders/post.frag b/base/res/shaders/post.frag index 7ecccce..97c46a2 100644 --- a/base/res/shaders/post.frag +++ b/base/res/shaders/post.frag @@ -100,34 +100,10 @@ vec3 sampleNrm(vec2 texcoords) { ////////////////////////////////// const float occlusion_strength = 1.5f; void main() { - vec3 normal = sampleNrm(fs_Texcoord); - vec3 position = samplePos(fs_Texcoord); - vec3 color = sampleCol(fs_Texcoord); - float gray = dot(color, vec3(0.2125, 0.7154, 0.0721)); - float vin = min(2*distance(vec2(0.5), fs_Texcoord), 1.0); - vec4 otherColor = vec4(mix(pow(color,vec3(1.0/1.8)),vec3(gray),vin), 1.0); - if(u_DisplayType == DISPLAY_SIL) - { - otherColor = vec4(color,1.0); - } - vec4 glowColor = vec4(0.0); - if(u_DisplayType == DISPLAY_BLOOM) - { - float dev = float(u_blurAmount) * 0.3; - for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) - { - for(int j = -u_blurAmount/2; j<=u_blurAmount/2; ++j) - { - glowColor += texture(u_Bloomtex,fs_Texcoord + vec2(u_texelSizeX * i * u_blurScale , u_texelSizeY * j* u_blurScale)) - * Gaussian2D(float(i)*u_blurStrength,float(j)*u_blurStrength,dev); - - } - } - out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); - return; - } - else if(u_DisplayType == DISPLAY_SIL) + vec4 otherColor = texture(u_Posttex,fs_Texcoord); + + if(u_DisplayType == DISPLAY_SIL) { // I'm impelmenteng a sebel edge detection method //reference http://rastergrid.com/blog/2011/01/frei-chen-edge-detector/#more-532 @@ -144,6 +120,23 @@ void main() { out_Color = clamp(0.5*sqrt(sumX*sumX + sumY*sumY) + otherColor,0.0,1.0); return; } + /*else if(u_DisplayType == DISPLAY_BLOOM) + { + vec4 glowColor = vec4(0.0); + float dev = float(u_blurAmount) * 0.3; + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) + { + for(int j = -u_blurAmount/2; j<=u_blurAmount/2; ++j) + { + glowColor += texture(u_Bloomtex,fs_Texcoord + vec2(u_texelSizeX * i * u_blurScale , u_texelSizeY * j* u_blurScale)) + * Gaussian2D(float(i)*u_blurStrength,float(j)*u_blurStrength,dev); + + } + } + out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + + return; + }*/ out_Color = otherColor; return; } diff --git a/base/res/shaders/verblur.frag b/base/res/shaders/verblur.frag new file mode 100644 index 0000000..8097fe9 --- /dev/null +++ b/base/res/shaders/verblur.frag @@ -0,0 +1,86 @@ +#version 330 + +//////////////////////////// +// ENUMERATIONS +//////////////////////////// + +#define DISPLAY_DEPTH 0 +#define DISPLAY_NORMAL 1 +#define DISPLAY_POSITION 2 +#define DISPLAY_COLOR 3 +#define DISPLAY_TOTAL 4 +#define DISPLAY_LIGHTS 5 +#define DISPLAY_BLOOM 6 +#define DISPLAY_SIL 7 +///////////////////////////////////// +// Uniforms, Attributes, and Outputs +//////////////////////////////////// +uniform mat4 u_Persp; + +uniform sampler2D u_bluredTex; +uniform sampler2D u_horBluredTex; + +uniform int u_DisplayType; +uniform float u_texelSizeX; +uniform float u_texelSizeY; +uniform int u_blurAmount; +uniform float u_blurScale; +uniform float u_blurStrength; + +in vec2 fs_Texcoord; + +out vec4 out_Color; + +/////////////////////////////////////// + +uniform float zerothresh = 1.0f; +uniform float falloff = 0.1f; + + +///////////////////////////////////// +// UTILITY FUNCTIONS +///////////////////////////////////// + + +//Helper function to automicatlly sample and unpack positions +vec3 sampleCol(vec2 texcoords) { + return texture(u_bluredTex,texcoords).xyz; +} + +float Gaussian1D(float x, float dev) +{ + return (1.0/sqrt(2.0*3.14159 * dev)) * exp(-(x*x)/(2.0*dev)); +} +float Gaussian2D(float x, float y, float dev) +{ + return ( 1.0 / (2.0*3.14159 * dev * dev)) * exp(-((x*x+y*y)/(2.0*dev*dev))); +} + +/////////////////////////////////// +// MAIN +////////////////////////////////// +const float occlusion_strength = 1.5f; +void main() { + vec3 color = sampleCol(fs_Texcoord); + vec4 otherColor = vec4(color,1.0); + vec4 glowColor = vec4(0.0); + + ////////////////////////separable convolution//////////////////////////////// + if(u_DisplayType == DISPLAY_BLOOM) + { + /*out_Color = otherColor; + return;*/ + float dev = float(u_blurAmount) * 0.3; + //verticle + for(int i = -u_blurAmount/2; i<=u_blurAmount/2; ++i) + { + glowColor += texture(u_horBluredTex,fs_Texcoord + vec2(0, u_texelSizeY * i * u_blurScale)) + * Gaussian1D(float(i)*u_blurStrength,dev); + } + out_Color = clamp((glowColor + otherColor)-(glowColor * otherColor),0.0,1.0); + //out_Color = glowColor; + return; + } + out_Color = otherColor; + return; +} diff --git a/base/src/main.cpp b/base/src/main.cpp index 7733fa2..8d03d21 100644 --- a/base/src/main.cpp +++ b/base/src/main.cpp @@ -222,16 +222,21 @@ GLuint positionTexture = 0; GLuint colorTexture = 0; GLuint postTexture = 0; // -GLuint bloomTexture = 0; -GLuint FBO[2] = {0, 0}; +GLuint bloomMap = 0; +GLuint verblurTexture = 0; +GLuint horblurTexture = 0; +GLuint blurTexture = 0; +GLuint FBO[4] = {0, 0, 0, 0}; GLuint pass_prog; GLuint point_prog; GLuint ambient_prog; -GLuint bloom_prog; +//GLuint bloom_prog; GLuint diagnostic_prog; GLuint post_prog; +GLuint verblur_prog; +GLuint horblur_prog; void initShader() { #ifdef WIN32 const char * pass_vert = "../../../res/shaders/pass.vert"; @@ -243,7 +248,10 @@ void initShader() { const char * ambient_frag = "../../../res/shaders/ambient.frag"; const char * point_frag = "../../../res/shaders/point.frag"; const char * post_frag = "../../../res/shaders/post.frag"; - const char * bloom_frag = "../../../res/shaders/bloom.frag"; + //const char * bloom_frag = "../../../res/shaders/bloom.frag"; + const char * verblur_frag = "../../../res/shaders/verblur.frag"; + const char * horblur_frag = "../../../res/shaders/horblur.frag"; + #else const char * pass_vert = "../res/shaders/pass.vert"; const char * shade_vert = "../res/shaders/shade.vert"; @@ -287,11 +295,26 @@ void initShader() { Utility::attachAndLinkProgram(ambient_prog, shaders); /////////////////////////////////////////////////////////////////////////////////////// - shaders = Utility::loadShaders(shade_vert,bloom_frag); - bloom_prog = glCreateProgram(); - glBindAttribLocation(bloom_prog, quad_attributes::POSITION, "Position"); - glBindAttribLocation(bloom_prog, quad_attributes::TEXCOORD, "Texcoord"); - Utility::attachAndLinkProgram(bloom_prog, shaders); + //shaders = Utility::loadShaders(shade_vert,bloom_frag); + //bloom_prog = glCreateProgram(); + //glBindAttribLocation(bloom_prog, quad_attributes::POSITION, "Position"); + //glBindAttribLocation(bloom_prog, quad_attributes::TEXCOORD, "Texcoord"); + //Utility::attachAndLinkProgram(bloom_prog, shaders); +/////////////////////////////////horblur_prog///////////////////////////////////////////// + shaders = Utility::loadShaders(shade_vert,horblur_frag); + horblur_prog = glCreateProgram(); + glBindAttribLocation(horblur_prog, quad_attributes::POSITION, "Position"); + glBindAttribLocation(horblur_prog, quad_attributes::TEXCOORD, "Texcoord"); + Utility::attachAndLinkProgram(horblur_prog, shaders); + +//////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////verblur_prog///////////////////////////////////////////// + shaders = Utility::loadShaders(shade_vert,verblur_frag); + verblur_prog = glCreateProgram(); + glBindAttribLocation(verblur_prog, quad_attributes::POSITION, "Position"); + glBindAttribLocation(verblur_prog, quad_attributes::TEXCOORD, "Texcoord"); + Utility::attachAndLinkProgram(verblur_prog, shaders); + //////////////////////////////////////////////////////////////////////////////////////// shaders = Utility::loadShaders(shade_vert, point_frag); @@ -320,9 +343,15 @@ void freeFBO() { glDeleteTextures(1,&colorTexture); glDeleteTextures(1,&postTexture); // - glDeleteTextures(1,&bloomTexture); + glDeleteTextures(1,&bloomMap); + glDeleteTextures(1,&blurTexture); + glDeleteTextures(1,&verblurTexture); + glDeleteTextures(1,&horblurTexture); glDeleteFramebuffers(1,&FBO[0]); glDeleteFramebuffers(1,&FBO[1]); + // + glDeleteFramebuffers(1,&FBO[2]); + glDeleteFramebuffers(1,&FBO[3]); } void checkFramebufferStatus(GLenum framebufferStatus) { @@ -386,13 +415,13 @@ void initNoise() { void initFBO(int w, int h) { GLenum FBOstatus; - glActiveTexture(GL_TEXTURE10); + glActiveTexture(GL_TEXTURE14); glGenTextures(1, &depthTexture); glGenTextures(1, &normalTexture); glGenTextures(1, &positionTexture); glGenTextures(1, &colorTexture); - glGenTextures(1,&bloomTexture); + glGenTextures(1, &bloomMap); //Set up depth FBO glBindTexture(GL_TEXTURE_2D, depthTexture); @@ -406,7 +435,7 @@ void initFBO(int w, int h) { glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); // //Set up bloom map FBO - glBindTexture(GL_TEXTURE_2D,bloomTexture); + glBindTexture(GL_TEXTURE_2D,bloomMap); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -449,7 +478,7 @@ void initFBO(int w, int h) { glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); - // creatwwe a framebuffer object + // create a frame buffer object glGenFramebuffers(1, &FBO[0]); glBindFramebuffer(GL_FRAMEBUFFER, FBO[0]); @@ -458,7 +487,6 @@ void initFBO(int w, int h) { GLint normal_loc = glGetFragDataLocation(pass_prog,"out_Normal"); GLint position_loc = glGetFragDataLocation(pass_prog,"out_Position"); GLint color_loc = glGetFragDataLocation(pass_prog,"out_Color"); - // GLint bloom_loc = glGetFragDataLocation(pass_prog,"out_BloomMap"); GLenum draws [4]; draws[normal_loc] = GL_COLOR_ATTACHMENT0; @@ -477,8 +505,8 @@ void initFBO(int w, int h) { glFramebufferTexture(GL_FRAMEBUFFER, draws[position_loc], positionTexture, 0); glBindTexture(GL_TEXTURE_2D, colorTexture); glFramebufferTexture(GL_FRAMEBUFFER, draws[color_loc], colorTexture, 0); - glBindTexture(GL_TEXTURE_2D,bloomTexture); - glFramebufferTexture(GL_FRAMEBUFFER, draws[bloom_loc], bloomTexture, 0); + glBindTexture(GL_TEXTURE_2D,bloomMap); + glFramebufferTexture(GL_FRAMEBUFFER, draws[bloom_loc], bloomMap, 0); // check FBO status FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -487,8 +515,75 @@ void initFBO(int w, int h) { checkFramebufferStatus(FBOstatus); } + ///////////// + glActiveTexture(GL_TEXTURE14); + glGenTextures(1,&horblurTexture); + glGenFramebuffers(1,&FBO[1]); + glBindFramebuffer(GL_FRAMEBUFFER, FBO[1]); + glBindTexture(GL_TEXTURE_2D, horblurTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); + glReadBuffer(GL_BACK); + color_loc = glGetFragDataLocation(ambient_prog ,"out_Color"); + GLenum draw[1]; + draw[color_loc] = GL_COLOR_ATTACHMENT0; + glDrawBuffers(2, draw); + + test = GL_COLOR_ATTACHMENT0; + glBindTexture(GL_TEXTURE_2D, horblurTexture); + glFramebufferTexture(GL_FRAMEBUFFER, draw[color_loc], horblurTexture, 0); + // check FBO status + FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if(FBOstatus != GL_FRAMEBUFFER_COMPLETE) { + printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO[1]\n"); + checkFramebufferStatus(FBOstatus); + } + ///////////////////////////////////////////////////////////////////////////// + glActiveTexture(GL_TEXTURE14); + glGenTextures(1,&blurTexture); + glGenTextures(1,&verblurTexture); + + glGenFramebuffers(1,&FBO[2]); + glBindFramebuffer(GL_FRAMEBUFFER, FBO[2]); + glBindTexture(GL_TEXTURE_2D, blurTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); + + glBindTexture(GL_TEXTURE_2D, verblurTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); + + glReadBuffer(GL_BACK); + color_loc = glGetFragDataLocation(horblur_prog,"out_Color"); + GLuint verblur_loc = glGetFragDataLocation(horblur_prog,"out_horBlured"); + GLenum drawblur[2]; + drawblur[color_loc] = GL_COLOR_ATTACHMENT0; + drawblur[verblur_loc] = GL_COLOR_ATTACHMENT1; + glDrawBuffers(2, drawblur); + + test = GL_COLOR_ATTACHMENT0; + glBindTexture(GL_TEXTURE_2D, blurTexture); + glFramebufferTexture(GL_FRAMEBUFFER, drawblur[color_loc], blurTexture, 0); + glBindTexture(GL_TEXTURE_2D, verblurTexture); + glFramebufferTexture(GL_FRAMEBUFFER, drawblur[verblur_loc], verblurTexture, 0); + // check FBO status + FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if(FBOstatus != GL_FRAMEBUFFER_COMPLETE) { + printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO[2]\n"); + checkFramebufferStatus(FBOstatus); + } + ///////////////////////////////////////////////////////////////////////////// //Post Processing buffer! - glActiveTexture(GL_TEXTURE10); + glActiveTexture(GL_TEXTURE14); glGenTextures(1, &postTexture); @@ -503,26 +598,26 @@ void initFBO(int w, int h) { glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); - // creatwwe a framebuffer object - glGenFramebuffers(1, &FBO[1]); - glBindFramebuffer(GL_FRAMEBUFFER, FBO[1]); + // create a framebuffer object + glGenFramebuffers(1, &FBO[3]); + glBindFramebuffer(GL_FRAMEBUFFER, FBO[3]); // Instruct openGL that we won't bind a color texture with the currently bound FBO glReadBuffer(GL_BACK); - color_loc = glGetFragDataLocation(ambient_prog,"out_Color"); - GLenum draw[1]; - draw[color_loc] = GL_COLOR_ATTACHMENT0; - glDrawBuffers(1, draw); + color_loc = glGetFragDataLocation(verblur_prog,"out_Color"); + GLenum drawB[1]; + drawB[color_loc] = GL_COLOR_ATTACHMENT0; + glDrawBuffers(1, drawB); // attach the texture to FBO depth attachment point test = GL_COLOR_ATTACHMENT0; glBindTexture(GL_TEXTURE_2D, postTexture); - glFramebufferTexture(GL_FRAMEBUFFER, draw[color_loc], postTexture, 0); + glFramebufferTexture(GL_FRAMEBUFFER, drawB[color_loc], postTexture, 0); // check FBO status FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); if(FBOstatus != GL_FRAMEBUFFER_COMPLETE) { - printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO[1]\n"); + printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO[3]\n"); checkFramebufferStatus(FBOstatus); } @@ -688,9 +783,10 @@ void setup_quad(GLuint prog) glUniform1i(glGetUniformLocation(prog, "u_RandomScalartex"),5); glActiveTexture(GL_TEXTURE6); - glBindTexture(GL_TEXTURE_2D,bloomTexture); + glBindTexture(GL_TEXTURE_2D,bloomMap); glUniform1i(glGetUniformLocation(prog, "u_Bloomtex"),6); + } void draw_quad() { @@ -806,8 +902,6 @@ void display(void) glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_ONE, GL_ONE); - //glBlendFunc(GL_ZERO,GL_ZERO); - //glBlendFunc(GL_SRC_COLOR, GL_DST_COLOR); glClear(GL_COLOR_BUFFER_BIT); if(display_type == DISPLAY_LIGHTS || display_type == DISPLAY_TOTAL || display_type == DISPLAY_BLOOM || display_type == DISPLAY_SIL) { @@ -848,11 +942,65 @@ void display(void) setup_quad(diagnostic_prog); draw_quad(); } - glDisable(GL_BLEND); - //Stage 3 -- RENDER TO SCREEN + + //////stage 3, generate horizontal blured texture//////////////// + setTextures(); + bindFBO(2); + glEnable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(horblur_prog); + + glActiveTexture(GL_TEXTURE7); + glBindTexture(GL_TEXTURE_2D, horblurTexture); + glUniform1i(glGetUniformLocation(horblur_prog, "u_Blurtex"),7); + + glActiveTexture(GL_TEXTURE6); + glBindTexture(GL_TEXTURE_2D,bloomMap); + glUniform1i(glGetUniformLocation(horblur_prog, "u_Bloomtex"),6); + + glUniform1i(glGetUniformLocation(horblur_prog, "u_DisplayType"), display_type); + texelSize = vec2(1.0/(float)width,1.0/(float)height); + blurAmount = 30; //20: 43 fps /10: 60 fps / 30: 36.2 fps / 40: 30.57 / 50: 25.7 + blurStrength = 1.0; + blurScale = 7.0; + glUniform1f(glGetUniformLocation(horblur_prog,"u_texelSizeX"),texelSize.x); + glUniform1f(glGetUniformLocation(horblur_prog,"u_texelSizeY"),texelSize.y); + glUniform1i(glGetUniformLocation(horblur_prog,"u_blurAmount"),blurAmount); + glUniform1f(glGetUniformLocation(horblur_prog,"u_blurScale"),blurScale); + glUniform1f(glGetUniformLocation(horblur_prog,"u_blurStrength"),blurStrength); + draw_quad(); + + //stage4 -- generate verticle blured texture setTextures(); + bindFBO(3); + glEnable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(verblur_prog); + + glActiveTexture(GL_TEXTURE8); + glBindTexture(GL_TEXTURE_2D, verblurTexture); + glUniform1i(glGetUniformLocation(verblur_prog, "u_horBluredTex"),8); + + glActiveTexture(GL_TEXTURE9); + glBindTexture(GL_TEXTURE_2D,blurTexture); + glUniform1i(glGetUniformLocation(verblur_prog, "u_bluredTex"),9); + + glUniform1i(glGetUniformLocation(verblur_prog, "u_DisplayType"), display_type); + glUniform1f(glGetUniformLocation(verblur_prog,"u_texelSizeX"),texelSize.x); + glUniform1f(glGetUniformLocation(verblur_prog,"u_texelSizeY"),texelSize.y); + glUniform1i(glGetUniformLocation(verblur_prog,"u_blurAmount"),blurAmount); + glUniform1f(glGetUniformLocation(verblur_prog,"u_blurScale"),blurScale); + glUniform1f(glGetUniformLocation(verblur_prog,"u_blurStrength"),blurStrength); + draw_quad(); + + + //Stage 5 -- RENDER TO SCREEN + setTextures(); + glClear(GL_COLOR_BUFFER_BIT); glUseProgram(post_prog); glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -868,7 +1016,7 @@ void display(void) glUniform1i(glGetUniformLocation(post_prog, "u_Colortex"),3); glActiveTexture(GL_TEXTURE6); - glBindTexture(GL_TEXTURE_2D,bloomTexture); + glBindTexture(GL_TEXTURE_2D,bloomMap); glUniform1i(glGetUniformLocation(post_prog, "u_Bloomtex"),6); glActiveTexture(GL_TEXTURE2); @@ -892,10 +1040,10 @@ void display(void) glUniform1i(glGetUniformLocation(post_prog, "u_ScreenWidth"), width); glUniform1i(glGetUniformLocation(post_prog, "u_DisplayType"), display_type); // bloom related uniform values - texelSize = vec2(1.0/(float)width,1.0/(float)height); - blurAmount = 10; // FPS 4.25 // 10 FPS 13.26 effect best// // 30 FPS 2.0 - blurStrength = 1.0; - blurScale = 5.0; + //texelSize = vec2(1.0/(float)width,1.0/(float)height); + //blurAmount = 50; // FPS 4.25 // 10 FPS 13.26 //20: 4.28 // 30:1.98// 40:1.18//50:0.76 + //blurStrength = 1.0; + //blurScale = 5.0; glUniform1f(glGetUniformLocation(post_prog,"u_texelSizeX"),texelSize.x); glUniform1f(glGetUniformLocation(post_prog,"u_texelSizeY"),texelSize.y); glUniform1i(glGetUniformLocation(post_prog,"u_blurAmount"),blurAmount); diff --git a/screenshots/Bloom_separable.JPG b/screenshots/Bloom_separable.JPG new file mode 100644 index 0000000000000000000000000000000000000000..ff550cf8653f1821c47bb921a16b5e8b60caea28 GIT binary patch literal 40709 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 Sb0EacdEYB3jk^|qy!;0hN9COW literal 0 HcmV?d00001 From 32b31a15f343a099abb30d0b7b76335a4149784e Mon Sep 17 00:00:00 2001 From: YuqinShao Date: Thu, 14 Nov 2013 23:51:07 -0500 Subject: [PATCH 4/7] add performance eva --- base/res/shaders/diagnostic.frag | 6 +++++ base/res/shaders/pass.frag | 3 +++ base/res/shaders/pass.vert | 3 +++ base/src/main.cpp | 43 +++++++++++++++++++++++++------ base/src/main.h | 3 ++- screenshots/perform1.png | Bin 0 -> 8808 bytes screenshots/perform2.png | Bin 0 -> 12294 bytes 7 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 screenshots/perform1.png create mode 100644 screenshots/perform2.png diff --git a/base/res/shaders/diagnostic.frag b/base/res/shaders/diagnostic.frag index 7db3bc2..afd69ad 100644 --- a/base/res/shaders/diagnostic.frag +++ b/base/res/shaders/diagnostic.frag @@ -11,6 +11,8 @@ #define DISPLAY_TOTAL 4 #define DISPLAY_LIGHTS 5 #define DISPLAY_BLOOM 6 +#define DISPLAY_SIL 7 +#define DISPLAY_TEXCOORD 8 ///////////////////////////////////// // Uniforms, Attributes, and Outputs @@ -24,6 +26,7 @@ uniform sampler2D u_Colortex; uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; uniform sampler2D u_Bloomtex; +uniform sampler2D u_Texcoordtex; uniform float u_Far; uniform float u_Near; @@ -119,6 +122,9 @@ void main() { case(DISPLAY_COLOR): out_Color = vec4(color, 1.0); break; + case(DISPLAY_TEXCOORD): + out_Color = texture(u_Texcoordtex,fs_Texcoord); + break; case(DISPLAY_LIGHTS): case(DISPLAY_TOTAL): break; diff --git a/base/res/shaders/pass.frag b/base/res/shaders/pass.frag index 1715f79..b5dc190 100644 --- a/base/res/shaders/pass.frag +++ b/base/res/shaders/pass.frag @@ -7,11 +7,13 @@ uniform float u_isBloom; in vec3 fs_Normal; in vec4 fs_Position; +in vec2 fs_Texcoord; out vec4 out_Normal; out vec4 out_Position; out vec4 out_Color; out vec4 out_BloomMap; +out vec4 out_texCoord; void main(void) { @@ -24,4 +26,5 @@ void main(void) } else out_BloomMap = vec4(0.0,0.0,0.0,1.0); + out_texCoord = vec4(fs_Texcoord.xy,0.0,1.0); } diff --git a/base/res/shaders/pass.vert b/base/res/shaders/pass.vert index e36825f..25746f5 100644 --- a/base/res/shaders/pass.vert +++ b/base/res/shaders/pass.vert @@ -8,9 +8,11 @@ uniform mat4x4 u_InvTrans; in vec3 Position; in vec3 Normal; +in vec2 Texcoord; out vec3 fs_Normal; out vec4 fs_Position; +out vec2 fs_Texcoord; void main(void) { fs_Normal = (u_InvTrans*vec4(Normal,0.0f)).xyz; @@ -18,4 +20,5 @@ void main(void) { vec4 camera = u_View * world; fs_Position = camera; gl_Position = u_Persp * camera; + fs_Texcoord = Texcoord; } diff --git a/base/src/main.cpp b/base/src/main.cpp index 8d03d21..c156631 100644 --- a/base/src/main.cpp +++ b/base/src/main.cpp @@ -222,6 +222,7 @@ GLuint positionTexture = 0; GLuint colorTexture = 0; GLuint postTexture = 0; // +//GLuint texcoordTexture = 0; GLuint bloomMap = 0; GLuint verblurTexture = 0; GLuint horblurTexture = 0; @@ -347,6 +348,7 @@ void freeFBO() { glDeleteTextures(1,&blurTexture); glDeleteTextures(1,&verblurTexture); glDeleteTextures(1,&horblurTexture); + //glDeleteTextures(1,&texcoordTexture); glDeleteFramebuffers(1,&FBO[0]); glDeleteFramebuffers(1,&FBO[1]); // @@ -415,13 +417,23 @@ void initNoise() { void initFBO(int w, int h) { GLenum FBOstatus; - glActiveTexture(GL_TEXTURE14); + glActiveTexture(GL_TEXTURE15); glGenTextures(1, &depthTexture); glGenTextures(1, &normalTexture); glGenTextures(1, &positionTexture); glGenTextures(1, &colorTexture); glGenTextures(1, &bloomMap); + //glGenTextures(1,&texcoordTexture); + + //glBindTexture(GL_TEXTURE_2D,texcoordTexture); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + //glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); //Set up depth FBO glBindTexture(GL_TEXTURE_2D, depthTexture); @@ -488,11 +500,13 @@ void initFBO(int w, int h) { GLint position_loc = glGetFragDataLocation(pass_prog,"out_Position"); GLint color_loc = glGetFragDataLocation(pass_prog,"out_Color"); GLint bloom_loc = glGetFragDataLocation(pass_prog,"out_BloomMap"); + //GLint texcoord_loc = glGetFragDataLocation(pass_prog,"out_texCoord"); GLenum draws [4]; draws[normal_loc] = GL_COLOR_ATTACHMENT0; draws[position_loc] = GL_COLOR_ATTACHMENT1; draws[color_loc] = GL_COLOR_ATTACHMENT2; draws[bloom_loc] = GL_COLOR_ATTACHMENT3; + //draws[texcoord_loc] = GL_COLOR_ATTACHMENT4; glDrawBuffers(4, draws); // attach the texture to FBO depth attachment point @@ -507,6 +521,8 @@ void initFBO(int w, int h) { glFramebufferTexture(GL_FRAMEBUFFER, draws[color_loc], colorTexture, 0); glBindTexture(GL_TEXTURE_2D,bloomMap); glFramebufferTexture(GL_FRAMEBUFFER, draws[bloom_loc], bloomMap, 0); + /*glBindTexture(GL_TEXTURE_2D,texcoordTexture); + glFramebufferTexture(GL_FRAMEBUFFER, draws[texcoord_loc], texcoordTexture, 0);*/ // check FBO status FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -516,7 +532,7 @@ void initFBO(int w, int h) { } ///////////// - glActiveTexture(GL_TEXTURE14); + glActiveTexture(GL_TEXTURE15); glGenTextures(1,&horblurTexture); glGenFramebuffers(1,&FBO[1]); glBindFramebuffer(GL_FRAMEBUFFER, FBO[1]); @@ -542,7 +558,7 @@ void initFBO(int w, int h) { checkFramebufferStatus(FBOstatus); } ///////////////////////////////////////////////////////////////////////////// - glActiveTexture(GL_TEXTURE14); + glActiveTexture(GL_TEXTURE15); glGenTextures(1,&blurTexture); glGenTextures(1,&verblurTexture); @@ -583,7 +599,7 @@ void initFBO(int w, int h) { } ///////////////////////////////////////////////////////////////////////////// //Post Processing buffer! - glActiveTexture(GL_TEXTURE14); + glActiveTexture(GL_TEXTURE15); glGenTextures(1, &postTexture); @@ -786,7 +802,9 @@ void setup_quad(GLuint prog) glBindTexture(GL_TEXTURE_2D,bloomMap); glUniform1i(glGetUniformLocation(prog, "u_Bloomtex"),6); - + //glActiveTexture(GL_TEXTURE10); + //glBindTexture(GL_TEXTURE_2D,texcoordTexture); + //glUniform1i(glGetUniformLocation(prog, "u_Texcoordtex"),10); } void draw_quad() { @@ -858,6 +876,9 @@ void updateDisplayText(char * disp) { case(DISPLAY_BLOOM): sprintf(disp,"Displaying Bloom"); break; + case(DISPLAY_SIL): + sprintf(disp,"Displaying Toon Shading"); + break; } } @@ -918,10 +939,13 @@ void display(void) 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.5, 0.5, 0.0, 1.0); - + float radius = 2; draw_light(vec3(3.0, -3.5, 5.0), 2.50, sc, vp, NEARP,vec3(1.0,1.0,1.0)); - draw_light(vec3(5.5, -2.5, 1.0),0.5, sc, vp, NEARP,vec3(1.0,1.0,0.0)); - draw_light(vec3(5.5, -2.5, 2.0),3.5, sc, vp, NEARP,vec3(1.0,1.0,0.0)); + draw_light(vec3(5.5, -2.5, 1.0),radius, sc, vp, NEARP,vec3(1.0,1.0,0.0)); + draw_light(vec3(5.5, -2.5, 3.5),radius, sc, vp, NEARP,vec3(1.0,1.0,0.0)); + /*draw_light(vec3(5.5, -2.5, 2.0),radius, sc, vp, NEARP,vec3(1.0,1.0,0.0)); + draw_light(vec3(5.5, -2.5, 2.5),radius, sc, vp, NEARP,vec3(1.0,1.0,0.0)); + draw_light(vec3(5.5, -2.5, 3.0),radius, sc, vp, NEARP,vec3(1.0,1.0,0.0));*/ glDisable(GL_SCISSOR_TEST); @@ -1154,6 +1178,9 @@ void keyboard(unsigned char key, int x, int y) { case('7'): display_type = DISPLAY_SIL; break; + case('8'): + display_type = DISPLAY_TEXCOORD; + break; case('0'): display_type = DISPLAY_TOTAL; break; diff --git a/base/src/main.h b/base/src/main.h index 88af081..300b766 100644 --- a/base/src/main.h +++ b/base/src/main.h @@ -87,7 +87,8 @@ enum Display { DISPLAY_TOTAL = 4, DISPLAY_LIGHTS = 5, DISPLAY_BLOOM = 6, - DISPLAY_SIL = 7 + DISPLAY_SIL = 7, + DISPLAY_TEXCOORD = 8 }; char* loadFile(char *fname, GLint &fSize); diff --git a/screenshots/perform1.png b/screenshots/perform1.png new file mode 100644 index 0000000000000000000000000000000000000000..8235efec7bd96a5ba85de93fae74c7e632ace4fd GIT binary patch literal 8808 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 Date: Fri, 15 Nov 2013 14:57:52 -0500 Subject: [PATCH 5/7] ready for submission --- base/PROJ_WIN/P6/P6/P6.vcxproj | 2 +- base/res/cornell/cornell_box.mtl | 6 +-- base/res/cornell/cornell_box.obj | 1 - base/res/shaders/ambient.frag | 2 +- base/res/shaders/diagnostic.frag | 9 ++-- base/res/shaders/pass.frag | 7 +-- base/res/shaders/pass.vert | 2 - base/res/shaders/point.frag | 12 ++++- base/res/shaders/post.frag | 2 +- base/src/main.cpp | 65 ++++++++++++++----------- base/src/main.h | 4 +- screenshots/specular.JPG | Bin 0 -> 32209 bytes screenshots/specularMap.JPG | Bin 0 -> 28150 bytes shared32/glm/glm/core/func_integer.hpp | 4 +- 14 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 screenshots/specular.JPG create mode 100644 screenshots/specularMap.JPG diff --git a/base/PROJ_WIN/P6/P6/P6.vcxproj b/base/PROJ_WIN/P6/P6/P6.vcxproj index 3343844..d3a355b 100644 --- a/base/PROJ_WIN/P6/P6/P6.vcxproj +++ b/base/PROJ_WIN/P6/P6/P6.vcxproj @@ -67,7 +67,7 @@ true true $(SolutionDir)$(Configuration);..\..\..\..\shared32\glew\lib;..\..\..\..\shared32\freeglut\lib;%(AdditionalLibraryDirectories) - freeglut.lib;glew32.lib;%(AdditionalDependencies) + freeglut.lib;glew32.lib;SOIL.lib;%(AdditionalDependencies) Console diff --git a/base/res/cornell/cornell_box.mtl b/base/res/cornell/cornell_box.mtl index 55a5c9a..8240aff 100644 --- a/base/res/cornell/cornell_box.mtl +++ b/base/res/cornell/cornell_box.mtl @@ -13,7 +13,7 @@ Ns 0 newmtl green Ka 0 0 0 Kd 0 1 0 -Ks 0 0 0 +Ks 1 1 1 Ns 0 newmtl blue @@ -31,8 +31,8 @@ Ns 1.0 newmtl lightblue Ka 0 0 0 Kd 0 1 1 -ks 0 0 0 -Ns 0.0 +Ks 1 1 1 +Ns 0 newmtl light Ka 20 20 20 diff --git a/base/res/cornell/cornell_box.obj b/base/res/cornell/cornell_box.obj index 73fbe6f..af463ec 100644 --- a/base/res/cornell/cornell_box.obj +++ b/base/res/cornell/cornell_box.obj @@ -118,7 +118,6 @@ v 314.0 330.0 456.0 v 472.0 330.0 406.0 f -4 -3 -2 -1 -usemtl lightblue v 423.0 0.0 247.0 v 423.0 330.0 247.0 v 472.0 330.0 406.0 diff --git a/base/res/shaders/ambient.frag b/base/res/shaders/ambient.frag index cb74aa7..087bfc4 100644 --- a/base/res/shaders/ambient.frag +++ b/base/res/shaders/ambient.frag @@ -25,7 +25,7 @@ uniform sampler2D u_Colortex; uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; uniform sampler2D u_Bloomtex; - +uniform sampler2D u_Speculartex; uniform float u_Far; uniform float u_Near; uniform int u_OcclusionType; diff --git a/base/res/shaders/diagnostic.frag b/base/res/shaders/diagnostic.frag index afd69ad..9e684f7 100644 --- a/base/res/shaders/diagnostic.frag +++ b/base/res/shaders/diagnostic.frag @@ -12,7 +12,7 @@ #define DISPLAY_LIGHTS 5 #define DISPLAY_BLOOM 6 #define DISPLAY_SIL 7 -#define DISPLAY_TEXCOORD 8 +#define DISPLAY_SPECULAR 8 ///////////////////////////////////// // Uniforms, Attributes, and Outputs @@ -27,7 +27,7 @@ uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; uniform sampler2D u_Bloomtex; uniform sampler2D u_Texcoordtex; - +uniform sampler2D u_Speculartex; uniform float u_Far; uniform float u_Near; uniform int u_OcclusionType; @@ -122,8 +122,9 @@ void main() { case(DISPLAY_COLOR): out_Color = vec4(color, 1.0); break; - case(DISPLAY_TEXCOORD): - out_Color = texture(u_Texcoordtex,fs_Texcoord); + case(DISPLAY_SPECULAR): + out_Color = texture(u_Speculartex,fs_Texcoord); + //out_Color = vec4(1.0,0.0,0.0,1.0); break; case(DISPLAY_LIGHTS): case(DISPLAY_TOTAL): diff --git a/base/res/shaders/pass.frag b/base/res/shaders/pass.frag index b5dc190..481fbac 100644 --- a/base/res/shaders/pass.frag +++ b/base/res/shaders/pass.frag @@ -2,8 +2,8 @@ uniform float u_Far; uniform vec3 u_Color; - uniform float u_isBloom; +uniform vec3 u_Specular; in vec3 fs_Normal; in vec4 fs_Position; @@ -13,7 +13,7 @@ out vec4 out_Normal; out vec4 out_Position; out vec4 out_Color; out vec4 out_BloomMap; -out vec4 out_texCoord; +out vec4 out_Specular; void main(void) { @@ -26,5 +26,6 @@ void main(void) } else out_BloomMap = vec4(0.0,0.0,0.0,1.0); - out_texCoord = vec4(fs_Texcoord.xy,0.0,1.0); + out_Specular = vec4(u_Specular,1.0); + } diff --git a/base/res/shaders/pass.vert b/base/res/shaders/pass.vert index 25746f5..d5d4328 100644 --- a/base/res/shaders/pass.vert +++ b/base/res/shaders/pass.vert @@ -12,7 +12,6 @@ in vec2 Texcoord; out vec3 fs_Normal; out vec4 fs_Position; -out vec2 fs_Texcoord; void main(void) { fs_Normal = (u_InvTrans*vec4(Normal,0.0f)).xyz; @@ -20,5 +19,4 @@ void main(void) { vec4 camera = u_View * world; fs_Position = camera; gl_Position = u_Persp * camera; - fs_Texcoord = Texcoord; } diff --git a/base/res/shaders/point.frag b/base/res/shaders/point.frag index 6650e19..58e85e3 100644 --- a/base/res/shaders/point.frag +++ b/base/res/shaders/point.frag @@ -25,7 +25,7 @@ uniform sampler2D u_Colortex; uniform sampler2D u_RandomNormaltex; uniform sampler2D u_RandomScalartex; uniform sampler2D u_Bloomtex; - +uniform sampler2D u_Speculartex; uniform float u_Far; uniform float u_Near; uniform int u_DisplayType; @@ -36,6 +36,7 @@ uniform int u_ScreenHeight; uniform vec4 u_Light; uniform float u_LightIl; +uniform vec3 u_camPos; in vec2 fs_Texcoord; @@ -127,7 +128,14 @@ void main() { attenuation = attenuation / lightRadius + 1; attenuation = 1.0/(attenuation * attenuation); vec3 diffuseColor = Intensity * color * diffuse * u_lightColor * attenuation * isInradius; - out_Color = vec4(diffuseColor , 1.0); + //specular color + vec3 reflect = reflect(normalize(-lightVector),normal); + vec3 eyevector =normalize(u_camPos - position); + float specular = pow(dot(reflect,eyevector),3.0); + vec3 specularColor = vec3(0.0); + specularColor = specular * texture(u_Speculartex,fs_Texcoord).rgb; + + out_Color = vec4(diffuseColor + specularColor, 1.0); } return; diff --git a/base/res/shaders/post.frag b/base/res/shaders/post.frag index 97c46a2..b5fea37 100644 --- a/base/res/shaders/post.frag +++ b/base/res/shaders/post.frag @@ -23,7 +23,7 @@ uniform sampler2D u_Colortex; uniform sampler2D u_Bloomtex; uniform sampler2D u_Positiontex; uniform sampler2D u_Normaltex; - +uniform sampler2D u_Speculartex; uniform vec3 u_cameraPos; // eyePos uniform int u_ScreenWidth; diff --git a/base/src/main.cpp b/base/src/main.cpp index c156631..8c5be36 100644 --- a/base/src/main.cpp +++ b/base/src/main.cpp @@ -88,6 +88,7 @@ device_mesh_t uploadMesh(const mesh_t & mesh) { out.texname = mesh.texname; out.color = mesh.color; out.isBloom = mesh.isBloom; + out.specular = mesh.specular; return out; } @@ -171,6 +172,9 @@ void initMesh() { shape.material.diffuse[2]); mesh.texname = shape.material.diffuse_texname; mesh.isBloom = shape.material.shininess; // added for glow + mesh.specular =glm::vec3(shape.material.specular[0], + shape.material.specular[1], + shape.material.specular[2]); draw_meshes.push_back(uploadMesh(mesh)); f=f+process; } @@ -221,8 +225,7 @@ GLuint normalTexture = 0; GLuint positionTexture = 0; GLuint colorTexture = 0; GLuint postTexture = 0; -// -//GLuint texcoordTexture = 0; +GLuint specularTexture = 0; GLuint bloomMap = 0; GLuint verblurTexture = 0; GLuint horblurTexture = 0; @@ -348,7 +351,7 @@ void freeFBO() { glDeleteTextures(1,&blurTexture); glDeleteTextures(1,&verblurTexture); glDeleteTextures(1,&horblurTexture); - //glDeleteTextures(1,&texcoordTexture); + glDeleteTextures(1,&specularTexture); glDeleteFramebuffers(1,&FBO[0]); glDeleteFramebuffers(1,&FBO[1]); // @@ -417,23 +420,16 @@ void initNoise() { void initFBO(int w, int h) { GLenum FBOstatus; - glActiveTexture(GL_TEXTURE15); + glActiveTexture(GL_TEXTURE16); glGenTextures(1, &depthTexture); glGenTextures(1, &normalTexture); glGenTextures(1, &positionTexture); glGenTextures(1, &colorTexture); glGenTextures(1, &bloomMap); - //glGenTextures(1,&texcoordTexture); + glGenTextures(1,&specularTexture); - //glBindTexture(GL_TEXTURE_2D,texcoordTexture); - //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - - //glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); + //Set up depth FBO glBindTexture(GL_TEXTURE_2D, depthTexture); @@ -489,7 +485,15 @@ void initFBO(int w, int h) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA , w, h, 0, GL_RGBA, GL_FLOAT,0); + //Set up specular FBO + glBindTexture(GL_TEXTURE_2D,specularTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB32F , w, h, 0, GL_RGBA, GL_FLOAT,0); // create a frame buffer object glGenFramebuffers(1, &FBO[0]); glBindFramebuffer(GL_FRAMEBUFFER, FBO[0]); @@ -500,14 +504,14 @@ void initFBO(int w, int h) { GLint position_loc = glGetFragDataLocation(pass_prog,"out_Position"); GLint color_loc = glGetFragDataLocation(pass_prog,"out_Color"); GLint bloom_loc = glGetFragDataLocation(pass_prog,"out_BloomMap"); - //GLint texcoord_loc = glGetFragDataLocation(pass_prog,"out_texCoord"); - GLenum draws [4]; + GLint specular_loc = glGetFragDataLocation(pass_prog,"out_Specular"); + GLenum draws[5]; draws[normal_loc] = GL_COLOR_ATTACHMENT0; draws[position_loc] = GL_COLOR_ATTACHMENT1; draws[color_loc] = GL_COLOR_ATTACHMENT2; draws[bloom_loc] = GL_COLOR_ATTACHMENT3; - //draws[texcoord_loc] = GL_COLOR_ATTACHMENT4; - glDrawBuffers(4, draws); + draws[specular_loc] = GL_COLOR_ATTACHMENT4; + glDrawBuffers(5, draws); // attach the texture to FBO depth attachment point int test = GL_COLOR_ATTACHMENT0; @@ -521,8 +525,8 @@ void initFBO(int w, int h) { glFramebufferTexture(GL_FRAMEBUFFER, draws[color_loc], colorTexture, 0); glBindTexture(GL_TEXTURE_2D,bloomMap); glFramebufferTexture(GL_FRAMEBUFFER, draws[bloom_loc], bloomMap, 0); - /*glBindTexture(GL_TEXTURE_2D,texcoordTexture); - glFramebufferTexture(GL_FRAMEBUFFER, draws[texcoord_loc], texcoordTexture, 0);*/ + glBindTexture(GL_TEXTURE_2D,specularTexture); + glFramebufferTexture(GL_FRAMEBUFFER, draws[specular_loc], specularTexture, 0); // check FBO status FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -532,7 +536,7 @@ void initFBO(int w, int h) { } ///////////// - glActiveTexture(GL_TEXTURE15); + glActiveTexture(GL_TEXTURE16); glGenTextures(1,&horblurTexture); glGenFramebuffers(1,&FBO[1]); glBindFramebuffer(GL_FRAMEBUFFER, FBO[1]); @@ -546,7 +550,7 @@ void initFBO(int w, int h) { color_loc = glGetFragDataLocation(ambient_prog ,"out_Color"); GLenum draw[1]; draw[color_loc] = GL_COLOR_ATTACHMENT0; - glDrawBuffers(2, draw); + glDrawBuffers(1, draw); test = GL_COLOR_ATTACHMENT0; glBindTexture(GL_TEXTURE_2D, horblurTexture); @@ -558,7 +562,7 @@ void initFBO(int w, int h) { checkFramebufferStatus(FBOstatus); } ///////////////////////////////////////////////////////////////////////////// - glActiveTexture(GL_TEXTURE15); + glActiveTexture(GL_TEXTURE16); glGenTextures(1,&blurTexture); glGenTextures(1,&verblurTexture); @@ -599,7 +603,7 @@ void initFBO(int w, int h) { } ///////////////////////////////////////////////////////////////////////////// //Post Processing buffer! - glActiveTexture(GL_TEXTURE15); + glActiveTexture(GL_TEXTURE16); glGenTextures(1, &postTexture); @@ -745,6 +749,7 @@ void draw_mesh() { for(int i=0; iG>(2f-Q?5JXT)Ktv!>Krtu=X#tW@B%&NpN}_;>D1sU+phkKVqC%tu zLRBG(1v!dHQKW-n14N~W6zL`T){f=qIq!S#J@0qNKgK`417jy^@9bn}ui2jY%(=pQ z&g*~{T9}%fLI?x``VIU;yv~KMaDfyL2*Tqb4G4n7AR)v?NC1pPz>dXP3M2%^2r#z2 zdv>9xWd>?oagGc}T{WAmq%)mc0@XrkVGXww3!2gRga5TV= z;sZg#(Sm#&fdqIVC0gjm_(p6De=KN#fuPvfKgNGx3b9yt-u}T9|1WCKKll944E!?# z|IENYGw{z0{4oQ%>vZ%Cb#x4MFe`P?hM4t+y6d2Sbqs=zLIIE;M1cST0qn*+8LvZ! z4j5`{`}nVQ-RtY-zIKnVw|1cG0d1YN>$IUw*uVp>d-k~>TIuHQN%1jK8@yYlwvw{f zNX-$0Uxz2^w#m{2s|C)` z@;~Zx$Td*Q$A8tg57_4Jzvm$3z#)pS&r0|MUEO>G4jCy21W@)GdboOE-1hFpXt}xS z?bXuJ+3Tw1x>rv}Yp)ei(5+|R%E-aXpx``x|WeGd79 z+0fBe*8cjX|F^CQrs&5-|K;?9dj#hgnjCa@J>u zTwHvU_Rp96>m2Zp0G$Kx`=O!Woh$!8`1|J~e`}KenXZ4P>u=4#-#Ymp?fPfB{?-iq zt&{)JuK%A+*B>a?-3LJ1BLKtlUP302sIahzu#l*Tu!xwbsF=i}c>rTbNH16@xkyG@ zPF6-*X4&!;YD&u$R1}uUD6dskQAcU6(Ue=Mt*5P_tEQo;0e=WWR7^}lTmm_79#TVI zMqcA@|M7l@7KsU56Vw(&C_@5^5Q2*kyho5Cs5uIQDkWT~{Pu?s5EK#?5fu}cmx=cn^PDNEs9i@TBtlyw-U}&-pXS&_Y+=66h@8Gz@iM(g8yN9P2h3bDO;P8>a zqd}+7god3xcb*;_7oU)LF)5jmmY$Kx%F1Tv+$bvM+`LtC`_9AiM-`7NtEy`no0?l% z+n&E@@9cWl{rde|BT1 z{-ZnlabthnS34vrhycP9Tm)gEsb|;{RP%FgN0x)Hf5FC;X>=44Nx(thH--5)XS$7! zUVUU5yD8m&`Deul;$daK54b)QLJ}dmva#jzRUFb5@s~{|vjS2@`B~DPZ3W!IN!Kmu zkPphwW}d~;5Lx;z&PuXvF=9pg;r3`Pbutv?y|z7GMco3r;JuvsTYN`6LZoI_!seP? z@L;|DNre@=pe;8dQd;&rNq@qWm{EV>u<6dGJ5XU!dql$5V=uoS%fAul?ljW7-d6Z{ z{3Yt+nyv8&7jM<}%b7|R&}sevoe!DZjPtf~U^s**SEy@UsJ3--Gfn|<%P;*);!yHwRiNB1kMEN2d-?5$j=^Z**E zY`iOGPq4QYwwD1Vd5wf(iln8yg*5UvgySAeEy`an(*K})RjqR*d%MFsjL@=GMjFkY znWXU1Tt5bMOEy=B!IsTc_Y!EAyB3ynHCN0_pi%CMl)VXw&0G-oZsyb#eAH)&fJ3Eq zK7SP-Jpv2kI~A-~Wr_6& zAQaRi^Ukp!YCw6bG8eU6m)6G_OK-|?(a1kXd8kN*GT#%YcDEd<9?u*(o-GiSVENvD zP^~>mtvy8jsNK=sEy2~}>DA**i52#0364)UH-~}uFx@hATHZ;a%Z-s%hr$f+xUrJ5 z1!5u@!~z*M%MfA_8N~dg-Y`Qb2Oc3=NTx&uC6oHVfd8oDvdhM^V(FH2S~W>>UnEq^}-DLOrfW-;2vsV>1ukyq0-yt9}?X zTUScF5wi1bB1_A2JL$11*&wF7dl-grA|k9S#wfH`}V* zAD+`Fy|>ePy#KlV^M3JX)2kR6gK1jZ9nyR4SLG5$^Q`9iwUpFZWXa|dQsNN@^&HYM z*5JWNU7*_|?=dw4Jiz9CBP_?1`cMwK8J1;YZ`<7Sv!P$)tAX-d!)Rtf+^e0yFPXXi z$?vWM8obc1b!1@U@~gcAwhj2jEiK7caVA1{+bA>TW9(d$gxrn7NL%%V#c9!`P)I$C z?v*709Y7AD(lU?`(~geH(ZC_0_tMJw%Jc*rq>*otYnH~sF%d+TT_%p*ppIZGSjUiJ zG-|dRFIsJHXfi;mly-`ggYu$-?a$mA&-HsbV_z~*1WZ|_kYk;g(vl_33bwEM1dix5 z*0r;CDpFrZmK)_X2l)isiW=S&ZOo86I$CfQeS;R3gyZCkdqgpK1?p=5ecBGcXJA)c?>3s0L!8yBNiV_ZU~THj zPjk6>an_YowpQduThX=S_ge&C20L!oO4(>{?(NqeVlZ)QJbT3g>Z{n7?K#z=K({t+ zZV{{?H<}FCr)WS=z513$7VkDJ=ru;lYN%S=>9sYi7d9oIPt4bCUQ>+Nm6)!aR)Rq#^}!6vxhjBin1d^c}`S&wkY=`|LU-!UxtCqF$|2c)f55cx*ANb^66$ z)B}H!0|Ej>1`#1Ao9a%5rXo)COcNWmUn^RWdyOit5pc+`pEOtShr3r#J1LQ8e|mme zLHhZH>t=HzHlsG(s{epxUDmy3M(^Y<7ITP?g3ZX#x8)Oz~*@c=Ab&M~4t@m|Q~U7KNSk5H-5tZKS>A z*21lZwnFvgj-9vasFA|*4p;8XS4aHDd8VJQzNRP=)!HCPf6fV!_cKOv>!gZB_OVxm zsXYD|b1M6zd>pYnIBlXO4?CoSeH58lJR-PyE#uC$Vi z=|nr`a`TBiC^hQy_S@WSTQDm8yuD0|2c6y6f5(L@vYm@TZ`iGvvNud>pLML0jE3?q zB@eX_NHosHsA2mw$C7&jds}=cbbf-%tEf!tb62k0R$q;*kvi6i+r!P{K}~OGFLK4t zPN(u98y+;`!hJqH-+P&2xl>cGe%+JZ%gtM(#yq(xJgB>D$Yc(jlEs6jw0Y3}VC1xi z-bm}-ahW>l_fZR1(b;S4FPC^%a(8nThpe(5T4P6Mc#sMY8i=w=sZ+?^ywCY?p?<7k zuCgQg#s5vX$Fny5o56>42Qin&R&3XJ}_MXRpjqzLf9i z=a7*zXe@o%PEw=1d4ci5YuSuU>iKK|)$H~RYDBhxo)!8FfdNria(*lZWP(StqW^3j z63-64*JW?EcQ1L*cFf_leqox5L8lnX-Qjq;NjNz}IG#PJCf*}*b5e}#;Wgudk`Dd+DboC6_aefc~ zG6dsHrced4*j4~o4Foo^lsC@DBAPf(dDFKf@4I!(bvh)6nvHEMPK%|dFY0JInf)M3 z(0K7_8X?OR{_d)xb-Ttd=`eX7QL#y(`HbMU)CgYFfY9QsIB?RdDN>WjiX-i01Yx{rpSj z+oh{^zS$$+n$MY(`4D1w+^qP`@@BX5PTjGM_I8BWM^_=ltG2Uk*T{XwdlBO($%=sH8Dglj@stKdn99M+yA_catkH znf8Mg<4Y($`lC5FVk}jDAImvdH@L$tJCe+CTTj%;2uoev;$Xh7mW@6tO;w7OyJU8u zt~KBB@T<+U@32Qca1-#|`Luaaqq*mA9e*Sq9#CD!eKOq^6P{abYEv~dJa${%dbdl; zSxdcu99@n%`puYy)4uKnr)4$m&E-;8Cpeg^BVsWQ{x&gvcS|8mt?`G;1GYuBf;*bm zP@c9d!9bV@)5i&nbk&fB3|DkUlQ>gIm4O#(Tw;vK08j^pJ72fx<{Ibh^K}Wr>KRN& z%_Gh4d_I2)WG_uej%6sjvm2S@WOacWfXVDl8uLuO1e)QHoaX@#zlG!)SdsFSa?X7X z&iv6KG{RfTIxI(tU0*MpiP25b0GJIA9eamEI&S&=$2`I*gsr+vF#!jA-DqJIEhQEl z7|e*d$luDdGt!bSRCTs#HeRvoy!d4Ql93dSZ+2C#^+$AiO+}_iEPd~MkrcVKT6Hu+ zpBhLlkV}yZS(9r=AG0&sWCS@ovJ)-R3W;mt5zJV-UM-Kj1l=dba_6;nn3wjecucTk zeS@GEk+dL=LS3nA26xQRIk;ZbM7piinf^tgpJ7=TbY0fyGj=yAbXrBP3k^z#^DZCX3(OJf(|p!XU5by1U^t3E;K=e zPiMT!4^Cn2jGB(vuDQGCW9t`%KKJ_*`N>*`oAC2G(0o_IS*eur=1LEp}6Dl0lfn;PXoRfSwk;dHrW z(Jc1q3qQQ#`-`1ij}0&9dh=<6J83WOU}vXk-Htp+j?x6)FvfoanwE#Yi!GmhF#PTO zB`%(&TPKnScMh<66~FZJpct1~s%q1rRQ?;HxR^_I?E6u`N$R2eFv}WU&Q4wa^4hc1 zcw+Nd!{$qww7Of|ZN9_Viq?%YJ89jf;A)SZYBw}+6+ietIj8>homY;|^@(13b4RVI z`0dmL_#P2lj9~Bdky+rQ-wkjvXNt(a>D>FCn~HL5(!tGqWRQDCH;fcVAMt#8cz@7g zZi3S%G`F4xpR0EH`s3`&8X?fAK#9(ds@Ah>Z1k2#MJlJRCTW}d4chNb$tkTYbv!!P zU%Tnl)41Rk&%~=oOZ!9;LsXAyh{mQ-sH(9ct39)wdLvX!>x}1nX1`$Pjmc6We~c+P znzN1p`Jo?D#4~Ck6gvLrjF)t3IL^E{;e~E2{qAxz0BrUp+00%7J_>VY8W<_)_GTEqp`i*1F+5;L7j`}NIj7T1f!)(sN#xMPVbY@s)!h`d`X#x!2d zwCbn6Nl}|%N@d=eU?&c~xmHnGx(Qg6$jF=E<_p1tI|M$yNm*OkBgowOuAeyXOTTl^ zor$b@WkFC+81p!VR=i*$_sWb*sdoEZkKk2qJ@!q;hL5ecc@Sr&VH}+G2J9vImi9}& zo@v6jl|tT_!BW$LkK*Tb3hp1>iP^Hub&tIJ{!PZ8Ol0_7>T-f9JRr9gZtstgu!Yf(SGZo;y$D|Aw;974W0S)nL%B0 zj2tCPj*`7n9XL6}!xWATduhmOax#7^N26Z&3<$vmtSo?5Z9#Tx&(CwCe;Iwvec_Dv zJAy^!R8ig02zR_y7Cn!}A{i@U8*tL~!B>AucGe+_3C6z@8*s{}=wx-7_^?E}(4&mZ z40JV|5}CnqJNv!-y4;)x&Fgxo5r;NQHLh$OqvWrBV;Aw8uAnT`tsB`f-JWTmWnAg;1RjK4mO9Z+8%EO} z-ft}X*!6`wW5ZPq+0;iLb(wT*cbuKwO?yk>L63m%l9;go=zvX+!x?=)hzK+_;s5(;WGI3qO7PePwpuILE#hX zMOUazWG87UD0l3|g3yoL(~48zYrbgY zK@SVCqafk0cHuq?(XT5GZk$Vha~C^lU-|tUc)m(Nc<=-emNsJuz1!R{xV_z|KP$B} zCA;Vvr?fbB?fT+NF;NP?iz;5(4$f{PgW0{LI5WwEW^s`J30kRA>YF<@lMZ*|}5*52~xUI5!Ty2wrLOcrH++)USJx zzlQ}S_KpdNB@VDIU}pw+&?LiV(sBCM>@2wETVJ3n^`hwAjNNx=K!FOs9`y!C8-a?o z&^~t6eY;vjb8-PthH-E;>{8mqOZa~NbjtpQT{g3t1CHDiYk1HgkWCl$(xmn-b6JO4 zX8~jP(Ddald>za^ zh8;oEX6+S+!usES=>%~y9eiZA;9@$s_?Zp6!5uA_jZox4(%Wa1?o7;1(z?CC?d3p^ z(r)sgPN}xCkL5gQ6%bYhfd`5Cl=7g>ic@k}u11KC`k%i-M8{mf!lE4=>eZVM(uVC2 zaYBooYgV1xn{q!Si1B=6>6=Azhx?A($I6)+92P8Nj^`9j6i{lW9hcZ`qnt?UcNb0UVPzgp^Qc3M0o@5<&Gsr!vWB>~f8lE^Mx%-hsgynMAsp zQv(Mq_XX0ffKhc=STCFboK_AXU~1uf`YOn$;g>;#%3-skVWg+Q$jc{b+KQeg{K+jz zh-mSVURrEojF)=aMdVpm6v~UGif)wi%V3!-20bc>N~)zvQ`oFbCDq)q>2&PG+*xq#ovc)t-R73nyD|`c#suN)+~;`||Wf zP|Nn*xPY8kTOrj;*64P~0tAz#my6pEFvW$obwD+ltaOp<+bb51j&6Ts<1D|)^qXppTs z(^iLqQ_)h6mLLnOGmDWWOk!6IMJgkUC?{0kZUK@`4=W3GG)ajM%ma9k6s>zNa5#kk zzSTG0mgwio0b{84<3YP4c+k~M%5(V#h=A zfSVM!T-;!dgoeQvM0JIzn$%jcm?ZE33*c%_)lqhHy>KYd^gLD;354h7o}=I5E}YY_ z;a3wdx{SOq5P+8=zkrOk4<>rLz(@Zw@0mzR6a_^=hGrt;JIxv-P=3Z)ZW%2~#Z5NK z49Zn=NpzD9y2;M%F#}A#9vq!l{-^5C1b3xR3SCF4fXq0`&2AZFD28gEod}*2C|&8u zVdKRTe0~b*Bl}Ri5O}4uXh1bsq2J-rP&t9KsYxzm6*VHqG@B73L)EjPhSv*9p<$lx zd!i2~`~PY~RK1SmL>x50a1I-`VygO`x2Jem8RQ(ae{mLLZ2=WDm)lTXf#goZ(~c_c zG@dWLGP`1vtx(QUw!_uk00{~89c9P21b`WZuAQax^?v9{rU%IN46ltcsQPjnrDq{ut7$+>61b-2tJmj4-UA-+K`0eT=yf^W*KG?5f3$cmLg0=yrxUg-Cx2iYgHP6HCeS|nZMvJ_;_ z(6g#t>xFocp&ExiQ!fx_rFx2zQ7^EB5NEBLga@hnw#O-t)AtxlQeCr_SfQb&uX6e~ z68J6^M9nT(5{9j>JNkFDt%?JZaL2c@%^kC(EkL2?HC2y@SywNJN6M)~nF=TrtT7dQ zjWKM_3CzY>6eDyQ$zXy>N=)(k<{Ii9um|lRkx)Rt-8b0+lh9=p05@a2)UG)PyqW;N z`d$0G(Z6Uvv5{E64w)8Bq~oqWyo^e_tl^YrzLaI39h+}@J1?VdYq*c;lZvff1$X@H zS0mFt?+QAWA(BKHu)^HgbUPv=6P;kX2IM&6e{ntsrQ2pPAl$~jx71yS<9!+zm8rRpFb5yR}AmTH!N|@M45hjvkS-4N&5ADI`RsTL{A<(Y>rLu%$JF ze9rDdYltd2L24^dCF3O^1#Fg}+MyAyQdVKPY_=WjqrM9S$rlI^mo+O>gh?Wzm z=$g!ltw65@;4LvW@nlFQ5?F@TeB`hda*XY9UB#Lc^m@Z0yYzfZq1P*=YwcgGcq1VH z#q7{fryl)j(r;}f8s*0Gbp_N8*N8o5Q+18jyp`y&c$(27%ifu9y027G&FHb5i3LT< z=^1Q4(f_IUN&|tP@4@5_U}RvrkS{G@DOOVYa_8g@pb_h+wk->(w#|t3eH-j{vX9sb zU1Dz_Z6NwEMH5+ZcrCmt5Z5}!R$xXD5Sus)@LcGoE$Fa6inl-M#Gm!V;AKnuqZQ0A zJ1(xu_w5s$xIw$OPog`ZVEqB3r^$V1I9K&^7DpDJu@4GwE+oi7u4(a&wg}_2lg9J2 z=EpZ!0CBa0-;XF?plVz_+$MmOvsks!6 z4!cZY<$d6%gpMvlZCq2!sOeGPIVsIwrAXQtgAGjq4$tAN`oHr(#M9=$mjKzVp!fqX zXCbwnVe2JeOF3falvxW|-nkfnyAxh7beFxsE;#$O@q*W8cs+D7Q*;SlHJU*|Lm7=r z%o$cda6kCfpNW>gj%9*E=KAOGuDj;rVQEE;VL}fXU>;BCulTU(T|OZ`AYZ(ad{s+H zdc{?0a-S+wM9zX_ZY(T77Y0>532%K{!O%?stoiYs#*5iq8Pbax(Y8W0AfO1q9t{`} z$rc5yO9%vYa43fFVROc# z1dX}e0avGfhpYSL9#VV8))l>v^=Q7Rl0W|8dcpi1Epgh_^emm~Jd{a7N&$9ZUxjlH zkdItCradZ|UDAXHks0Hu2Q>B6pW={n=${c9lh_drg2Rai+7oeK&}A=1c+gR-9v4{}KO=XXHgC2k z7iYac>zRP(Tji*0uV{7H*+9D)gK_lq8%6F3?b3w=MsnWgg?k^_G^M`B&wy)ud2BP& z-S|GXhg@i3(PuemqG!oC@*;}|rRdV$iX?3znn*5sAQFf7arTrwwzliTMfB6g4>5bb zm{O9{(a>xI!^5i<+K5ihs8#hs_?rU$itp#X`@8?~le1I=N=%7nv6z{+F|;{rkAY2y{XzmnlVJq4En zFCAk>KEP@URi!M(!3+^cneoi*Q>Nz9Bg3{;lp}tG>)B>K?2T!vtQE!MEV&me4n5|B z<6ML1z&;oMIXZT07EbO1iKa^BT+jw?SbS@@O{Zrz$j+|Td{y3^>v{(FK`Fx)Ri+Ml zEywH1Zuu6P$KSSp=Io#$L-z5XTKmBbck813G-%A2?>whr5cP~QepWYiVqaakHK_tu zHQQI9TA;aPKm$9u!mNnyOzaAGY*7#(c3lL`PnPDOMFuHBFhe~IL6Snzps=n_Itc?M z(GM}{=F1ioPqt33sni>O8lLq#&O%@^LBi)vX6gJ{mNANb|R))?7ivn2;EFTYDM+(p#F54 zA^l$E?eWo<2k_&-tYScH`j^=EJM#MejJSAgv&VF+RDJ(0;i0Jr;Gj5suY~!%yY*OF zae=66Q6};XF(@?WsA02|@uC!v2^djWA#nC93|M2hh}>%h=djYsjBtSEEl_<_9Z)t? z72$(P1RPE1RB1S1B;zfljHN)Rfpx6H7=-~B z-GDRe0uNFez;f^J0eNI-0D}j;q1F`se(b}Macjel*$)}l4U)@VbJLi&_ZzSem0t=| z{G|9nGfJ$iUHMo5W{{zuj{HQRPsbJesAqw`v&HemE;>Z8G=)ivPBR$466s!pWYkc;)?K?M=BeHw{BjYm}OVofq<^`}>Yu0A>8 z|6$ybok)+{0a8ofH<7Gs1!q-D-h32%^|(a7bw4NTfTp1jE1IqwkS&*2-I~jRKz?z# zxye`@qz3}^AO#mZ3(R_c@v!lH1=QDsj2@WXJPaC{G#Jr#AfG|Q1GzJDz(;`GLF6il zC}_My5cm(f=8$?(!C##P_{J3gT-T$uv_N8C-)Sw9g!;Xip}N)!q!hL!H#tfsI*g$g z-DF0=s}SP;lQ1GxCqk=w={Xw5gK!+5$+Lr{u9Mna(|&A5>agBTZHZT8i7 zj0MFfy>oYb-+&^g!5!Mff-lkz!)1ZgXXg{|_@55BochRd?NV&n`H_aGd;7cMkRvFm z<4V_R01G1nipg3sa7kG`9SLZ5GL*>_%v8_F1QITeFNTVX<81}ml;Yb=QG&UtmmuRV zFwqxfd<)G4=~-0u*YUmcK6UlIwE3IQfjq$UviHY z0gV6>O@IM$n3dU~X2pn=Y-F=>(*vgX$t-sENjL#y0-Ie)=>VBva|lQ^9#lXFntw@_ zVD};c(1QdLR%j%BD?MO6pvlO3<~YF;AWE1Zi%pD8z69iWQuxo||Gy<@mfxQT5~e$K zy=vSG)b?Sesg&!-mVuZMklJW7x3s0Oi}a;*vE#`vFK*nsm^F1-q5s5CYt&h5T;;6j zbSoa-%L=o`)y)b{w+7;_hgDK&tEsjmP-l(1P7888-lPj12hx`;O*}O$|h3l zSHdI^BqMYv0l&%4f@W6uB75%I}OAvWFr8{_h)|#-=wf05+uKksChU6`n;_l z05(=SnSo|8DA5l=zNjk$ge~@KP)?}&1%adTt5P4<0ftl4BpxpFy&iIzjcBErV@G#7 zWSx(CHkQy)H?`b*b1bdrX1?~4)GK`hfh*>F6=Hh1o~ds)3`*^rwC&zS`yD$@Ex!+p z^5xLUn%6uC-oLENu{-uDeebgi$TOs2bNbj*5x4_+3ljQCilE*of${>4uEYj_cS2BJ zP$o!qgaLmm&|pp{Lmvvt-i`Q9_q=_U#`gI!EL7fEG-~Kl9+mdDBBsLcbM<)}ueaXH zQoJpF{;&b2TI)r*_W7hEtMWapHObupdABRfRgb0R8tse^$SE{lh%u#_0!9|yNMaZB zjRpdp3&3~CqaHGV3^&1)Mkr*4>S(4?x!1<(|Iz>lGLCE;x_{ERV1e`7mt^XE7B=YezwtIi^v^ft-YcHH+ za)(TON>MR3;nq}hf5nPDrZs^7^! zlCwH_B$7ku>*f$DAV+F=b3W*Iaz~G4kpQUft3o%XV5LAJ~AW)(mNx zERaA8>yrRqEX3r~XmltZ5H||}aU&S>uOtZ4Fkz$wZXO5$>(YQjl0wR%&YuT+#;}w9 z#m@fgOc!yxc_#egHnf9i1vOzpiWz~LfGZx6#_CTtBbL(QQx$SL4iB! zWkE$kIowvz&lKf{18W0N&(o1m5|h{f+$wk=Ll!!gbRA=HOPm&@0_;#!=Lio{EaE|J zrrZE&%b$0SE`FVQwUH}-d?C2si2rFuBnsGmQ=<}AY5yakkuk7taN0DmjD4Em-&>3AqEz|@E@?>Q%3>{kx8&XNrF8I;8j8v zM>jUg?Y#!%x*9&=Z+X#IL%y>SiK(BTz}A>QnRH^TZ-LOxCmZO>fo%sLAfuG3mOE0M zx%)-mIoz|r28|V;Sn}wpV%f;1&yy#H+O~A~RZPr*8Gn&Gf9{0;&NpK6F0_}}IR<^f z#JM4jvVbe*85LOME5{5!$qFITb#r)4hgcQ>JFsUxi~_==Tam7tsv}A=LG6ht(v=9( zBe48~*p(Qv+!Cy)KmZH%GgTK%Ls_ z)eG8?g+=oPLYAJyft(H`b3{6HAWH%O78nA-QeA=SN&<=AYLUwtaMrS#1V~pTu+)qH z%2EYRUNBCJY^E;-e$^F5$poAd%MytB6zpjQfRp-(eE)ArkNLMc>t@gTV*9H>{(;UM zR^|@(OoED)Qh(j_2yISE!)1~7;ELi>W}xf^j>)sZwvU+G9Wf_^zu9Va^OBDkPDjP> zpbiWBUi~98&4EjfTreb}bZjb=r2FN|b^Fm%-Oj0$K2 zl5`#S!){_9`$6Qc;Tzi&WU7|o0(^HkU zCOERB0dFC_`>GFTBRw=*V3id{i6sY7dd;m_^&m+BsCTesI4?Edf>$QPYd=yfs)w%;Ts z9}mIS3yU`%YUd{@{DZJ~-L3#PECn>cE!pa3eGg;7!zFVXKa5i z%`oggvsvLMuH3MxTmJEw^yb@OKP{0t%dFt-4YlJzaja^@fk|{@3$4aR&^W z7rH;yh(A^M)UX8w7Oen!p`3m)TVN?mE`|+OXyA<~&0!%6iH#D#B?BS=#!8elAk2sH zdoS>yEoK1AGlkH6fCS2W z-vClnx!J49Qy+}O3EmcomC!|J$(atWX-VH8cNq_QO5#4}L7ztXEEHf>zOhh;v6556 z(r@REV!2@nS%q1HD~dMD(yA&!rn4Il3)y>L@62O%&Vb+t|09&yNI||(Lm#87Y5ms$ zx8P7ThMbC^2JYR1zsS9-*v*ky7F1bl>gZ7bd@#ex@s5`s2)Qx%3J49nFu=XQIe!%_ zaL|BafTgVk=b|cxa1;hB^T080Am#MfF0q~ai?%OcbXgCgx~o_0wyrQ;Yu(_eNVmvR zz3z7DY-&kCpuHN_q%o(uOI?85Co5ajaE>sy?-a}PRMxP)iyE!wqx+_^Wu#6PH|T_i z(cmoY6|K#I8z5zP^j`mYm6x}Imp=9nXGE#qlSpn|sx|U@w(MEuYhtE~P^xQle7k1Y z(ZLauL64k^NzF!9HFRiJpk_!cE z>x`1r(`SOYSGd?A!52rP(voqCFW-(14gieCR3FZe} z{$N)gXO|&;bsZ?T;2~19zb(co+TZ?_t&o-#W|f^shzw@@X!BIEJV?)=01tL*h4dr?LFlUlf@iazNe(iYvv%z_Trlj*p)u;RU_CRY04E zo~qIx>I~YmK!X>Z_EK>!r9|RqB_6Z%H%y&p1Rz$f!6^{2=0E9-nhihVGSD_wmq|<4$Y)| z=b@g*scLhFu~iNR!KMBmP#de7D$sD?aoKh#95^01E1;l%L?Yma1Oae>@#0f}Gr+n` zzLT=zdnXt&I!E3DK@dRI4(zm8!TsA({#+A1pf9x1MJ|{}sh?wb(Bj$T!EWrJE)SYF z+W=y3;i=6}`S=UQV6^~8*UEyCo~c(_h-3ppohgXEjgGe!=x&HJ$3biHvVYn65Z*{I zo3Hmc_Ab?Sn@!cV&w>i#s};L7uU%6dUI}xAJ3x#^ID3Ydb?Ysg3yzu-&%N1HIZK+R z%>{wT#*~=;R7ws%K3~%O$|1v6-0%H69ZmB0I?w0y$eY@AWm_2J%YyojI#c4HMBc-E zGmX1+=wyywYbJj!g*n_>L&;<|@hvqoq4XXTKL(iD0m5kpUTzG1neL-SXEt9PB!1odM2jx4Dw=!OT^Ci3Jyx$AC#?zy z*eyLVUGPZ9cu`k4KPGyBb>40uVR=e)O9ifj4|L&O!p&5WNS9=M!@KW5_r=tFXBzB6 zb`@w|XalXT20)kyATHdow#BqN+h;9DJj!FKYf^%7M-P}Wn}X91o*AQ7fp?49kah3%vLjir<9yh)gC&4@+)04WWC zcAIt+3okUkQA|q!aO?tLWnW{xV5mC(QJ+M?L56(fB%<0m%X)FX+du93Q$m*etH zS2)*O^*mG0(LYbxB^E`dWUVM}+I4Q~g%s>*JdgyOz^_s0cSqV#8P_d!yb`n<=j=>w zo^-o1}u6oeqS)2E|Y7f@`i)Y zDzGD^Sb6_*noelAjAPXb;dAZ&nOY6jjt@ zx;F%4EPlcZfH4e{EAv%R&2WbF4Qj<+32z(#0J|i0A+750yRWY0v!65e9Ie~vzfvIg z{|yCl5tp1?TlrOiG=EZ{my^b{3Tfc9y|JTv99w_GhANs|SaR#>&aayD>aM~*x$c0% zZJoMm3i}LQ$#IdKE9?4=kt*^nPQuRd_D;f(y&nN%^)QVJookXZqnyo$bYtVkGC2S5Nm!#;-$@@7QDpW+Uv>cC|{H=uF!0~xi-7FYJUSj5$oIE-Q< z6Ar%~XMD)HoxbP!lfGb$oZ}Hv9vwCYu8r5;<~!ex^UJYmrR%(><2>wN2R-v;FJdu3 zV`uLsbFu%#4ULwa!S- zhuIubA~Ro={U){Z!6ossugJXQM%_eI+-60oSraQdMH=No_R;KHU>4=A zsrzqQKq;C{e~skX*sfFpNpc>S+9`Jz!Twm5*^=InL|CPAz!#6~OHJpm}Ck zaW;Gzc1Up!a;)`Jo5`R(DpL)fS}^mp3@9twy#XgZwEYD?_xv9g`GmoF@@FGl?Qe4~ zFS*?i9r>IHtfD^R@QDSA!`pVyUfRsbv{VJYh$(m+i}Hj4#7dLfTggH*b$J|8wz>WXk?r!s4;BWjzrj3Y;ECZ z-%VTF>F5)WVuoI^_hKJy2kW¥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 literal 0 HcmV?d00001 diff --git a/screenshots/specularMap.JPG b/screenshots/specularMap.JPG new file mode 100644 index 0000000000000000000000000000000000000000..7c2ec6e1af69fe96b683a66e17cae466ce57384e GIT binary patch literal 28150 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 literal 0 HcmV?d00001 diff --git a/shared32/glm/glm/core/func_integer.hpp b/shared32/glm/glm/core/func_integer.hpp index 4ee932c..3ef953d 100644 --- a/shared32/glm/glm/core/func_integer.hpp +++ b/shared32/glm/glm/core/func_integer.hpp @@ -70,7 +70,7 @@ namespace glm //! returning them in the least significant bits of the result. //! For unsigned data types, the most significant bits of the //! result will be set to zero. For signed data types, the - //! most significant bits will be set to the value of bit offset + base – 1. + //! most significant bits will be set to the value of bit offset + base ?1. //! //! If bits is zero, the result will be zero. The result will be //! undefined if offset or bits is negative, or if the sum of @@ -87,7 +87,7 @@ namespace glm //! Returns the insertion the bits least-significant bits of insert into base. //! //! The result will have bits [offset, offset + bits - 1] taken - //! from bits [0, bits – 1] of insert, and all other bits taken + //! from bits [0, bits ?1] of insert, and all other bits taken //! directly from the corresponding bits of base. If bits is //! zero, the result will simply be base. The result will be //! undefined if offset or bits is negative, or if the sum of From 207bc1844039b3e406f7d4144335d5042e5517a1 Mon Sep 17 00:00:00 2001 From: Yuqin Shao Date: Fri, 15 Nov 2013 15:09:59 -0500 Subject: [PATCH 6/7] Update README.md --- README.md | 163 +++++------------------------------------------------- 1 file changed, 15 insertions(+), 148 deletions(-) diff --git a/README.md b/README.md index f22c764..ef07539 100644 --- a/README.md +++ b/README.md @@ -1,173 +1,40 @@ ------------------------------------------------------------------------------- CIS565: Project 6: Deferred Shader ------------------------------------------------------------------------------- -Fall 2013 +Yuqin Shao ------------------------------------------------------------------------------- -Due Friday 11/15/2013 -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- -NOTE: -------------------------------------------------------------------------------- -This project requires any graphics card with support for a modern OpenGL -pipeline. Any AMD, NVIDIA, or Intel card from the past few years should work -fine, and every machine in the SIG Lab and Moore 100 is capable of running -this project. - -------------------------------------------------------------------------------- -INTRODUCTION: -------------------------------------------------------------------------------- -In this project, you will get introduced to the basics of deferred shading. You will write GLSL and OpenGL code to perform various tasks in a deferred lighting pipeline such as creating and writing to a G-Buffer. - -------------------------------------------------------------------------------- -CONTENTS: -------------------------------------------------------------------------------- -The Project6 root directory contains the following subdirectories: - -* base/ - * PROJ_WIN/ contains the vs2010 project files - * PROJ_NIX/ contains makefile for building (tested on ubuntu 12.04 LTS) - * res/ contains resources including shader source and obj files - * src/ contains the c++ code for the project along with SOIL and tiny_obj_loader -* shared32/ contains freeglut, glm, and glew. - ---- -BASE CODE TOUR ---- - -Most of your edits will be confined to the various fragment shader programs and main.cpp. - -Some methods worth exploring are: - -[initShader](https://github.com/CIS565-Fall-2013/Project6-DeferredShader/blob/master/base/src/main.cpp#L223): -This method initializes each shader program from specified source files. Note that the source name is declared inside a `#ifdef WIN32` guard block. This is done to reflect the relative directory structure between the linux and windows versions of the code. -[initFBO](https://github.com/CIS565-Fall-2013/Project6-DeferredShader/blob/master/base/src/main.cpp#L360): -This method initializes the framebuffer objects used as render targets for the first and second stage of the pipeline. When you go to add another slot to the G buffer you will need to modify to first FBO accordingly. Try finding all the places where `colorTexture` is used (ctrl+F in windows will be helpful) and look at how textures are created, freed, added to the FBO, and assigned to the appropriate shader programs before adding your own. Also keep in mind that textures can be reused as inputs in other pipeline stages, for instance you might want access to the normals both in the lighting stage and in the post process stage. - -[draw_mesh](https://github.com/CIS565-Fall-2013/Project6-DeferredShader/blob/master/base/src/main.cpp#L574), -[draw_quad](https://github.com/CIS565-Fall-2013/Project6-DeferredShader/blob/master/base/src/main.cpp#L647), -[draw_light](https://github.com/CIS565-Fall-2013/Project6-DeferredShader/blob/master/base/src/main.cpp#L657): -These methods render the scene geometry, viewing quad, and point light quad to the screen. The draw_light method in particular is interesting because it will set up the scissor window for efficient rendering of point lights. - -[display](https://github.com/CIS565-Fall-2013/Project6-DeferredShader/blob/master/base/src/main.cpp#L742): -This is where the graphical work of your program is done. The method is separated into three stages with the majority of work being done in stage 2. - -Stage 1 renders the scene geometry to the G-Buffer -* pass.vert -* pass.frag - -Stage 2 renders the lighting passes and accumulates to the P-Buffer -* shade.vert -* ambient.frag -* point.frag -* diagnostic.frag - -Stage 3 renders the post processing -* post.vert -* post.frag - -[keyboard](https://github.com/CIS565-Fall-2013/Project6-DeferredShader/blob/master/base/src/main.cpp#L870): -This is a good reference for the key mappings in the program. -WASDQZ - Movement -X - Toggle scissor test -R - Reload shaders -1 - View depth -2 - View eye space normals -3 - View Diffuse color -4 - View eye space positions -5 - View lighting debug mode -0 - Standard view ------------------------------------------------------------------------------- -REQUIREMENTS: +Featurues: ------------------------------------------------------------------------------- - -In this project, you are given code for: -* Loading .obj files -* Rendering to a minimal G buffer: - * Depth - * Normal - * Color - * Eye space position -* Rendering simple ambient and directional lighting to texture -* Example post process shader to add a vignette - -You are required to implement: -* Either of the following effects - * Bloom (feel free to use [GPU Gems](http://http.developer.nvidia.com/GPUGems/gpugems_ch21.html) as a rough guide) - * "Toon" Shading (with basic silhouetting) +* Bloom Effects +* Toon Shading * Point light sources -* An additional G buffer slot and some effect showing it off +* Specular map slot added to G buffer +* Separable convolution for bloom effects as well as performance evaluation listed below. -**NOTE**: Implementing separable convolution will require another link in your pipeline and will count as an extra feature if you do performance analysis with a standard one-pass 2D convolution. The overhead of rendering and reading from a texture _may_ offset the extra computations for smaller 2D kernels. - -You must implement two of the following extras: -* The effect you did not choose above -* Screen space ambient occlusion -* Compare performance to a normal forward renderer with - * No optimizations - * Coarse sort geometry front-to-back for early-z - * Z-prepass for early-z -* Optimize g-buffer format, e.g., pack things together, quantize, reconstruct z from normal x and y (because it is normalized), etc. - * Must be accompanied with a performance analysis to count -* Additional lighting and pre/post processing effects! (email first please, if they are good you may add multiple). +[Note] press 6 to show bloom effects, press 7 show toon shading, press 8 show specular map ------------------------------------------------------------------------------- -README +Screen Shots ------------------------------------------------------------------------------- -All students must replace or augment the contents of this Readme.md in a clear -manner with the following: -* A brief description of the project and the specific features you implemented. -* At least one screenshot of your project running. -* A 30 second or longer video of your project running. To create the video you - can use http://www.microsoft.com/expression/products/Encoder4_Overview.aspx -* A performance evaluation (described in detail below). +![Alt test] (screenshots/Bloom_separable.JPG "Bloom Effects" ) -------------------------------------------------------------------------------- -PERFORMANCE EVALUATION -------------------------------------------------------------------------------- -The performance evaluation is where you will investigate how to make your -program more efficient using the skills you've learned in class. You must have -performed at least one experiment on your code to investigate the positive or -negative effects on performance. +![Alt test] (screenshots/ToonShadingWithSilhoutte.JPG "toon shading") -We encourage you to get creative with your tweaks. Consider places in your code -that could be considered bottlenecks and try to improve them. +![Alt test] (screenshots/specular.JPG "specular") -Each student should provide no more than a one page summary of their -optimizations along with tables and or graphs to visually explain any -performance differences. +![Alt test] (screenshots/specularMap.JPG "specular map") -------------------------------------------------------------------------------- -THIRD PARTY CODE POLICY -------------------------------------------------------------------------------- -* Use of any third-party code must be approved by asking on the Google groups. - If it is approved, all students are welcome to use it. Generally, we approve - use of third-party code that is not a core part of the project. For example, - for the ray tracer, we would approve using a third-party library for loading - models, but would not approve copying and pasting a CUDA function for doing - refraction. -* Third-party code must be credited in README.md. -* Using third-party code without its approval, including using another - student's code, is an academic integrity violation, and will result in you - receiving an F for the semester. ------------------------------------------------------------------------------- -SELF-GRADING +PERFORMANCE EVALUATION ------------------------------------------------------------------------------- -* On the submission date, email your grade, on a scale of 0 to 100, to Liam, - liamboone@gmail.com, with a one paragraph explanation. Be concise and - realistic. Recall that we reserve 30 points as a sanity check to adjust your - grade. Your actual grade will be (0.7 * your grade) + (0.3 * our grade). We - hope to only use this in extreme cases when your grade does not realistically - reflect your work - it is either too high or too low. In most cases, we plan - to give you the exact grade you suggest. -* Projects are not weighted evenly, e.g., Project 0 doesn't count as much as - the path tracer. We will determine the weighting at the end of the semester - based on the size of each project. +![Alt test] (screenshots/perform1.png "separable convolution evaluation") +![Alt test] (screenshots/perform2.png "point light radius evaluation") --- SUBMISSION From cf3124acff4ccbaf4cb6742c9e2c31102f5d2b66 Mon Sep 17 00:00:00 2001 From: Yuqin Shao Date: Fri, 15 Nov 2013 15:34:59 -0500 Subject: [PATCH 7/7] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ef07539..2678836 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ CIS565: Project 6: Deferred Shader ------------------------------------------------------------------------------- Yuqin Shao -------------------------------------------------------------------------------- ------------------------------------------------------------------------------- @@ -13,8 +12,10 @@ Featurues: * Point light sources * Specular map slot added to G buffer * Separable convolution for bloom effects as well as performance evaluation listed below. +* [Note] press 6 to show bloom effects, press 7 show toon shading, press 8 show specular map + +A vedio demo could be found here http://youtu.be/BtFBi01tdqA -[Note] press 6 to show bloom effects, press 7 show toon shading, press 8 show specular map ------------------------------------------------------------------------------- Screen Shots