diff --git a/README.md b/README.md
index 919af39..ba3cc84 100644
--- a/README.md
+++ b/README.md
@@ -1,142 +1,83 @@
--------------------------------------------------------------------------------
-CIS565: Project 6: Deferred Shader
--------------------------------------------------------------------------------
-Fall 2013
--------------------------------------------------------------------------------
-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.
-
--------------------------------------------------------------------------------
-REQUIREMENTS:
--------------------------------------------------------------------------------
-
-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)
-* Point light sources
-* An additional G buffer slot and some effect showing it off
-
-**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).
-
--------------------------------------------------------------------------------
-README
--------------------------------------------------------------------------------
-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).
-
--------------------------------------------------------------------------------
-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.
-
-We encourage you to get creative with your tweaks. Consider places in your code
-that could be considered bottlenecks and try to improve them.
-
-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.
-
--------------------------------------------------------------------------------
-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
--------------------------------------------------------------------------------
-* 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.
+# Deferred Shader #
+
+Screen space ambient occlusion
+
+
+Toon Shading
+
+
+Total
+
+
+## Description: ##
+In this project, I implemented separable convolution bloom effect, Toon shading, point light, specular G buffer to display specular highlight and screen space ambient occlusion.
+
+For the bloom effect, instead of doing one pass convolution, I did the two pass separable convolution which has a great speed up. For two pass, I added one more post fragment shader. I also make use of additional specular G buffer to determine which area to bloom. To define which material is effected by bloom effect, user just need to set Ns value to 101 in the .mtl file. I also using Gaussian blur effect for blurring the object.
+
+For Toon shading, I am using sobel matrix to multiply by the 9 different pixel color around current point. Then get the magnitude this pixel, using this magnitude to determine the color of current point. I done this in ambient fragment shader. I also implemented another method which is simply compare the normal of each nearby fragment, if the angle excess a certain value, it define that as a edge.
+
+For specular G buffer, I pass a vec4 value to fragment shader. This vec4 includes specular color and specular intensity. User can specify these values in .mtl file using Ks for specular color and Ns for specular intensity.
+
+I did the SSAO using the poisson sphere which I got from 2012 fall GPU class. I implemented the grid space and world space SSAO. For the world space SSAO, I am using the current fragment to generate a random normal value. Using this random normal to reflect the vec3 of poisson sphere to get a more random position. I am using this position as the direction and make this random point pointing to the same direction of current point normal, which these random point consist of a hemisphere in front of current sample position in world space. After that, using the perspective matrix to get this new random point back to the screen space coordinate to get the ambient occlusion weighted value.
+
+Pree number change display mode.
+
+- 1 Display depth
+- 2 Display normal
+- 3 Display color
+- 4 Display position
+- 5 Display light
+- 6 Display Toon shading
+- 7 Display bloom effect
+- 8 Display SSAO
+- 0 Display total
+
+Here is the video [http://www.youtube.com/watch?v=8hI6cjro1HQ&feature=youtu.be](http://www.youtube.com/watch?v=8hI6cjro1HQ&feature=youtu.be)
+
+## Performance Evaluation: ##
+
+I did performance evaluation on one pass between two pass 2D convolution bloom effect. The two pass convolution has evident boost on frame rate. The most important reason is that the two pass convolution reduce the compute time from nxn to 2n.
+
+
+
+
+
+I also did a evaluation on the number of lights and frame rates. Obviously, the frame rate goes down very quickly when the number of lights increase.
+
+
+
+
+
+
+## Screen Shots ##
+
+
+**Before Bloom Effect**
+
+
+**After Bloom Effect**
+
+
+**Toon Shading**
+
+
+**Screen Space Ambient Occlusion**
+
+
+**With out Specular**
+
+
+**With Specular**
+
+
+## To Do ##
+
+
+- To reduce the artifacts in SSAO
+- To specify more general way for bloom effect
+
----
-SUBMISSION
----
-As with the previous projects, you should fork this project and work inside of
-your fork. Upon completion, commit your finished project back to your fork, and
-make a pull request to the master repository. You should include a README.md
-file in the root directory detailing the following
-
-* A brief description of the project and specific features you implemented
-* At least one screenshot of your project running.
-* A link to a video of your project running.
-* Instructions for building and running your project if they differ from the
- base code.
-* A performance writeup as detailed above.
-* A list of all third-party code used.
-* This Readme file edited as described above in the README section.
---
ACKNOWLEDGEMENTS
diff --git a/SSAOB.png b/SSAOB.png
new file mode 100644
index 0000000..e5a5fc5
Binary files /dev/null and b/SSAOB.png differ
diff --git a/SSAOC.png b/SSAOC.png
new file mode 100644
index 0000000..2c4e38f
Binary files /dev/null and b/SSAOC.png differ
diff --git a/ToonB.png b/ToonB.png
new file mode 100644
index 0000000..907ce75
Binary files /dev/null and b/ToonB.png differ
diff --git a/ToonC.png b/ToonC.png
new file mode 100644
index 0000000..bab4e97
Binary files /dev/null and b/ToonC.png differ
diff --git a/TwopassOnepass.png b/TwopassOnepass.png
new file mode 100644
index 0000000..5ef7615
Binary files /dev/null and b/TwopassOnepass.png differ
diff --git a/after.png b/after.png
new file mode 100644
index 0000000..7faa116
Binary files /dev/null and b/after.png differ
diff --git a/base/PROJ_WIN/P6/P6/P6.vcxproj b/base/PROJ_WIN/P6/P6/P6.vcxproj
index 2d1749c..4b33300 100644
--- a/base/PROJ_WIN/P6/P6/P6.vcxproj
+++ b/base/PROJ_WIN/P6/P6/P6.vcxproj
@@ -49,8 +49,8 @@
true
- ..\..\..\..\shared32\glew\lib;..\..\..\..\shared32\freeglut\lib;%(AdditionalLibraryDirectories)
- freeglut.lib;glew32.lib;%(AdditionalDependencies)
+ ..\..\..\..\shared32\glew\lib;..\..\..\..\shared32\freeglut\lib;..\Debug\;%(AdditionalLibraryDirectories)
+ freeglut.lib;glew32.lib;SOIL.lib;%(AdditionalDependencies)
Console
@@ -66,8 +66,8 @@
true
true
true
- ..\..\..\..\shared32\glew\lib;..\..\..\..\shared32\freeglut\lib;%(AdditionalLibraryDirectories)
- freeglut.lib;glew32.lib;%(AdditionalDependencies)
+ ..\..\..\..\shared32\glew\lib;..\..\..\..\shared32\freeglut\lib;..\Release\;%(AdditionalLibraryDirectories)
+ freeglut.lib;glew32.lib;SOIL.lib;%(AdditionalDependencies)
Console
diff --git a/base/res/P6.exe b/base/res/P6.exe
new file mode 100644
index 0000000..94dc719
Binary files /dev/null and b/base/res/P6.exe differ
diff --git a/base/res/cornell/cornell_box.mtl b/base/res/cornell/cornell_box.mtl
index aae8474..3a6f570 100644
--- a/base/res/cornell/cornell_box.mtl
+++ b/base/res/cornell/cornell_box.mtl
@@ -1,22 +1,36 @@
newmtl white
Ka 0 0 0
Kd 0.9 0.9 0.9
-Ks 0 0 0
+Ks 1 1 1
+Ns 10
+
newmtl red
Ka 0 0 0
Kd 1 0 0
-Ks 0 0 0
+Ks 1 1 1
+Ns 5
+
newmtl green
Ka 0 0 0
Kd 0 1 0
-Ks 0 0 0
+Ks 1 1 1
+Ns 10
+
newmtl blue
Ka 0 0 0
Kd 0 0 1
Ks 0 0 0
+Ns 101
+
+
+newmtl yellow
+Ka 0 0 0
+Kd 1 1 0
+Ks 0 0 0
+Ns 101
newmtl light
Ka 20 20 20
diff --git a/base/res/cornell/cornell_box.obj b/base/res/cornell/cornell_box.obj
index 43e021f..7556960 100644
--- a/base/res/cornell/cornell_box.obj
+++ b/base/res/cornell/cornell_box.obj
@@ -77,7 +77,7 @@ v 556.0 548.8 0.0
f -4 -3 -2 -1
o short_block
-usemtl white
+usemtl blue
v 130.0 165.0 65.0
v 82.0 165.0 225.0
@@ -110,7 +110,7 @@ v 82.0 0.0 225.0
f -4 -3 -2 -1
o tall_block
-usemtl white
+usemtl yellow
v 423.0 330.0 247.0
v 265.0 330.0 296.0
@@ -118,7 +118,7 @@ v 314.0 330.0 456.0
v 472.0 330.0 406.0
f -4 -3 -2 -1
-usemtl white
+usemtl yellow
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/directional.frag b/base/res/directional.frag
similarity index 98%
rename from base/res/shaders/directional.frag
rename to base/res/directional.frag
index a34daab..20a878a 100644
--- a/base/res/shaders/directional.frag
+++ b/base/res/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_Specluartex;
uniform float u_Far;
uniform float u_Near;
@@ -105,6 +106,7 @@ void main() {
float lightRadius = u_Light.w;
float diffuse = max(0.0, dot(normalize(light),normal));
+ //seems no effect
out_Color = vec4(color*u_LightIl*diffuse,1.0f);
}
diff --git a/base/res/shaders/ambient.frag b/base/res/shaders/ambient.frag
index 69b878c..6709834 100644
--- a/base/res/shaders/ambient.frag
+++ b/base/res/shaders/ambient.frag
@@ -4,12 +4,15 @@
// 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_DEPTH 0
+#define DISPLAY_NORMAL 1
+#define DISPLAY_POSITION 2
+#define DISPLAY_COLOR 3
+#define DISPLAY_TOTAL 4
+#define DISPLAY_LIGHTS 5
+#define DISPLAY_TONE 6
+#define DISPLAY_BLOOM 7
+#define DISPLAY_OCCLUSION 8
/////////////////////////////////////
@@ -23,6 +26,7 @@ uniform sampler2D u_Positiontex;
uniform sampler2D u_Colortex;
uniform sampler2D u_RandomNormaltex;
uniform sampler2D u_RandomScalartex;
+uniform sampler2D u_Speculartex;
uniform float u_Far;
uniform float u_Near;
@@ -72,6 +76,11 @@ vec3 sampleCol(vec2 texcoords) {
return texture(u_Colortex,texcoords).xyz;
}
+//Helper function to automicatlly sample and unpack specular
+vec4 sampleSpec(vec2 texcoords) {
+ return texture(u_Speculartex,texcoords).xyzw;
+}
+
//Get a random normal vector given a screen-space texture coordinate
//Actually accesses a texture of random vectors
vec3 getRandomNormal(vec2 texcoords) {
@@ -105,10 +114,63 @@ void main() {
float strength = u_Light.w;
if (lin_depth > 0.99f) {
out_Color = vec4(vec3(0.0), 1.0);
- } else {
+ } else{
float ambient = u_LightIl;
float diffuse = max(0.0, dot(normalize(light),normal));
out_Color = vec4(color*(strength*diffuse + ambient),1.0f);
+
+
+ if(u_DisplayType == DISPLAY_TONE){
+ //Sober filter
+ mat3 GX, GY;
+ GX[0] = vec3(1.0,2.0,1.0);
+ GX[1] = vec3(0.0,0.0,0.0);
+ GX[2] = vec3(-1.0,-2.0,-1.0);
+
+ GY[0] = vec3(1.0,0.0,-1.0);
+ GY[1] = vec3(2.0,0.0,-2.0);
+ GY[2] = vec3(1.0,0.0,-1.0);
+
+ float magX = 0.0;
+ float magY = 0.0;
+
+ for(int i = 0;i < 3; i++){
+ for(int j = 0; j < 3; j++){
+ float mx = (j-1.0) / u_ScreenWidth;
+ float my = (i-1.0) / u_ScreenHeight;
+
+ // vec3 nearNrm = sampleNrm(vec2(fs_Texcoord.s + mx, fs_Texcoord.t + my));
+
+ // float cosValue = dot(normal, nearNrm);
+
+ // if(cosValue < 0.97){
+ // out_Color = vec4(vec3(0.0), 1.0);
+ // return;
+ // }
+ vec2 nearTexcoord = vec2(fs_Texcoord.s + mx, fs_Texcoord.t + my);
+
+ vec3 nearNrm = sampleNrm(nearTexcoord);
+ float nearDiffuse = max(0.0, dot(normalize(light),nearNrm));
+ vec3 nearColor = sampleCol(nearTexcoord);
+ nearColor = nearColor*(strength*nearDiffuse + ambient);
+
+ float c = length(nearColor);
+
+ magX += GX[j][i] * c;
+ magY += GY[j][i] * c;
+ }
+ }
+ float mag = sqrt((magX)*(magX) + (magY)*(magY));
+ mag = clamp(mag, 0.0, 1.0);
+
+ if(mag > 0.1)
+ out_Color = vec4(vec3(0.0), 1.0);
+ else
+ out_Color = out_Color;
+
+ //out_Color = vec4(vec3(out_Color * (mag) * 10.0 + out_Color), 1.0);
+ //out_Color = vec4(color, 1.0);
+ }
}
return;
}
diff --git a/base/res/shaders/diagnostic.frag b/base/res/shaders/diagnostic.frag
index ac73727..6d962b9 100644
--- a/base/res/shaders/diagnostic.frag
+++ b/base/res/shaders/diagnostic.frag
@@ -10,6 +10,9 @@
#define DISPLAY_COLOR 3
#define DISPLAY_TOTAL 4
#define DISPLAY_LIGHTS 5
+#define DISPLAY_TONE 6
+#define DISPLAY_BLOOM 7
+#define DISPLAY_OCCLUSION 8
/////////////////////////////////////
@@ -23,6 +26,7 @@ uniform sampler2D u_Positiontex;
uniform sampler2D u_Colortex;
uniform sampler2D u_RandomNormaltex;
uniform sampler2D u_RandomScalartex;
+uniform sampler2D u_Speculartex;
uniform float u_Far;
uniform float u_Near;
@@ -72,6 +76,11 @@ vec3 sampleCol(vec2 texcoords) {
return texture(u_Colortex,texcoords).xyz;
}
+//Helper function to automicatlly sample and unpack specular
+vec4 sampleSpec(vec2 texcoords) {
+ return texture(u_Speculartex,texcoords).xyzw;
+}
+
//Get a random normal vector given a screen-space texture coordinate
//Actually accesses a texture of random vectors
vec3 getRandomNormal(vec2 texcoords) {
@@ -89,10 +98,152 @@ float getRandomScalar(vec2 texcoords) {
texcoords.t*u_ScreenHeight/sz.y)).r;
}
+//Disk of samples for the SS sampling
+#define NUM_SS_SAMPLES 16
+vec2 poissonDisk[NUM_SS_SAMPLES] = vec2[](
+ vec2( -0.94201624, -0.39906216 ),
+ vec2( 0.94558609, -0.76890725 ),
+ vec2( -0.094184101, -0.92938870 ),
+ vec2( 0.34495938, 0.29387760 ),
+ vec2( -0.91588581, 0.45771432 ),
+ vec2( -0.81544232, -0.87912464 ),
+ vec2( -0.38277543, 0.27676845 ),
+ vec2( 0.97484398, 0.75648379 ),
+ vec2( 0.44323325, -0.97511554 ),
+ vec2( 0.53742981, -0.47373420 ),
+ vec2( -0.26496911, -0.41893023 ),
+ vec2( 0.79197514, 0.19090188 ),
+ vec2( -0.24188840, 0.99706507 ),
+ vec2( -0.81409955, 0.91437590 ),
+ vec2( 0.19984126, 0.78641367 ),
+ vec2( 0.14383161, -0.14100790)
+);
+
+
+#define NUM_WS_SAMPLES 16
+vec3 poissonSphere[NUM_WS_SAMPLES] = vec3[](
+ vec3(0.53812504, 0.18565957, -0.43192),
+ vec3(0.13790712, 0.24864247, 0.44301823),
+ vec3(0.33715037, 0.56794053, -0.005789503),
+ vec3(-0.6999805, -0.04511441, -0.0019965635),
+ vec3(0.06896307, -0.15983082, -0.85477847),
+ vec3(0.056099437, 0.006954967, -0.1843352),
+ vec3(-0.014653638, 0.14027752, 0.0762037),
+ vec3(0.010019933, -0.1924225, -0.034443386),
+ vec3(-0.35775623, -0.5301969, -0.43581226),
+ vec3(-0.3169221, 0.106360726, 0.015860917),
+ vec3(0.010350345, -0.58698344, 0.0046293875),
+ vec3(-0.08972908, -0.49408212, 0.3287904),
+ vec3(0.7119986, -0.0154690035, -0.09183723),
+ vec3(-0.053382345, 0.059675813, -0.5411899),
+ vec3(0.035267662, -0.063188605, 0.54602677),
+ vec3(-0.47761092, 0.2847911, -0.0271716));
+
+
+
+
+#define PI 3.141516
+
+float gatherOcclusion( vec3 pt_normal,
+ vec3 pt_position,
+ vec3 occluder_normal,
+ vec3 occluder_position) {
+
+ if(pt_normal == occluder_normal)
+ return 0.0;
+
+ float dis = length(pt_position - occluder_position);
+ if(dis < falloff)
+ return 0.0;
+
+ vec3 dir = normalize(occluder_position - pt_position) * 1.4;
+ return max(0.0, dot(pt_normal, dir) * 1.0) * (1.0 / (1.0 + dis)) * 2.3;
+}
+
+const float SPHERE_RADIUS = 0.2f;
+float SSAOWorld(float curr_depth, vec3 position, vec3 normal)
+{
+ float occlusion = 0.0f;
+
+ vec3 random = (getRandomNormal(fs_Texcoord));
+ for(int i = 0; i < NUM_WS_SAMPLES; i++)
+ {
+ vec3 dir = (reflect((poissonSphere[i]), random));
+ //vec3 dir = normalize(poissonSphere[i]);
+
+ vec3 ranPos = position + sign(dot(dir, normal)) * dir * SPHERE_RADIUS;
+
+ vec4 screenPos = u_Persp * vec4(ranPos, 1.0);
+ screenPos = screenPos / screenPos.w;
+ screenPos = screenPos / 2.0 + 0.5;
+
+ vec2 newTex = vec2(screenPos.x, screenPos.y);
+ vec3 o_normal = sampleNrm(newTex);
+ vec3 o_position = samplePos(newTex);
+ occlusion += gatherOcclusion(normal, position, o_normal, o_position);
+ }
+
+ return occlusion/16.0;
+}
+
+
+const float SS_RADIUS = 0.02f;
+float SSAOScreen(float curr_depth, vec3 position, vec3 normal)
+{
+ float occlusion = 0.0f;
+
+ for(int i = 0; i < NUM_SS_SAMPLES; i++)
+ {
+ float random = getRandomScalar(vec2(fs_Texcoord.s + float(i) / u_ScreenWidth, fs_Texcoord.t + float(i) / u_ScreenHeight));
+ //float random = getRandomScalar(fs_Texcoord);
+ float ranAngle = random * 2.0 * PI;
+
+ vec2 dir = normalize(vec2(cos(ranAngle), sin(ranAngle)));
+ float r = length(poissonDisk[i]);
+
+ float mx = r * SS_RADIUS;// / u_ScreenWidth;
+ float my = r * SS_RADIUS;// / u_ScreenHeight;
+
+ vec2 newTex = vec2(fs_Texcoord.s + mx , fs_Texcoord.t + my);
+ //vec2 newTex = vec2(fs_Texcoord + poissonDisk[i] * SS_RADIUS);
+ vec3 o_normal = sampleNrm(newTex);
+ vec3 o_position = samplePos(newTex);
+ occlusion += gatherOcclusion(normal, position, o_normal, o_position);
+ //}
+ }
+ return occlusion/16.0;
+}
+
+
+const float REGULAR_SAMPLE_STEP = 0.012f;
+float SSAOGird(float curr_depth, vec3 position, vec3 normal)
+{
+ float occlusion = 0.0f;
+
+ for(float i = -2; i <= 2.0; i+=1.0)
+ {
+ for(float j = -2; j <= 2.0; j+=1.0)
+ {
+ if(i == 0.0 || j == 0.0)
+ continue;
+ float mx = i * REGULAR_SAMPLE_STEP;
+ float my = j * REGULAR_SAMPLE_STEP;
+ vec2 newTex = vec2(fs_Texcoord.s + mx, fs_Texcoord.t + my);
+
+ vec3 o_normal = sampleNrm(newTex);
+ vec3 o_position = samplePos(newTex);
+ occlusion += gatherOcclusion(normal, position, o_normal, o_position);
+ }
+ }
+
+ return occlusion/16.0;
+}
+
+
///////////////////////////////////
// MAIN
//////////////////////////////////
-const float occlusion_strength = 1.5f;
+float occlusion_strength = 1.5f;
void main() {
float exp_depth = texture(u_Depthtex, fs_Texcoord).r;
@@ -104,9 +255,11 @@ void main() {
vec3 light = u_Light.xyz;
float lightRadius = u_Light.w;
+ float occlusion = 0.0f;
+
switch (u_DisplayType) {
case(DISPLAY_DEPTH):
- out_Color = vec4(vec3(lin_depth),1.0f);
+ out_Color = vec4(vec3(lin_depth),1.0f);
break;
case(DISPLAY_NORMAL):
out_Color = vec4(abs(normal),1.0f);
@@ -117,7 +270,15 @@ void main() {
case(DISPLAY_COLOR):
out_Color = vec4(color, 1.0);
break;
- case(DISPLAY_LIGHTS):
+ case(DISPLAY_OCCLUSION):
+ //occlusion = SSAOScreen(lin_depth, position, normal);
+ occlusion = SSAOWorld(lin_depth, position, normalize(normal));
+ //occlusion = SSAOGird(lin_depth, position, normal);
+ occlusion = clamp(occlusion * occlusion_strength, 0.0, 1.0);
+ out_Color = vec4(vec3(1.0 - occlusion), 1.0);
+ break;
+ case(DISPLAY_LIGHTS):
+ break;
case(DISPLAY_TOTAL):
break;
}
diff --git a/base/res/shaders/pass.frag b/base/res/shaders/pass.frag
index e37dcbf..166c4d8 100644
--- a/base/res/shaders/pass.frag
+++ b/base/res/shaders/pass.frag
@@ -2,6 +2,7 @@
uniform float u_Far;
uniform vec3 u_Color;
+uniform vec4 u_Specular;
in vec3 fs_Normal;
in vec4 fs_Position;
@@ -9,10 +10,12 @@ in vec4 fs_Position;
out vec4 out_Normal;
out vec4 out_Position;
out vec4 out_Color;
+out vec4 out_Specular;
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,1.0);//get the color
+ out_Specular = vec4(u_Specular);//get the specular
}
diff --git a/base/res/shaders/point.frag b/base/res/shaders/point.frag
index 98b90e0..615f1ee 100644
--- a/base/res/shaders/point.frag
+++ b/base/res/shaders/point.frag
@@ -10,6 +10,7 @@
#define DISPLAY_COLOR 3
#define DISPLAY_TOTAL 4
#define DISPLAY_LIGHTS 5
+#define DISPLAY_TONE 6
/////////////////////////////////////
@@ -23,6 +24,7 @@ uniform sampler2D u_Positiontex;
uniform sampler2D u_Colortex;
uniform sampler2D u_RandomNormaltex;
uniform sampler2D u_RandomScalartex;
+uniform sampler2D u_Speculartex;
uniform float u_Far;
uniform float u_Near;
@@ -71,6 +73,11 @@ vec3 sampleCol(vec2 texcoords) {
return texture(u_Colortex,texcoords).xyz;
}
+//Helper function to automicatlly sample and unpack specular
+vec4 sampleSpec(vec2 texcoords) {
+ return texture(u_Speculartex,texcoords).xyzw;
+}
+
//Get a random normal vector given a screen-space texture coordinate
//Actually accesses a texture of random vectors
vec3 getRandomNormal(vec2 texcoords) {
@@ -102,13 +109,54 @@ 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);
+ //out_Color = vec4(0,0,0,1.0);
+
+ //vec4 posWorld = u_Persp * vec4(position, 1.0);
+ //vec4 lightWorld = u_Persp * vec4(light, 1.0);
+
if( u_DisplayType == DISPLAY_LIGHTS )
{
+ //out_Color = vec4(0,0,0,1.0);
+ float diffuse = max(dot(normal, normalize(light - position)),0.0);
+ out_Color = vec4(diffuse * vec3(0.2,0.2,0.8), 0.2);
//Put some code here to visualize the fragment associated with this point light
}
else
{
+ if(length(position - light) <= lightRadius){
+ float diffuse = max(dot(normal, normalize(light - position)),0.0);
+
+ //For sepcular color
+ vec4 specular = sampleSpec(fs_Texcoord);
+ vec3 viewDirection = normalize(position - vec3(0.0));
+ vec3 lightDirecion = normalize(light - position);
+ vec3 specularColor;
+ if (dot(normal, lightDirecion) < 0.0)
+ {
+ //angle betweeen light dir and normal is too large
+ specularColor = vec3(0.0);
+ }
+ else{
+ specularColor = vec3(specular.xyz) * pow(max(0.0, dot(reflect(lightDirecion, normal), viewDirection)), specular.w);
+ }
+
+
+ out_Color = vec4(color * diffuse * 0.5 + specularColor * 0.7, 1.0);
+
+ //out_Color = vec4(color * diffuse * 0.5, 1.0);
+
+ //Tone shading
+ if(u_DisplayType == DISPLAY_TONE){
+ if(diffuse > 0.85)
+ out_Color = vec4(1.0 * color, 1.0);
+ else if(diffuse > 0.65)
+ out_Color = vec4(0.7 * color, 1.0);
+ else if(diffuse > 0.45)
+ out_Color = vec4(0.5 * color, 1.0);
+ else if(diffuse > 0.0)
+ out_Color = vec4(0.2 * color, 1.0);
+ }
+ }
//Put some code here to actually compute the light from the point light
}
return;
diff --git a/base/res/shaders/post.frag b/base/res/shaders/post.frag
index 2bf5afc..482f6ae 100644
--- a/base/res/shaders/post.frag
+++ b/base/res/shaders/post.frag
@@ -10,21 +10,30 @@
#define DISPLAY_COLOR 3
#define DISPLAY_TOTAL 4
#define DISPLAY_LIGHTS 5
+#define DISPLAY_TONE 6
+#define DISPLAY_BLOOM 7
/////////////////////////////////////
// Uniforms, Attributes, and Outputs
////////////////////////////////////
uniform sampler2D u_Posttex;
+uniform sampler2D u_Speculartex;
+uniform sampler2D u_Positiontex;
uniform sampler2D u_RandomNormaltex;
uniform sampler2D u_RandomScalartex;
+
uniform int u_ScreenWidth;
uniform int u_ScreenHeight;
+uniform int u_DisplayType;
+
in vec2 fs_Texcoord;
out vec4 out_Color;
+
+uniform vec4 u_Light;
///////////////////////////////////////
@@ -43,6 +52,16 @@ vec3 sampleCol(vec2 texcoords) {
return texture(u_Posttex,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 specular
+vec4 sampleSpec(vec2 texcoords) {
+ return texture(u_Speculartex,texcoords).xyzw;
+}
+
//Get a random normal vector given a screen-space texture coordinate
//Actually accesses a texture of random vectors
vec3 getRandomNormal(vec2 texcoords) {
@@ -65,10 +84,41 @@ float getRandomScalar(vec2 texcoords) {
//////////////////////////////////
const float occlusion_strength = 1.5f;
void main() {
- 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);
+ vec3 color = sampleCol(fs_Texcoord);
+ vec4 specular = sampleSpec(fs_Texcoord);
+ vec3 position = samplePos(fs_Texcoord);
+ vec3 light = u_Light.xyz;
+ float lightRadius = u_Light.w;
+
+ if(u_DisplayType == DISPLAY_BLOOM){
+ //if(length(position - light) <= lightRadius){
+ if(specular.w == 101){
+ vec3 c = vec3(0.0);
+ int range = 20;
+ int count = 0;
+ for(int i = -range; i < range; i++)
+ {
+ float sd = 6.0;
+ float mx = float(i) / u_ScreenWidth;
+ vec4 nearspe = sampleSpec(vec2(fs_Texcoord.s + mx, fs_Texcoord.t));
+ //if(nearspe.w == 101){
+ c += sampleCol(vec2(fs_Texcoord.s + mx, fs_Texcoord.t)) * ((1.0 / (2.0 * 3.141516 * sd * sd) * exp(-(i*i)/(2.0*sd*sd)))) * 1000.0;
+
+ // }
+ // else
+ /// c += color * ((1.0 / (2.0 * 3.141516 * sd * sd) * exp(-(i*i)/(2.0*sd*sd)))) * 1000.0;
+ }
+ c /= 2.0 * range;
+ out_Color = vec4(c , 1.0);
+ }
+ else
+ out_Color = vec4(color , 1.0);
+ }
+ else{
+ out_Color = vec4(color , 1.0);
+ }
return;
}
+
+
\ No newline at end of file
diff --git a/base/res/shaders/post2.frag b/base/res/shaders/post2.frag
new file mode 100644
index 0000000..2d9f537
--- /dev/null
+++ b/base/res/shaders/post2.frag
@@ -0,0 +1,156 @@
+#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_TONE 6
+#define DISPLAY_BLOOM 7
+#define DISPLAY_OCCLUSION 8
+
+
+/////////////////////////////////////
+// Uniforms, Attributes, and Outputs
+////////////////////////////////////
+uniform sampler2D u_Posttex;
+uniform sampler2D u_Speculartex;
+uniform sampler2D u_Positiontex;
+uniform sampler2D u_Normaltex;
+uniform sampler2D u_RandomNormaltex;
+uniform sampler2D u_RandomScalartex;
+
+uniform int u_ScreenWidth;
+uniform int u_ScreenHeight;
+
+uniform int u_DisplayType;
+
+in vec2 fs_Texcoord;
+
+out vec4 out_Color;
+uniform vec4 u_Light;
+///////////////////////////////////////
+
+
+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_Posttex,texcoords).xyz;
+}
+
+//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 specular
+vec4 sampleSpec(vec2 texcoords) {
+ return texture(u_Speculartex,texcoords).xyzw;
+}
+
+
+//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;
+}
+
+///////////////////////////////////
+// MAIN
+//////////////////////////////////
+const float occlusion_strength = 1.5f;
+void main() {
+ vec3 color = sampleCol(fs_Texcoord);
+ vec4 specular = sampleSpec(fs_Texcoord);
+ vec3 position = samplePos(fs_Texcoord);
+ vec3 light = u_Light.xyz;
+ float lightRadius = u_Light.w;
+
+ vec3 normal = sampleNrm(fs_Texcoord);
+
+
+ if(u_DisplayType == DISPLAY_BLOOM)
+ {
+ if(specular.w == 101)
+ {
+ vec3 c = vec3(0.0);
+ int range = 20;
+ int count = 0;
+ for(int i = -range; i < range; i++)
+ {
+ float sd = 6.0;
+ float my = float(i) / u_ScreenHeight;
+ vec4 nearspe = sampleSpec(vec2(fs_Texcoord.s, fs_Texcoord.t+my));
+ //if(nearspe.w == 101){
+ c += sampleCol(vec2(fs_Texcoord.s, fs_Texcoord.t+my)) * (1.0 / (2.0 * 3.141516 * sd * sd) * exp(- (i*i)/(2.0*sd*sd))) * 1000.0;
+ // count++;
+ //}
+ //else
+ // c += color * (1.0 / (2.0 * 3.141516 * sd * sd) * exp(- (i*i)/(2.0*sd*sd))) * 1000.0;
+ }
+ c /= 2.0 * range;
+ out_Color = vec4(c , 1.0);
+ }
+ else
+ {
+ out_Color = vec4(color , 1.0);
+ }
+ }
+ else if(u_DisplayType == DISPLAY_OCCLUSION)
+ {
+ int range = 2;
+ vec3 c = vec3(0.0);
+ for(int i = -range; i < range; i++)
+ {
+ for(int j = -range; j < range; j++)
+ {
+ float mx = float(i) / u_ScreenWidth;
+ float my = float(j) / u_ScreenHeight;
+ c += sampleCol(vec2(fs_Texcoord.s+mx, fs_Texcoord.t+my));
+ }
+ }
+ range *= 2;
+ c /= range * range;
+ out_Color = vec4(c , 1.0);
+ }
+ else{
+ 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(color , 1.0);
+ }
+
+
+ //out_Color = vec4(mix(pow(color,vec3(1.0/1.8)),vec3(gray),vin), 1.0);
+ //out_Color = vec4(vec3(color), 1.0);
+
+ return;
+}
+
diff --git a/base/res/sphere/sphere.bmp b/base/res/sphere/sphere.bmp
new file mode 100644
index 0000000..be60011
Binary files /dev/null and b/base/res/sphere/sphere.bmp differ
diff --git a/base/res/sphere/sphere.mtl b/base/res/sphere/sphere.mtl
new file mode 100644
index 0000000..b5fa8fc
--- /dev/null
+++ b/base/res/sphere/sphere.mtl
@@ -0,0 +1,10 @@
+newmtl Default_Smoothing
+Ka 0 0 0
+Kd 0.784314 0.784314 0.784314
+Ks 0.2 0.2 0.2
+Ni 1
+Ns 5
+Tf 1 1 1
+d 1
+map_Kd sphere.bmp
+
diff --git a/base/res/sphere/sphere.obj b/base/res/sphere/sphere.obj
new file mode 100644
index 0000000..e3cb8a0
--- /dev/null
+++ b/base/res/sphere/sphere.obj
@@ -0,0 +1,1834 @@
+mtllib sphere.mtl
+v -1 0 1.40385e-007
+v -0.983024 -0.156077 0.0964607
+v -0.983024 0.156077 -0.0964604
+v -0.978148 -0.185961 -0.0929805
+v -0.978148 0 0.207911
+v -0.978148 0 -0.207911
+v -0.978148 0.185961 0.0929807
+v -0.939205 -0.343331 0.00428931
+v -0.939205 -0.157379 0.305166
+v -0.939205 0.157379 -0.305166
+v -0.939205 0.343331 -0.00428905
+v -0.934172 -0.187593 -0.303531
+v -0.934172 0.187593 0.303531
+v -0.93267 -0.306855 0.189647
+v -0.93267 0.306855 -0.189647
+v -0.913545 -0.363797 -0.181898
+v -0.913545 0 0.406737
+v -0.913545 0 -0.406737
+v -0.913545 0.363797 0.181899
+v -0.866018 -0.490334 0.0979075
+v -0.866018 -0.306855 0.394783
+v -0.866018 0.306855 -0.394782
+v -0.866018 0.490334 -0.0979072
+v -0.851981 -0.516806 -0.0839041
+v -0.851981 -0.156077 0.499769
+v -0.851981 0.156077 -0.499768
+v -0.851981 0.516806 0.0839044
+v -0.850651 -0.447214 0.276393
+v -0.850651 0.447214 -0.276393
+v -0.845991 -0.363797 -0.389809
+v -0.845991 -0.185961 -0.499718
+v -0.845991 0.185961 0.499718
+v -0.845991 0.363797 0.38981
+v -0.809017 -0.525731 -0.262865
+v -0.809017 0 0.587785
+v -0.809017 0 -0.587785
+v -0.809017 0.525731 0.262866
+v -0.762354 -0.644208 0.0617517
+v -0.762354 -0.343331 0.548581
+v -0.762354 0.343331 -0.548581
+v -0.762354 0.644208 -0.0617515
+v -0.758172 -0.60373 0.246345
+v -0.758172 -0.490334 0.429824
+v -0.758172 0.490334 -0.429824
+v -0.758172 0.60373 -0.246345
+v -0.757312 -0.343331 -0.555521
+v -0.757311 0.343331 0.555521
+v -0.738585 -0.516806 -0.432902
+v -0.738585 -0.156077 -0.655845
+v -0.738585 0.156077 0.655845
+v -0.738585 0.516806 0.432902
+v -0.736686 -0.664689 -0.124433
+v -0.736686 0.185961 -0.650164
+v -0.736685 -0.185961 0.650164
+v -0.736685 0.664689 0.124433
+v -0.669131 -0.664689 -0.332344
+v -0.669131 0 0.743144
+v -0.669131 0 -0.743144
+v -0.669131 0.664689 0.332344
+v -0.653054 -0.644208 0.398142
+v -0.653054 0.644208 -0.398142
+v -0.643075 -0.490334 -0.588241
+v -0.643075 -0.306855 -0.701637
+v -0.643075 0.306855 0.701637
+v -0.643075 0.490334 0.588241
+v -0.639949 -0.739749 0.207932
+v -0.639949 -0.516806 0.568662
+v -0.639949 0.516806 -0.568662
+v -0.639949 0.739749 -0.207932
+v -0.632156 -0.774597 0.0194389
+v -0.632156 -0.363797 0.684127
+v -0.632156 0.363797 -0.684127
+v -0.632156 0.774597 -0.0194387
+v -0.580461 -0.644208 -0.498058
+v -0.580461 -0.157379 -0.798935
+v -0.58046 0.157379 0.798935
+v -0.58046 0.644208 0.498058
+v -0.57735 -0.794654 -0.187592
+v -0.57735 -0.187593 0.794655
+v -0.57735 0.187593 -0.794654
+v -0.57735 0.794654 0.187593
+v -0.525731 -0.447214 -0.723607
+v -0.525731 0.447214 0.723607
+v -0.522851 -0.774597 0.355846
+v -0.522851 -0.664689 0.533682
+v -0.522851 0.664689 -0.533681
+v -0.522851 0.774597 -0.355846
+v -0.5 -0.850651 0.16246
+v -0.5 -0.525731 0.688191
+v -0.5 0.525731 -0.688191
+v -0.5 0.850651 -0.16246
+v -0.499999 -0.774597 -0.387298
+v -0.499999 0 0.866026
+v -0.499999 0 -0.866026
+v -0.499999 0.774597 0.387299
+v -0.468576 -0.60373 -0.644939
+v -0.468576 -0.306855 -0.828418
+v -0.468576 0.306855 0.828418
+v -0.468576 0.60373 0.644939
+v -0.455297 -0.889527 -0.0380263
+v -0.455297 -0.363797 0.812623
+v -0.455297 0.363797 -0.812623
+v -0.455297 0.889527 0.0380264
+v -0.395511 -0.739749 -0.544373
+v -0.395511 -0.156077 -0.905103
+v -0.39551 0.156077 0.905103
+v -0.39551 0.739749 0.544373
+v -0.390694 -0.889527 -0.236853
+v -0.390694 -0.185961 0.901541
+v -0.390694 0.185961 -0.901541
+v -0.390694 0.889527 0.236853
+v -0.36073 -0.490334 -0.793377
+v -0.36073 0.490334 0.793377
+v -0.356822 -0.794654 0.491123
+v -0.356822 0.794655 -0.491123
+v -0.345991 -0.889527 0.298381
+v -0.345991 -0.664689 0.662178
+v -0.345991 0.664689 -0.662178
+v -0.345991 0.889527 -0.298381
+v -0.343074 -0.93267 0.111472
+v -0.343074 -0.516806 0.784354
+v -0.343074 0.516806 -0.784354
+v -0.343074 0.93267 -0.111472
+v -0.309017 -0.850651 -0.425325
+v -0.309017 0 0.951057
+v -0.309017 0 -0.951056
+v -0.309017 0.850651 0.425325
+v -0.29431 -0.644208 -0.705959
+v -0.29431 -0.343331 -0.891911
+v -0.294309 0.343331 0.891911
+v -0.294309 0.644208 0.705959
+v -0.286151 -0.953663 -0.092976
+v -0.286151 -0.343331 0.894562
+v -0.286151 0.343331 -0.894562
+v -0.286151 0.953663 0.0929761
+v -0.213835 -0.774597 -0.595209
+v -0.213835 -0.185961 -0.959006
+v -0.213834 0.185961 0.959006
+v -0.213834 0.774597 0.595209
+v -0.212032 -0.93267 -0.291836
+v -0.212032 0.156077 -0.964719
+v -0.212032 0.93267 0.291836
+v -0.212031 -0.156077 0.964719
+v -0.183479 -0.516806 -0.83621
+v -0.183479 0.516806 0.83621
+v -0.17686 -0.889527 0.421262
+v -0.17686 -0.774597 0.607223
+v -0.17686 0.774597 -0.607223
+v -0.17686 0.889527 -0.421262
+v -0.176851 -0.953663 0.243415
+v -0.176851 -0.644208 0.744124
+v -0.176851 0.644208 -0.744124
+v -0.176851 0.953663 -0.243415
+v -0.174499 -0.983024 0.0566981
+v -0.174499 -0.490334 0.853887
+v -0.174499 0.490334 -0.853887
+v -0.174499 0.983024 -0.0566981
+v -0.109305 -0.664689 -0.739082
+v -0.109305 -0.363797 -0.925043
+v -0.109305 0.363797 0.925043
+v -0.109305 0.664689 0.739082
+v -0.107846 -0.983024 -0.148438
+v -0.107846 -0.306855 0.945626
+v -0.107846 0.306855 -0.945626
+v -0.107846 0.983024 0.148438
+v -0.104529 -0.889527 -0.444764
+v -0.104529 0 0.994522
+v -0.104529 0 -0.994522
+v -0.104529 0.889527 0.444764
+v -7.96122e-008 -0.525731 -0.850651
+v -5.98336e-008 -0.187593 -0.982247
+v -5.68148e-008 -0.794655 -0.607062
+v -3.18213e-008 0.157379 -0.987538
+v -2.8159e-008 -0.953663 -0.300877
+v 0 -1 -0
+v 0 0.447214 -0.894427
+v 0 0.60373 -0.797189
+v 0 0.739749 -0.672883
+v 0 0.850651 -0.525731
+v 0 0.93267 -0.36073
+v 0 0.983024 -0.183479
+v 0 1 -0
+v 1.71718e-008 -0.983024 0.183479
+v 2.8159e-008 0.953663 0.300877
+v 3.37606e-008 -0.93267 0.36073
+v 4.92031e-008 -0.850651 0.525731
+v 5.68148e-008 0.794654 0.607062
+v 6.29749e-008 -0.739749 0.672883
+v 7.46087e-008 -0.60373 0.797189
+v 7.96122e-008 0.525731 0.850651
+v 8.37093e-008 -0.447214 0.894427
+v 9.19283e-008 0.187593 0.982247
+v 9.24235e-008 -0.157379 0.987538
+v 0.104529 -0.889527 -0.444764
+v 0.104529 0 0.994522
+v 0.104529 0 -0.994522
+v 0.104529 0.889527 0.444764
+v 0.107846 -0.983024 -0.148438
+v 0.107846 -0.306855 0.945626
+v 0.107846 0.306855 -0.945626
+v 0.107846 0.983024 0.148438
+v 0.109305 -0.664689 -0.739082
+v 0.109305 -0.363797 -0.925043
+v 0.109305 0.363797 0.925043
+v 0.109305 0.664689 0.739082
+v 0.174499 -0.983024 0.0566981
+v 0.174499 -0.490334 0.853887
+v 0.174499 0.490334 -0.853887
+v 0.174499 0.983024 -0.0566981
+v 0.176851 -0.953663 0.243415
+v 0.176851 -0.644208 0.744124
+v 0.176851 0.644208 -0.744124
+v 0.176851 0.953663 -0.243415
+v 0.17686 -0.889527 0.421262
+v 0.17686 -0.774597 0.607223
+v 0.17686 0.774597 -0.607223
+v 0.17686 0.889527 -0.421262
+v 0.183479 -0.516806 -0.83621
+v 0.183479 0.516806 0.83621
+v 0.212032 -0.93267 -0.291836
+v 0.212032 -0.156077 0.964719
+v 0.212032 0.156077 -0.964719
+v 0.212032 0.93267 0.291836
+v 0.213834 -0.774597 -0.595209
+v 0.213834 -0.185961 -0.959006
+v 0.213834 0.774597 0.595209
+v 0.213835 0.185961 0.959006
+v 0.286151 -0.953663 -0.0929761
+v 0.286151 -0.343331 0.894562
+v 0.286151 0.343331 -0.894562
+v 0.286151 0.953663 0.0929761
+v 0.294309 -0.644208 -0.705959
+v 0.294309 -0.343331 -0.891911
+v 0.29431 0.343331 0.891911
+v 0.29431 0.644208 0.705959
+v 0.309017 -0.850651 -0.425325
+v 0.309017 0 0.951056
+v 0.309017 0 -0.951057
+v 0.309017 0.850651 0.425325
+v 0.343074 -0.93267 0.111472
+v 0.343074 -0.516806 0.784354
+v 0.343074 0.516806 -0.784354
+v 0.343074 0.93267 -0.111472
+v 0.345991 -0.889527 0.298381
+v 0.345991 -0.664689 0.662178
+v 0.345991 0.664689 -0.662178
+v 0.345991 0.889527 -0.298381
+v 0.356822 -0.794654 0.491123
+v 0.356822 0.794654 -0.491123
+v 0.36073 -0.490334 -0.793377
+v 0.36073 0.490334 0.793377
+v 0.390694 -0.889527 -0.236853
+v 0.390694 -0.185961 0.901541
+v 0.390694 0.185961 -0.901541
+v 0.390694 0.889527 0.236853
+v 0.39551 -0.739749 -0.544373
+v 0.39551 -0.156077 -0.905103
+v 0.39551 0.739749 0.544373
+v 0.395511 0.156077 0.905103
+v 0.455297 -0.889527 -0.0380264
+v 0.455297 -0.363797 0.812623
+v 0.455297 0.363797 -0.812623
+v 0.455297 0.889527 0.0380263
+v 0.468576 -0.60373 -0.644939
+v 0.468576 -0.306855 -0.828418
+v 0.468576 0.306855 0.828418
+v 0.468576 0.60373 0.644939
+v 0.499999 -0.774597 -0.387298
+v 0.499999 0 0.866026
+v 0.499999 0 -0.866026
+v 0.499999 0.774597 0.387298
+v 0.5 -0.850651 0.16246
+v 0.5 -0.525731 0.688191
+v 0.5 0.525731 -0.688191
+v 0.5 0.850651 -0.16246
+v 0.522851 -0.774597 0.355846
+v 0.522851 -0.664689 0.533681
+v 0.522851 0.664689 -0.533682
+v 0.522851 0.774597 -0.355846
+v 0.525731 -0.447214 -0.723607
+v 0.525731 0.447214 0.723607
+v 0.57735 -0.794654 -0.187592
+v 0.57735 -0.187593 0.794654
+v 0.57735 0.187593 -0.794654
+v 0.57735 0.794654 0.187592
+v 0.58046 -0.644208 -0.498058
+v 0.58046 -0.157379 -0.798935
+v 0.58046 0.644208 0.498058
+v 0.580461 0.157379 0.798935
+v 0.632156 -0.774597 0.0194388
+v 0.632156 -0.363797 0.684127
+v 0.632156 0.363797 -0.684127
+v 0.632156 0.774597 -0.0194389
+v 0.639949 -0.739749 0.207932
+v 0.639949 -0.516806 0.568662
+v 0.639949 0.516806 -0.568662
+v 0.639949 0.739749 -0.207932
+v 0.643075 -0.490334 -0.588241
+v 0.643075 -0.306855 -0.701637
+v 0.643075 0.306855 0.701637
+v 0.643075 0.490334 0.588241
+v 0.653054 -0.644208 0.398142
+v 0.653054 0.644208 -0.398142
+v 0.669131 -0.664689 -0.332344
+v 0.669131 0 0.743144
+v 0.669131 0 -0.743144
+v 0.669131 0.664689 0.332344
+v 0.736685 -0.664689 -0.124433
+v 0.736686 -0.185961 0.650164
+v 0.736686 0.185961 -0.650164
+v 0.736686 0.664689 0.124433
+v 0.738585 -0.516806 -0.432902
+v 0.738585 -0.156077 -0.655845
+v 0.738585 0.156077 0.655845
+v 0.738585 0.516806 0.432902
+v 0.757311 -0.343331 -0.555521
+v 0.757312 0.343331 0.555521
+v 0.758172 -0.60373 0.246345
+v 0.758172 -0.490334 0.429824
+v 0.758172 0.490334 -0.429824
+v 0.758172 0.60373 -0.246345
+v 0.762354 -0.644208 0.0617515
+v 0.762354 -0.343331 0.548581
+v 0.762354 0.343331 -0.548581
+v 0.762354 0.644208 -0.0617516
+v 0.809017 -0.525731 -0.262866
+v 0.809017 0 0.587785
+v 0.809017 0 -0.587785
+v 0.809017 0.525731 0.262865
+v 0.845991 -0.363797 -0.389809
+v 0.845991 -0.185961 -0.499718
+v 0.845991 0.185961 0.499718
+v 0.845991 0.363797 0.389809
+v 0.850651 -0.447214 0.276393
+v 0.850651 0.447214 -0.276393
+v 0.851981 -0.516806 -0.0839043
+v 0.851981 -0.156077 0.499768
+v 0.851981 0.156077 -0.499769
+v 0.851981 0.516806 0.0839042
+v 0.866018 -0.490334 0.0979073
+v 0.866018 -0.306855 0.394782
+v 0.866018 0.306855 -0.394782
+v 0.866018 0.490334 -0.0979074
+v 0.913545 -0.363797 -0.181898
+v 0.913545 0 0.406737
+v 0.913545 0 -0.406737
+v 0.913545 0.363797 0.181898
+v 0.93267 -0.306855 0.189647
+v 0.93267 0.306855 -0.189647
+v 0.934172 -0.187593 -0.303531
+v 0.934172 0.187593 0.303531
+v 0.939205 -0.343331 0.00428914
+v 0.939205 -0.157379 0.305166
+v 0.939205 0.157379 -0.305166
+v 0.939205 0.343331 -0.00428922
+v 0.978148 -0.185961 -0.0929806
+v 0.978148 0 0.207911
+v 0.978148 0 -0.207911
+v 0.978148 0.185961 0.0929806
+v 0.983024 -0.156077 0.0964605
+v 0.983024 0.156077 -0.0964606
+v 1 0 -4.67949e-008
+vt -0.05 0.0972793
+vt -0.05 0.941264
+vt -0.0156234 0.327121
+vt -0.0150836 0.44046
+vt -0.0132618 0.151034
+vt -0.0128636 0.722813
+vt -0.00489247 0.782047
+vt -0.000726819 0.611555
+vt 2.2343e-008 0.5
+vt 0.000726849 0.388445
+vt 0.0048925 0.217953
+vt 0.0128637 0.277187
+vt 0.0132618 0.848966
+vt 0.0150836 0.55954
+vt 0.0155675 0.450115
+vt 0.0156234 0.672879
+vt 0.0179172 0.336875
+vt 0.0266314 0.731436
+vt 0.0312808 0.61852
+vt 0.0319269 0.400723
+vt 0.0333332 0.5
+vt 0.0499999 0.0587359
+vt 0.05 0.352416
+vt 0.05 0.449696
+vt 0.05 0.234944
+vt 0.05 0.293681
+vt 0.05 0.902721
+vt 0.05 0.560069
+vt 0.05 0.176208
+vt 0.0500001 0.676208
+vt 0.0500001 0.792348
+vt 0.0500002 1
+vt 0.0500002 0.117472
+vt 0.0666667 0.5
+vt 0.0680732 0.400723
+vt 0.0687194 0.61852
+vt 0.0733685 0.731436
+vt 0.0820829 0.336875
+vt 0.0843766 0.672879
+vt 0.0844326 0.450115
+vt 0.0849164 0.55954
+vt 0.0867383 0.848966
+vt 0.0871363 0.277187
+vt 0.0951076 0.217953
+vt 0.0992732 0.388445
+vt 0.1 0.5
+vt 0.100727 0.611555
+vt 0.104893 0.782047
+vt 0.112864 0.722813
+vt 0.113262 0.151034
+vt 0.115084 0.44046
+vt 0.115567 0.549885
+vt 0.115623 0.327121
+vt 0.117917 0.663125
+vt 0.126632 0.268564
+vt 0.131281 0.38148
+vt 0.131927 0.599277
+vt 0.133333 0.5
+vt 0.15 0.882528
+vt 0.15 0.70632
+vt 0.15 0.823792
+vt 0.15 0.207652
+vt 0.15 0
+vt 0.15 0.323792
+vt 0.15 0.765056
+vt 0.15 0.550304
+vt 0.15 0.647584
+vt 0.15 0.439931
+vt 0.15 0.0972794
+vt 0.15 0.941264
+vt 0.166667 0.5
+vt 0.168073 0.599277
+vt 0.168719 0.38148
+vt 0.173369 0.268564
+vt 0.182083 0.663125
+vt 0.184377 0.327121
+vt 0.184433 0.549885
+vt 0.184916 0.44046
+vt 0.186738 0.151034
+vt 0.187136 0.722813
+vt 0.195108 0.782047
+vt 0.199273 0.611555
+vt 0.2 0.5
+vt 0.200727 0.388445
+vt 0.204892 0.217953
+vt 0.212864 0.277187
+vt 0.213262 0.848966
+vt 0.215084 0.55954
+vt 0.215568 0.450115
+vt 0.215623 0.672879
+vt 0.217917 0.336875
+vt 0.226632 0.731436
+vt 0.231281 0.61852
+vt 0.231927 0.400723
+vt 0.233333 0.5
+vt 0.25 0.0587359
+vt 0.25 0.117472
+vt 0.25 0.176208
+vt 0.25 0.234944
+vt 0.25 0.293681
+vt 0.25 0.352416
+vt 0.25 0.449696
+vt 0.25 0.560069
+vt 0.25 0.676208
+vt 0.25 0.792348
+vt 0.25 0.902721
+vt 0.25 1
+vt 0.266667 0.5
+vt 0.268073 0.400723
+vt 0.268719 0.61852
+vt 0.273369 0.731436
+vt 0.282083 0.336875
+vt 0.284377 0.672879
+vt 0.284433 0.450115
+vt 0.284916 0.55954
+vt 0.286738 0.848966
+vt 0.287136 0.277187
+vt 0.295108 0.217953
+vt 0.299273 0.388445
+vt 0.3 0.5
+vt 0.300727 0.611555
+vt 0.304892 0.782047
+vt 0.312864 0.722813
+vt 0.313262 0.151034
+vt 0.315084 0.44046
+vt 0.315568 0.549885
+vt 0.315623 0.327121
+vt 0.317917 0.663125
+vt 0.326631 0.268564
+vt 0.331281 0.38148
+vt 0.331927 0.599277
+vt 0.333333 0.5
+vt 0.35 0.941264
+vt 0.35 0.0972794
+vt 0.35 0.647584
+vt 0.35 0.765056
+vt 0.35 0.323792
+vt 0.35 0
+vt 0.35 0.439931
+vt 0.35 0.207652
+vt 0.35 0.70632
+vt 0.35 0.823792
+vt 0.35 0.550304
+vt 0.35 0.882528
+vt 0.366667 0.5
+vt 0.368073 0.599277
+vt 0.368719 0.38148
+vt 0.373369 0.268564
+vt 0.382083 0.663125
+vt 0.384377 0.327121
+vt 0.384433 0.549885
+vt 0.384916 0.44046
+vt 0.386738 0.151034
+vt 0.387136 0.722813
+vt 0.395108 0.782047
+vt 0.399273 0.611555
+vt 0.4 0.5
+vt 0.400727 0.388445
+vt 0.404892 0.217953
+vt 0.412864 0.277187
+vt 0.413262 0.848966
+vt 0.415084 0.55954
+vt 0.415568 0.450115
+vt 0.415623 0.672879
+vt 0.417917 0.336875
+vt 0.426631 0.731436
+vt 0.431281 0.61852
+vt 0.431927 0.400723
+vt 0.433333 0.5
+vt 0.45 0.117472
+vt 0.45 1
+vt 0.45 0.176208
+vt 0.45 0.293681
+vt 0.45 0.560069
+vt 0.45 0.902721
+vt 0.45 0.234944
+vt 0.45 0.449696
+vt 0.45 0.0587359
+vt 0.45 0.352416
+vt 0.45 0.676208
+vt 0.45 0.792348
+vt 0.466667 0.5
+vt 0.468073 0.400723
+vt 0.468719 0.61852
+vt 0.473369 0.731436
+vt 0.482083 0.336875
+vt 0.484377 0.672879
+vt 0.484433 0.450115
+vt 0.484916 0.55954
+vt 0.486738 0.848966
+vt 0.487136 0.277187
+vt 0.495108 0.217953
+vt 0.499273 0.388445
+vt 0.5 0.5
+vt 0.500727 0.611555
+vt 0.504893 0.782047
+vt 0.512864 0.722813
+vt 0.513262 0.151034
+vt 0.515084 0.44046
+vt 0.515567 0.549885
+vt 0.515623 0.327121
+vt 0.517917 0.663125
+vt 0.526631 0.268564
+vt 0.531281 0.38148
+vt 0.531927 0.599277
+vt 0.533333 0.5
+vt 0.55 0.207652
+vt 0.55 0.550304
+vt 0.55 0.647584
+vt 0.55 0.941264
+vt 0.55 0.0972793
+vt 0.55 0.439931
+vt 0.55 0.706319
+vt 0.55 0.765056
+vt 0.55 0.323792
+vt 0.55 0.823792
+vt 0.55 0
+vt 0.55 0.882528
+vt 0.566667 0.5
+vt 0.568073 0.599277
+vt 0.568719 0.38148
+vt 0.573369 0.268564
+vt 0.582083 0.663125
+vt 0.584377 0.327121
+vt 0.584433 0.549885
+vt 0.584916 0.44046
+vt 0.586738 0.151034
+vt 0.587136 0.722813
+vt 0.595108 0.782047
+vt 0.599273 0.611555
+vt 0.6 0.5
+vt 0.600727 0.388445
+vt 0.604892 0.217953
+vt 0.612864 0.277187
+vt 0.613262 0.848966
+vt 0.615084 0.55954
+vt 0.615567 0.450115
+vt 0.615623 0.672879
+vt 0.617917 0.336875
+vt 0.626631 0.731436
+vt 0.631281 0.61852
+vt 0.631927 0.400723
+vt 0.633333 0.5
+vt 0.65 0.117472
+vt 0.65 0.176208
+vt 0.65 0.29368
+vt 0.65 0.792348
+vt 0.65 0.560069
+vt 0.65 0.676208
+vt 0.65 1
+vt 0.65 0.234944
+vt 0.65 0.352416
+vt 0.65 0.449696
+vt 0.65 0.902721
+vt 0.65 0.058736
+vt 0.666667 0.5
+vt 0.668073 0.400723
+vt 0.668719 0.61852
+vt 0.673369 0.731436
+vt 0.682083 0.336875
+vt 0.684377 0.672879
+vt 0.684433 0.450115
+vt 0.684916 0.55954
+vt 0.686738 0.848966
+vt 0.687136 0.277187
+vt 0.695108 0.217953
+vt 0.699273 0.388445
+vt 0.7 0.5
+vt 0.700727 0.611555
+vt 0.704892 0.782047
+vt 0.712864 0.722813
+vt 0.713262 0.151034
+vt 0.715084 0.44046
+vt 0.715567 0.549885
+vt 0.715623 0.327121
+vt 0.717917 0.663125
+vt 0.726632 0.268564
+vt 0.731281 0.38148
+vt 0.731927 0.599277
+vt 0.733333 0.5
+vt 0.75 0
+vt 0.75 0.0972794
+vt 0.75 0.207652
+vt 0.75 0.323792
+vt 0.75 0.439931
+vt 0.75 0.550304
+vt 0.75 0.647584
+vt 0.75 0.706319
+vt 0.75 0.765056
+vt 0.75 0.823792
+vt 0.75 0.882528
+vt 0.75 0.941264
+vt 0.766667 0.5
+vt 0.768073 0.599277
+vt 0.768719 0.38148
+vt 0.773368 0.268564
+vt 0.782083 0.663125
+vt 0.784377 0.327121
+vt 0.784433 0.549885
+vt 0.784917 0.44046
+vt 0.786738 0.151034
+vt 0.787136 0.722813
+vt 0.795108 0.782047
+vt 0.799273 0.611555
+vt 0.8 0.5
+vt 0.800727 0.388445
+vt 0.804893 0.217953
+vt 0.812864 0.277187
+vt 0.813262 0.848966
+vt 0.815084 0.55954
+vt 0.815568 0.450115
+vt 0.815623 0.672879
+vt 0.817917 0.336875
+vt 0.826631 0.731436
+vt 0.831281 0.61852
+vt 0.831927 0.400723
+vt 0.833333 0.5
+vt 0.85 0.058736
+vt 0.85 0.902721
+vt 0.85 0.352416
+vt 0.85 0.560069
+vt 0.85 0.676208
+vt 0.85 1
+vt 0.85 0.176208
+vt 0.85 0.29368
+vt 0.85 0.449696
+vt 0.85 0.792348
+vt 0.85 0.234944
+vt 0.85 0.117472
+vt 0.866667 0.5
+vt 0.868073 0.400723
+vt 0.868719 0.61852
+vt 0.873369 0.731436
+vt 0.882083 0.336875
+vt 0.884377 0.672879
+vt 0.884433 0.450115
+vt 0.884916 0.55954
+vt 0.886738 0.848966
+vt 0.887136 0.277187
+vt 0.895108 0.217953
+vt 0.899273 0.388445
+vt 0.9 0.5
+vt 0.900727 0.611555
+vt 0.904892 0.782047
+vt 0.912864 0.722813
+vt 0.913262 0.151034
+vt 0.915084 0.44046
+vt 0.915568 0.549885
+vt 0.915623 0.327121
+vt 0.917917 0.663125
+vt 0.926631 0.268564
+vt 0.931281 0.38148
+vt 0.931927 0.599277
+vt 0.933333 0.5
+vt 0.95 0
+vt 0.95 0.882528
+vt 0.95 0.823792
+vt 0.95 0.439931
+vt 0.95 0.706319
+vt 0.95 0.765056
+vt 0.95 0.0972793
+vt 0.95 0.550304
+vt 0.95 0.647584
+vt 0.95 0.941264
+vt 0.95 0.207652
+vt 0.95 0.323792
+vt 0.966667 0.5
+vt 0.968073 0.599277
+vt 0.968719 0.38148
+vt 0.973369 0.268564
+vt 0.982083 0.663125
+vt 0.984377 0.327121
+vt 0.984433 0.549885
+vt 0.984916 0.44046
+vt 0.986738 0.151034
+vt 0.987136 0.722813
+vt 0.995108 0.782047
+vt 0.999273 0.611555
+vt 1 0.5
+vt 1.00073 0.388445
+vt 1.00489 0.217953
+vt 1.01286 0.277187
+vt 1.01326 0.848966
+vt 1.01508 0.55954
+vt 1.01562 0.672879
+vt 1.05 0.0587359
+vt 1.05 0.902721
+vn -1 1.00021e-008 4.62596e-008
+vn -0.981591 -0.162468 0.100411
+vn -0.981591 0.162468 -0.100411
+vn -0.978376 -0.180943 -0.100195
+vn -0.978376 0.180943 0.100195
+vn -0.978376 -0.00869708 -0.206649
+vn -0.978376 0.0086971 0.20665
+vn -0.939218 -0.157292 0.30517
+vn -0.939218 -0.343297 0.00421013
+vn -0.939218 0.343297 -0.0042102
+vn -0.939218 0.157293 -0.305171
+vn -0.934172 0.187592 0.303531
+vn -0.934172 -0.187593 -0.303531
+vn -0.929022 -0.314761 0.194533
+vn -0.929022 0.314761 -0.194533
+vn -0.912988 0.360941 0.190194
+vn -0.912988 0.00869702 0.407893
+vn -0.912988 -0.360942 -0.190194
+vn -0.912988 -0.00869627 -0.407893
+vn -0.865939 0.31476 -0.388685
+vn -0.865939 -0.31476 0.388684
+vn -0.865939 -0.488415 0.107705
+vn -0.865939 0.488415 -0.107705
+vn -0.853145 0.162466 -0.49573
+vn -0.853145 -0.516052 -0.0763834
+vn -0.853144 -0.162466 0.495732
+vn -0.853144 0.516053 0.0763836
+vn -0.850652 0.447212 -0.276392
+vn -0.850652 -0.447213 0.276392
+vn -0.850417 -0.180942 -0.494015
+vn -0.850417 -0.360941 -0.382769
+vn -0.850416 0.180942 0.494016
+vn -0.850416 0.360941 0.382772
+vn -0.809018 -0.52573 -0.262865
+vn -0.809017 2.413e-007 -0.587785
+vn -0.809017 0.525732 0.262865
+vn -0.809017 -4.85101e-007 0.587786
+vn -0.763866 0.488416 -0.421851
+vn -0.763866 -0.488417 0.421851
+vn -0.763865 0.595742 -0.248195
+vn -0.763865 -0.595742 0.248195
+vn -0.762317 0.343296 -0.548653
+vn -0.762317 -0.644257 0.0616893
+vn -0.762317 0.644257 -0.0616879
+vn -0.762316 -0.343296 0.548655
+vn -0.757369 -0.343296 -0.555464
+vn -0.757368 0.343296 0.555465
+vn -0.735105 -0.516054 -0.439669
+vn -0.735104 -0.162466 -0.658199
+vn -0.735104 0.162467 0.6582
+vn -0.735104 0.516054 0.439671
+vn -0.73263 -0.667785 -0.131592
+vn -0.73263 0.180943 -0.656135
+vn -0.73263 -0.180942 0.656135
+vn -0.73263 0.667785 0.131592
+vn -0.670058 -0.00869553 0.742258
+vn -0.670058 0.00869665 -0.742258
+vn -0.670057 0.667785 0.324169
+vn -0.670057 -0.667786 -0.324169
+vn -0.652987 -0.644257 0.398171
+vn -0.652987 0.644257 -0.398172
+vn -0.645311 -0.734582 0.209674
+vn -0.645311 0.734582 -0.209674
+vn -0.645311 -0.516052 0.563262
+vn -0.64531 0.516053 -0.563262
+vn -0.637252 0.488417 0.59612
+vn -0.637252 0.31476 0.703446
+vn -0.637251 -0.488416 -0.596121
+vn -0.637251 -0.31476 -0.703447
+vn -0.62683 -0.360942 0.690511
+vn -0.62683 0.77903 -0.0140296
+vn -0.626829 -0.779031 0.0140304
+vn -0.626829 0.360942 -0.690512
+vn -0.580469 -0.157292 -0.798946
+vn -0.580468 0.157292 0.798947
+vn -0.580468 -0.644257 -0.497986
+vn -0.580467 0.644257 0.497987
+vn -0.57735 -0.187593 0.794654
+vn -0.57735 0.794655 0.187592
+vn -0.57735 0.187593 -0.794655
+vn -0.577349 -0.794656 -0.187593
+vn -0.525731 -0.447214 -0.723607
+vn -0.525731 0.447214 0.723607
+vn -0.515363 0.667784 -0.537089
+vn -0.515363 0.77903 -0.35709
+vn -0.515363 -0.667785 0.537089
+vn -0.515362 -0.77903 0.35709
+vn -0.500001 0.52573 -0.688191
+vn -0.5 -0.525729 0.688192
+vn -0.5 0.850651 -0.16246
+vn -0.5 -0.850651 0.16246
+vn -0.49887 -0.00869475 0.866633
+vn -0.49887 0.00869757 -0.866633
+vn -0.498869 -0.77903 -0.379791
+vn -0.498869 0.77903 0.379793
+vn -0.472095 -0.31476 -0.823439
+vn -0.472095 -0.595742 -0.649783
+vn -0.472095 0.314759 0.82344
+vn -0.472095 0.595743 0.649782
+vn -0.463014 0.360941 -0.80953
+vn -0.463014 -0.885484 -0.0391978
+vn -0.463014 0.885484 0.0391977
+vn -0.463013 -0.360942 0.80953
+vn -0.398825 -0.734582 -0.548934
+vn -0.398824 0.162469 0.90252
+vn -0.398824 0.734581 0.548935
+vn -0.398824 -0.162467 -0.902521
+vn -0.397626 -0.885484 -0.240441
+vn -0.397626 0.180943 -0.89953
+vn -0.397625 0.885484 0.240441
+vn -0.397625 -0.180944 0.89953
+vn -0.370023 -0.488416 -0.790274
+vn -0.370022 0.488416 0.790274
+vn -0.356821 0.794655 -0.491122
+vn -0.356821 -0.794656 0.491122
+vn -0.351546 0.667784 -0.656109
+vn -0.351546 -0.885484 0.303865
+vn -0.351546 0.885484 -0.303863
+vn -0.351546 -0.667785 0.656109
+vn -0.336281 -0.935402 0.109265
+vn -0.336281 -0.516052 0.787785
+vn -0.336281 0.516052 -0.787785
+vn -0.336281 0.935402 -0.109265
+vn -0.309017 -0.850651 -0.425325
+vn -0.309017 6.87643e-008 -0.951056
+vn -0.309017 4.8135e-007 0.951057
+vn -0.309017 0.850651 0.425326
+vn -0.29424 -0.644257 -0.705943
+vn -0.294239 0.644258 0.705943
+vn -0.294238 -0.343295 -0.891948
+vn -0.294238 0.343295 0.891949
+vn -0.286232 -0.953636 -0.0930024
+vn -0.286232 0.953636 0.0930024
+vn -0.286231 0.343296 -0.89455
+vn -0.286231 -0.343296 0.89455
+vn -0.207833 -0.935402 -0.286058
+vn -0.207833 0.935402 0.286058
+vn -0.207833 0.162468 -0.964577
+vn -0.207832 -0.162469 0.964577
+vn -0.207046 -0.77903 -0.591814
+vn -0.207046 -0.180943 -0.961453
+vn -0.207045 0.77903 0.591814
+vn -0.207045 0.180944 0.961453
+vn -0.190993 0.516052 0.834992
+vn -0.190992 -0.516052 -0.834992
+vn -0.180359 -0.885484 0.42824
+vn -0.180358 -0.779031 0.600485
+vn -0.180358 0.885484 -0.428239
+vn -0.180357 0.77903 -0.600486
+vn -0.176901 0.953636 -0.243484
+vn -0.176901 -0.953636 0.243484
+vn -0.1769 0.644256 -0.74407
+vn -0.1769 -0.644256 0.74407
+vn -0.165158 -0.984806 0.0536629
+vn -0.165158 0.984806 -0.0536629
+vn -0.165157 0.488415 -0.856839
+vn -0.165157 -0.488415 0.856839
+vn -0.105801 -0.00869593 -0.994349
+vn -0.105801 -0.885484 -0.452464
+vn -0.1058 0.885484 0.452465
+vn -0.1058 0.0086958 0.994349
+vn -0.102073 -0.984806 -0.140492
+vn -0.102073 0.984806 0.140492
+vn -0.102072 -0.31476 0.943667
+vn -0.102071 0.31476 -0.943667
+vn -0.101246 0.360941 0.927077
+vn -0.101246 -0.667784 -0.737437
+vn -0.101245 0.667785 0.737436
+vn -0.101245 -0.360941 -0.927077
+vn -1.38907e-007 0.187592 0.982247
+vn -1.37495e-007 -0.157294 0.987552
+vn -2.50052e-008 -0.52573 -0.850651
+vn -1.24996e-008 -0.953636 -0.300962
+vn -8.74969e-009 0.157294 -0.987552
+vn -1.25026e-009 0.850651 -0.52573
+vn -1.24987e-009 0.984806 -0.173657
+vn -1.24987e-009 0.595741 -0.803177
+vn -1.24987e-009 0.734582 -0.67852
+vn -1.24986e-009 0.935402 -0.353587
+vn 0 -1 1.49983e-008
+vn 0 0.447212 -0.894428
+vn 0 1 -1.34985e-008
+vn 3.74961e-009 -0.984806 0.173657
+vn 1.24987e-008 -0.935402 0.353587
+vn 1.24996e-008 0.953636 0.300962
+vn 2.00227e-008 0.794656 0.60706
+vn 2.12544e-008 -0.850651 0.52573
+vn 2.7497e-008 -0.734582 0.67852
+vn 2.8756e-008 0.52573 0.850651
+vn 3.37465e-008 -0.595741 0.803177
+vn 3.89956e-008 -0.447212 0.894428
+vn 1.45164e-007 -0.187592 -0.982247
+vn 1.45164e-007 -0.794656 -0.60706
+vn 0.101245 0.667785 0.737436
+vn 0.101245 0.360941 0.927077
+vn 0.101246 -0.360941 -0.927077
+vn 0.101246 -0.667784 -0.737437
+vn 0.102071 0.31476 -0.943667
+vn 0.102072 -0.31476 0.943667
+vn 0.102073 -0.984806 -0.140492
+vn 0.102073 0.984806 0.140492
+vn 0.1058 -0.00869608 -0.994349
+vn 0.1058 0.885484 0.452465
+vn 0.105801 -0.885484 -0.452464
+vn 0.105801 0.00869592 0.994349
+vn 0.165157 0.488415 -0.856839
+vn 0.165157 -0.488415 0.856839
+vn 0.165158 0.984806 -0.0536629
+vn 0.165158 -0.984806 0.0536629
+vn 0.1769 -0.644256 0.74407
+vn 0.1769 0.644256 -0.74407
+vn 0.176901 -0.953636 0.243484
+vn 0.176901 0.953636 -0.243484
+vn 0.180358 -0.779031 0.600485
+vn 0.180358 0.779031 -0.600485
+vn 0.180359 0.885484 -0.42824
+vn 0.180359 -0.885484 0.42824
+vn 0.190992 0.516052 0.834992
+vn 0.190993 -0.516052 -0.834992
+vn 0.207045 -0.180944 -0.961453
+vn 0.207045 0.77903 0.591814
+vn 0.207046 0.180943 0.961453
+vn 0.207047 -0.77903 -0.591814
+vn 0.207832 0.162469 -0.964577
+vn 0.207833 -0.162468 0.964577
+vn 0.207833 -0.935402 -0.286058
+vn 0.207833 0.935402 0.286058
+vn 0.286231 -0.343296 0.89455
+vn 0.286231 0.343296 -0.89455
+vn 0.286232 -0.953636 -0.0930024
+vn 0.286232 0.953636 0.0930024
+vn 0.294238 -0.343295 -0.891949
+vn 0.294238 0.343295 0.891948
+vn 0.294239 -0.644258 -0.705943
+vn 0.29424 0.644258 0.705943
+vn 0.309017 -8.52678e-007 -0.951057
+vn 0.309017 -6.87643e-008 0.951056
+vn 0.309017 -0.850651 -0.425326
+vn 0.309017 0.850651 0.425326
+vn 0.336281 -0.935402 0.109265
+vn 0.336281 -0.516052 0.787785
+vn 0.336281 0.516052 -0.787785
+vn 0.336281 0.935402 -0.109265
+vn 0.351546 0.667785 -0.656109
+vn 0.351546 -0.885484 0.303865
+vn 0.351546 0.885484 -0.303865
+vn 0.351546 -0.667785 0.656108
+vn 0.356821 0.794656 -0.491122
+vn 0.356822 -0.794655 0.491122
+vn 0.370022 -0.488416 -0.790274
+vn 0.370023 0.488416 0.790274
+vn 0.397626 -0.180943 0.89953
+vn 0.397626 -0.885484 -0.240442
+vn 0.397626 0.885484 0.240442
+vn 0.397626 0.180944 -0.899529
+vn 0.398824 0.162467 0.902521
+vn 0.398824 -0.162469 -0.90252
+vn 0.398824 -0.734582 -0.548934
+vn 0.398825 0.734582 0.548934
+vn 0.463014 -0.885484 -0.0391978
+vn 0.463014 0.885484 0.0391978
+vn 0.463014 -0.360941 0.80953
+vn 0.463014 0.360941 -0.80953
+vn 0.472095 -0.595743 -0.649782
+vn 0.472095 -0.314759 -0.82344
+vn 0.472095 0.595743 0.649782
+vn 0.472095 0.31476 0.823439
+vn 0.498869 -0.77903 -0.379792
+vn 0.498869 0.77903 0.379792
+vn 0.49887 -0.00869757 0.866633
+vn 0.498871 0.00869589 -0.866633
+vn 0.5 -0.850651 0.16246
+vn 0.5 0.850651 -0.16246
+vn 0.5 0.525729 -0.688192
+vn 0.500001 -0.52573 0.688191
+vn 0.515362 -0.77903 0.357091
+vn 0.515362 0.77903 -0.35709
+vn 0.515363 -0.667785 0.537089
+vn 0.515363 0.667785 -0.537089
+vn 0.525731 -0.447214 -0.723607
+vn 0.525731 0.447214 0.723607
+vn 0.577349 0.794656 0.187593
+vn 0.57735 -0.794655 -0.187592
+vn 0.57735 -0.187593 0.794655
+vn 0.57735 0.187593 -0.794655
+vn 0.580467 -0.644258 -0.497986
+vn 0.580467 0.644258 0.497986
+vn 0.580468 -0.157292 -0.798947
+vn 0.580469 0.157292 0.798946
+vn 0.626829 -0.360942 0.690512
+vn 0.626829 0.360942 -0.690512
+vn 0.626829 0.779031 -0.0140304
+vn 0.62683 -0.77903 0.0140295
+vn 0.637251 0.488417 0.596121
+vn 0.637251 0.31476 0.703447
+vn 0.637252 -0.488417 -0.59612
+vn 0.637252 -0.31476 -0.703446
+vn 0.64531 -0.516053 0.563262
+vn 0.645311 0.516052 -0.563262
+vn 0.645311 -0.734582 0.209674
+vn 0.645311 0.734582 -0.209674
+vn 0.652987 -0.644257 0.398172
+vn 0.652987 0.644257 -0.398171
+vn 0.670057 -0.667786 -0.324169
+vn 0.670057 0.667785 0.32417
+vn 0.670057 0.00869565 -0.742258
+vn 0.670058 -0.00869665 0.742258
+vn 0.732629 0.180942 -0.656136
+vn 0.732629 -0.667786 -0.131592
+vn 0.73263 0.667785 0.131592
+vn 0.73263 -0.180943 0.656135
+vn 0.735104 -0.162467 -0.6582
+vn 0.735104 -0.516053 -0.439671
+vn 0.735104 0.516054 0.43967
+vn 0.735104 0.162466 0.658199
+vn 0.757369 -0.343296 -0.555465
+vn 0.757369 0.343296 0.555464
+vn 0.762317 -0.644257 0.0616879
+vn 0.762317 0.343297 -0.548653
+vn 0.762317 0.644257 -0.0616893
+vn 0.762317 -0.343296 0.548653
+vn 0.763865 -0.595742 0.248195
+vn 0.763865 0.595742 -0.248195
+vn 0.763866 -0.488416 0.421851
+vn 0.763866 0.488416 -0.421851
+vn 0.809017 -5.86372e-007 -0.587785
+vn 0.809017 -0.525731 -0.262865
+vn 0.809017 -2.413e-007 0.587785
+vn 0.809018 0.52573 0.262865
+vn 0.850416 -0.180943 -0.494016
+vn 0.850416 -0.360941 -0.382771
+vn 0.850417 0.180942 0.494015
+vn 0.850417 0.360942 0.382769
+vn 0.850652 -0.447212 0.276392
+vn 0.850652 0.447212 -0.276393
+vn 0.853144 -0.516053 -0.0763836
+vn 0.853145 0.516052 0.0763834
+vn 0.853145 0.162466 -0.495731
+vn 0.853145 -0.162466 0.49573
+vn 0.865939 -0.488415 0.107705
+vn 0.865939 0.488415 -0.107705
+vn 0.865939 -0.31476 0.388685
+vn 0.865939 0.31476 -0.388684
+vn 0.912988 0.360942 0.190194
+vn 0.912988 0.00869627 0.407893
+vn 0.912988 -0.360941 -0.190194
+vn 0.912988 -0.00869702 -0.407893
+vn 0.929022 -0.314761 0.194533
+vn 0.929022 0.314761 -0.194533
+vn 0.934172 -0.187593 -0.303531
+vn 0.934172 0.187593 0.303531
+vn 0.939218 -0.157293 0.305171
+vn 0.939218 -0.343297 0.00421008
+vn 0.939218 0.343297 -0.0042101
+vn 0.939218 0.157293 -0.305171
+vn 0.978376 -0.0086971 -0.20665
+vn 0.978376 0.00869708 0.20665
+vn 0.978376 -0.180943 -0.100195
+vn 0.978376 0.180943 0.100195
+vn 0.981591 -0.162468 0.100411
+vn 0.981591 0.162468 -0.100411
+vn 1 -8.75182e-009 -1.62534e-008
+usemtl Default_Smoothing
+s 1
+f 181/292/176 182/250/182 209/210/208
+f 213/254/213 209/210/208 243/218/243
+f 181/292/176 213/254/213 180/291/179
+f 181/292/176 209/210/208 213/254/213
+f 247/235/246 243/218/243 275/216/273
+f 217/264/216 213/254/213 247/235/246
+f 180/291/179 217/264/216 179/290/175
+f 213/254/213 243/218/243 247/235/246
+f 180/291/179 213/254/213 217/264/216
+f 279/229/277 275/216/273 297/214/301
+f 249/247/248 247/235/246 279/229/277
+f 217/264/216 249/247/248 216/270/215
+f 179/290/175 216/270/215 178/289/178
+f 247/235/246 275/216/273 279/229/277
+f 217/264/216 247/235/246 249/247/248
+f 179/290/175 217/264/216 216/270/215
+f 303/228/303 297/214/301 321/213/323
+f 278/240/279 279/229/277 303/228/303
+f 246/259/244 249/247/248 278/240/279
+f 216/270/215 246/259/244 212/271/211
+f 178/289/178 212/271/211 177/288/177
+f 279/229/277 297/214/301 303/228/303
+f 249/247/248 279/229/277 278/240/279
+f 216/270/215 249/247/248 246/259/244
+f 178/289/178 216/270/215 212/271/211
+f 320/223/325 321/213/323 335/209/335
+f 296/238/299 303/228/303 320/223/325
+f 274/249/274 278/240/279 296/238/299
+f 246/259/244 274/249/274 242/261/242
+f 212/271/211 242/261/242 208/276/206
+f 177/288/177 208/276/206 176/287/181
+f 303/228/303 321/213/323 320/223/325
+f 278/240/279 303/228/303 296/238/299
+f 246/259/244 278/240/279 274/249/274
+f 212/271/211 246/259/244 242/261/242
+f 177/288/177 212/271/211 208/276/206
+f 209/210/208 182/171/182 201/133/201
+f 231/175/231 201/133/201 223/144/227
+f 209/210/208 231/175/231 243/218/243
+f 209/210/208 201/133/201 231/175/231
+f 255/161/254 223/144/227 239/142/239
+f 263/190/261 231/175/231 255/161/254
+f 243/218/243 263/190/261 275/216/273
+f 231/175/231 223/144/227 255/161/254
+f 243/218/243 231/175/231 263/190/261
+f 271/155/269 239/142/239 258/136/259
+f 285/181/282 255/161/254 271/155/269
+f 263/190/261 285/181/282 293/196/292
+f 275/216/273 293/196/292 297/214/301
+f 255/161/254 239/142/239 271/155/269
+f 263/190/261 255/161/254 285/181/282
+f 275/216/273 263/190/261 293/196/292
+f 288/154/287 258/136/259 267/141/266
+f 307/166/305 271/155/269 288/154/287
+f 311/185/310 285/181/282 307/166/305
+f 293/196/292 311/185/310 325/197/320
+f 297/214/301 325/197/320 321/213/323
+f 271/155/269 258/136/259 288/154/287
+f 285/181/282 271/155/269 307/166/305
+f 293/196/292 285/181/282 311/185/310
+f 297/214/301 293/196/292 325/197/320
+f 301/149/294 267/141/266 281/135/281
+f 315/164/314 288/154/287 301/149/294
+f 329/180/329 307/166/305 315/164/314
+f 311/185/310 329/180/329 339/187/337
+f 325/197/320 339/187/337 343/202/341
+f 321/213/323 343/202/341 335/209/335
+f 288/154/287 267/141/266 301/149/294
+f 307/166/305 288/154/287 315/164/314
+f 311/185/310 307/166/305 329/180/329
+f 325/197/320 311/185/310 339/187/337
+f 321/213/323 325/197/320 343/202/341
+f 201/133/201 182/107/182 165/70/163
+f 184/106/185 165/70/163 142/59/137
+f 201/133/201 184/106/185 223/144/227
+f 201/133/201 165/70/163 184/106/185
+f 169/87/160 142/59/137 127/61/127
+f 197/116/203 184/106/185 169/87/160
+f 223/144/227 197/116/203 239/142/239
+f 184/106/185 142/59/137 169/87/160
+f 223/144/227 184/106/185 197/116/203
+f 139/81/142 127/61/127 107/65/106
+f 187/105/186 169/87/160 139/81/142
+f 197/116/203 187/105/186 226/122/221
+f 239/142/239 226/122/221 258/136/259
+f 169/87/160 127/61/127 139/81/142
+f 197/116/203 169/87/160 187/105/186
+f 239/142/239 197/116/203 226/122/221
+f 131/80/129 107/65/106 99/60/99
+f 161/92/168 139/81/142 131/80/129
+f 205/111/194 187/105/186 161/92/168
+f 226/122/221 205/111/194 235/123/235
+f 258/136/259 235/123/235 267/141/266
+f 139/81/142 107/65/106 131/80/129
+f 187/105/186 139/81/142 161/92/168
+f 226/122/221 187/105/186 205/111/194
+f 258/136/259 226/122/221 235/123/235
+f 113/75/113 99/60/99 83/67/83
+f 145/90/144 131/80/129 113/75/113
+f 190/104/189 161/92/168 145/90/144
+f 205/111/194 190/104/189 219/113/218
+f 235/123/235 219/113/218 251/128/251
+f 267/141/266 251/128/251 281/135/281
+f 131/80/129 99/60/99 113/75/113
+f 161/92/168 131/80/129 145/90/144
+f 205/111/194 161/92/168 190/104/189
+f 235/123/235 205/111/194 219/113/218
+f 267/141/266 235/123/235 251/128/251
+f 182/32/182 157/2/155 165/70/163
+f 135/387/133 157/364/155 123/356/123
+f 165/70/163 135/27/133 142/59/137
+f 165/70/163 157/2/155 135/27/133
+f 103/383/102 123/356/123 91/357/90
+f 135/27/133 103/13/102 111/42/110
+f 142/59/137 111/42/110 127/61/127
+f 135/387/133 123/356/123 103/383/102
+f 142/59/137 135/27/133 111/42/110
+f 73/377/71 91/357/90 69/360/63
+f 81/31/79 103/13/102 73/7/71
+f 111/42/110 81/31/79 95/48/95
+f 127/61/127 95/48/95 107/65/106
+f 103/383/102 91/357/90 73/377/71
+f 111/42/110 103/13/102 81/31/79
+f 127/61/127 111/42/110 95/48/95
+f 41/376/44 69/360/63 45/359/40
+f 55/18/55 73/7/71 41/6/44
+f 81/31/79 55/18/55 59/37/58
+f 95/48/95 59/37/58 77/49/77
+f 107/65/106 77/49/77 99/60/99
+f 73/377/71 69/360/63 41/376/44
+f 81/31/79 73/7/71 55/18/55
+f 95/48/95 81/31/79 59/37/58
+f 107/65/106 95/48/95 77/49/77
+f 23/371/23 45/359/40 29/363/28
+f 27/385/27 41/376/44 23/371/23
+f 37/30/36 55/18/55 27/16/27
+f 59/37/58 37/30/36 51/39/51
+f 77/49/77 51/39/51 65/54/66
+f 99/60/99 65/54/66 83/67/83
+f 41/376/44 45/359/40 23/371/23
+f 55/18/55 41/6/44 27/16/27
+f 59/37/58 55/18/55 37/30/36
+f 77/49/77 59/37/58 51/39/51
+f 99/60/99 77/49/77 65/54/66
+f 182/323/182 181/292/176 157/364/155
+f 153/319/150 181/292/176 180/291/179
+f 157/364/155 153/319/150 123/356/123
+f 157/364/155 181/292/176 153/319/150
+f 149/309/148 180/291/179 179/290/175
+f 153/319/150 149/309/148 119/338/118
+f 123/356/123 119/338/118 91/357/90
+f 153/319/150 180/291/179 149/309/148
+f 123/356/123 153/319/150 119/338/118
+f 148/303/149 179/290/175 178/289/178
+f 115/327/114 149/309/148 148/303/149
+f 119/338/118 115/327/114 87/344/85
+f 91/357/90 87/344/85 69/360/63
+f 149/309/148 179/290/175 148/303/149
+f 119/338/118 149/309/148 115/327/114
+f 91/357/90 119/338/118 87/344/85
+f 152/302/152 178/289/178 177/288/177
+f 118/314/116 148/303/149 152/302/152
+f 115/327/114 118/314/116 86/333/84
+f 87/344/85 86/333/84 61/345/61
+f 69/360/63 61/345/61 45/359/40
+f 148/303/149 178/289/178 152/302/152
+f 115/327/114 148/303/149 118/314/116
+f 87/344/85 115/327/114 86/333/84
+f 69/360/63 87/344/85 61/345/61
+f 156/297/156 177/288/177 176/287/181
+f 122/312/122 152/302/152 156/297/156
+f 90/322/88 118/314/116 122/312/122
+f 86/333/84 90/322/88 68/335/65
+f 61/345/61 68/335/65 44/350/38
+f 45/359/40 44/350/38 29/363/28
+f 152/302/152 177/288/177 156/297/156
+f 118/314/116 152/302/152 122/312/122
+f 86/333/84 118/314/116 90/322/88
+f 61/345/61 86/333/84 68/335/65
+f 45/359/40 61/345/61 44/350/38
+f 198/255/200 206/178/209 175/217/180
+f 220/244/226 228/211/230 198/255/200
+f 228/211/230 240/170/240 206/178/209
+f 198/255/200 228/211/230 206/178/209
+f 236/245/238 252/227/253 220/244/226
+f 252/227/253 260/198/260 228/211/230
+f 260/198/260 272/172/272 240/170/240
+f 220/244/226 252/227/253 228/211/230
+f 260/198/260 240/170/240 228/211/230
+f 256/251/258 268/233/268 236/245/238
+f 268/233/268 282/207/283 252/227/253
+f 282/207/283 290/192/293 260/198/260
+f 290/192/293 294/176/300 272/172/272
+f 236/245/238 268/233/268 252/227/253
+f 252/227/253 282/207/283 260/198/260
+f 290/192/293 272/172/272 260/198/260
+f 264/246/264 286/234/286 256/251/258
+f 286/234/286 304/222/304 268/233/268
+f 304/222/304 308/203/309 282/207/283
+f 308/203/309 322/191/318 290/192/293
+f 322/191/318 318/173/322 294/176/300
+f 256/251/258 286/234/286 268/233/268
+f 268/233/268 304/222/304 282/207/283
+f 308/203/309 290/192/293 282/207/283
+f 322/191/318 294/176/300 290/192/293
+f 280/252/280 298/239/296 264/246/264
+f 298/239/296 312/224/313 286/234/286
+f 312/224/313 326/215/327 304/222/304
+f 326/215/327 336/201/336 308/203/309
+f 336/201/336 340/186/340 322/191/318
+f 340/186/340 334/179/334 318/173/322
+f 264/246/264 298/239/296 286/234/286
+f 286/234/286 312/224/313 304/222/304
+f 304/222/304 326/215/327 308/203/309
+f 336/201/336 322/191/318 308/203/309
+f 340/186/340 318/173/322 322/191/318
+f 206/178/209 183/96/183 175/138/180
+f 240/170/240 210/134/212 206/178/209
+f 210/134/212 185/97/184 183/96/183
+f 206/178/209 210/134/212 183/96/183
+f 272/172/272 244/153/245 240/170/240
+f 244/153/245 214/124/217 210/134/212
+f 214/124/217 186/98/187 185/97/184
+f 240/170/240 244/153/245 210/134/212
+f 214/124/217 185/97/184 210/134/212
+f 294/176/300 276/159/276 272/172/272
+f 276/159/276 248/140/249 244/153/245
+f 248/140/249 215/118/214 214/124/217
+f 215/118/214 188/99/188 186/98/187
+f 272/172/272 276/159/276 244/153/245
+f 244/153/245 248/140/249 214/124/217
+f 215/118/214 186/98/187 214/124/217
+f 318/173/322 302/160/302 294/176/300
+f 302/160/302 277/148/278 276/159/276
+f 277/148/278 245/129/247 248/140/249
+f 245/129/247 211/117/210 215/118/214
+f 211/117/210 189/100/190 188/99/188
+f 294/176/300 302/160/302 276/159/276
+f 276/159/276 277/148/278 248/140/249
+f 245/129/247 215/118/214 248/140/249
+f 211/117/210 188/99/188 215/118/214
+f 334/179/334 319/165/324 318/173/322
+f 319/165/324 295/150/298 302/160/302
+f 295/150/298 273/137/275 277/148/278
+f 273/137/275 241/127/241 245/129/247
+f 241/127/241 207/112/207 211/117/210
+f 207/112/207 191/101/191 189/100/190
+f 318/173/322 319/165/324 302/160/302
+f 302/160/302 295/150/298 277/148/278
+f 277/148/278 273/137/275 245/129/247
+f 241/127/241 211/117/210 245/129/247
+f 207/112/207 189/100/190 211/117/210
+f 183/96/183 154/22/154 175/63/180
+f 185/97/184 150/69/151 183/96/183
+f 150/69/151 120/33/120 154/22/154
+f 150/69/151 154/22/154 183/96/183
+f 186/98/187 146/79/146 185/97/184
+f 146/79/146 116/50/117 150/69/151
+f 116/50/117 88/29/91 120/33/120
+f 185/97/184 146/79/146 150/69/151
+f 116/50/117 120/33/120 150/69/151
+f 188/99/188 147/85/147 186/98/187
+f 147/85/147 114/62/115 146/79/146
+f 114/62/115 84/44/87 116/50/117
+f 84/44/87 66/25/62 88/29/91
+f 186/98/187 147/85/147 146/79/146
+f 114/62/115 116/50/117 146/79/146
+f 84/44/87 88/29/91 116/50/117
+f 189/100/190 151/86/153 188/99/188
+f 151/86/153 117/74/119 147/85/147
+f 117/74/119 85/55/86 114/62/115
+f 85/55/86 60/43/60 84/44/87
+f 60/43/60 42/26/41 66/25/62
+f 188/99/188 151/86/153 147/85/147
+f 147/85/147 117/74/119 114/62/115
+f 85/55/86 84/44/87 114/62/115
+f 60/43/60 66/25/62 84/44/87
+f 191/101/191 155/91/157 189/100/190
+f 155/91/157 121/76/121 151/86/153
+f 121/76/121 89/64/89 117/74/119
+f 89/64/89 67/53/64 85/55/86
+f 67/53/64 43/38/39 60/43/60
+f 43/38/39 28/23/29 42/26/41
+f 189/100/190 155/91/157 151/86/153
+f 151/86/153 121/76/121 117/74/119
+f 89/64/89 85/55/86 117/74/119
+f 67/53/64 60/43/60 85/55/86
+f 43/38/39 42/26/41 60/43/60
+f 154/386/154 162/318/162 175/355/180
+f 120/33/120 132/1/132 154/22/154
+f 132/361/132 140/329/136 162/318/162
+f 132/361/132 162/318/162 154/386/154
+f 88/29/91 100/5/101 120/33/120
+f 100/375/101 108/346/108 132/361/132
+f 108/346/108 124/324/124 140/329/136
+f 120/33/120 100/5/101 132/1/132
+f 108/346/108 140/329/136 132/361/132
+f 66/25/62 70/11/72 88/29/91
+f 70/381/72 78/365/81 100/375/101
+f 78/365/81 92/340/94 108/346/108
+f 92/340/94 104/328/104 124/324/124
+f 88/29/91 70/11/72 100/5/101
+f 78/365/81 108/346/108 100/375/101
+f 92/340/94 124/324/124 108/346/108
+f 42/26/41 38/12/43 66/25/62
+f 38/382/43 52/370/52 70/381/72
+f 52/370/52 56/351/59 78/365/81
+f 56/351/59 74/339/76 92/340/94
+f 74/339/76 96/325/97 104/328/104
+f 66/25/62 38/12/43 70/11/72
+f 70/381/72 52/370/52 78/365/81
+f 56/351/59 92/340/94 78/365/81
+f 74/339/76 104/328/104 92/340/94
+f 28/23/29 20/17/22 42/26/41
+f 20/17/22 24/3/25 38/12/43
+f 24/372/25 34/366/34 52/370/52
+f 34/366/34 48/349/48 56/351/59
+f 48/349/48 62/334/68 74/339/76
+f 62/334/68 82/320/82 96/325/97
+f 42/26/41 20/17/22 38/12/43
+f 38/382/43 24/372/25 52/370/52
+f 34/366/34 56/351/59 52/370/52
+f 48/349/48 74/339/76 56/351/59
+f 62/334/68 96/325/97 74/339/76
+f 162/318/162 198/255/200 175/281/180
+f 140/329/136 174/282/173 162/318/162
+f 174/282/173 220/244/226 198/255/200
+f 174/282/173 198/255/200 162/318/162
+f 124/324/124 166/301/159 140/329/136
+f 166/301/159 194/272/204 174/282/173
+f 194/272/204 236/245/238 220/244/226
+f 140/329/136 166/301/159 174/282/173
+f 194/272/204 220/244/226 174/282/173
+f 104/328/104 136/307/140 124/324/124
+f 136/307/140 172/283/193 166/301/159
+f 172/283/193 224/266/223 194/272/204
+f 224/266/223 256/251/258 236/245/238
+f 124/324/124 136/307/140 166/301/159
+f 172/283/193 194/272/204 166/301/159
+f 224/266/223 236/245/238 194/272/204
+f 96/325/97 128/308/128 104/328/104
+f 128/308/128 158/296/167 136/307/140
+f 158/296/167 202/277/197 172/283/193
+f 202/277/197 232/265/234 224/266/223
+f 232/265/234 264/246/264 256/251/258
+f 104/328/104 128/308/128 136/307/140
+f 136/307/140 158/296/167 172/283/193
+f 202/277/197 224/266/223 172/283/193
+f 232/265/234 256/251/258 224/266/223
+f 82/320/82 112/313/112 96/325/97
+f 112/313/112 144/298/145 128/308/128
+f 144/298/145 170/284/172 158/296/167
+f 170/284/172 218/275/219 202/277/197
+f 218/275/219 250/260/250 232/265/234
+f 250/260/250 280/252/280 264/246/264
+f 96/325/97 112/313/112 128/308/128
+f 128/308/128 144/298/145 158/296/167
+f 158/296/167 170/284/172 202/277/197
+f 218/275/219 232/265/234 202/277/197
+f 250/260/250 264/246/264 232/265/234
+f 176/287/181 208/276/206 200/279/198
+f 208/276/206 242/261/242 230/269/229
+f 200/279/198 230/269/229 222/274/224
+f 208/276/206 230/269/229 200/279/198
+f 242/261/242 274/249/274 262/258/263
+f 230/269/229 262/258/263 254/263/255
+f 222/274/224 254/263/255 238/268/236
+f 242/261/242 262/258/263 230/269/229
+f 230/269/229 254/263/255 222/274/224
+f 274/249/274 296/238/299 292/241/291
+f 262/258/263 292/241/291 284/248/285
+f 254/263/255 284/248/285 270/256/271
+f 238/268/236 270/256/271 257/262/257
+f 262/258/263 274/249/274 292/241/291
+f 262/258/263 284/248/285 254/263/255
+f 238/268/236 254/263/255 270/256/271
+f 296/238/299 320/223/325 324/230/319
+f 292/241/291 324/230/319 310/236/308
+f 284/248/285 310/236/308 306/243/306
+f 270/256/271 306/243/306 287/253/288
+f 257/262/257 287/253/288 265/257/265
+f 292/241/291 296/238/299 324/230/319
+f 284/248/285 292/241/291 310/236/308
+f 270/256/271 284/248/285 306/243/306
+f 257/262/257 270/256/271 287/253/288
+f 320/223/325 335/209/335 342/220/343
+f 324/230/319 342/220/343 338/225/338
+f 310/236/308 338/225/338 328/231/326
+f 306/243/306 328/231/326 313/237/312
+f 287/253/288 313/237/312 299/242/297
+f 265/257/265 299/242/297 280/252/280
+f 324/230/319 320/223/325 342/220/343
+f 310/236/308 324/230/319 338/225/338
+f 306/243/306 310/236/308 328/231/326
+f 306/243/306 313/237/312 287/253/288
+f 265/257/265 287/253/288 299/242/297
+f 335/209/335 343/202/341 349/205/349
+f 343/202/341 339/187/337 355/195/354
+f 349/205/349 355/195/354 361/200/361
+f 343/202/341 355/195/354 349/205/349
+f 339/187/337 329/180/329 347/184/344
+f 355/195/354 347/184/344 359/189/359
+f 361/200/361 359/189/359 362/194/362
+f 339/187/337 347/184/344 355/195/354
+f 355/195/354 359/189/359 361/200/361
+f 329/180/329 315/164/314 333/167/333
+f 347/184/344 333/167/333 351/174/351
+f 359/189/359 351/174/351 357/182/357
+f 362/194/362 357/182/357 360/188/360
+f 347/184/344 329/180/329 333/167/333
+f 347/184/344 351/174/351 359/189/359
+f 362/194/362 359/189/359 357/182/357
+f 315/164/314 301/149/294 317/156/317
+f 333/167/333 317/156/317 332/162/332
+f 351/174/351 332/162/332 345/169/345
+f 357/182/357 345/169/345 353/177/352
+f 360/188/360 353/177/352 348/183/348
+f 333/167/333 315/164/314 317/156/317
+f 351/174/351 333/167/333 332/162/332
+f 357/182/357 351/174/351 345/169/345
+f 360/188/360 357/182/357 353/177/352
+f 301/149/294 281/135/281 300/146/295
+f 317/156/317 300/146/295 314/151/315
+f 332/162/332 314/151/315 327/157/328
+f 345/169/345 327/157/328 337/163/339
+f 353/177/352 337/163/339 341/168/342
+f 348/183/348 341/168/342 334/179/334
+f 317/156/317 301/149/294 300/146/295
+f 332/162/332 317/156/317 314/151/315
+f 345/169/345 332/162/332 327/157/328
+f 345/169/345 337/163/339 353/177/352
+f 348/183/348 353/177/352 341/168/342
+f 281/135/281 251/128/251 266/131/267
+f 251/128/251 219/113/218 234/121/233
+f 266/131/267 234/121/233 259/126/256
+f 251/128/251 234/121/233 266/131/267
+f 219/113/218 190/104/189 204/110/195
+f 234/121/233 204/110/195 227/115/222
+f 259/126/256 227/115/222 237/120/237
+f 219/113/218 204/110/195 234/121/233
+f 234/121/233 227/115/222 259/126/256
+f 190/104/189 145/90/144 160/93/166
+f 204/110/195 160/93/166 192/103/170
+f 227/115/222 192/103/170 195/108/205
+f 237/120/237 195/108/205 221/114/225
+f 204/110/195 190/104/189 160/93/166
+f 204/110/195 192/103/170 227/115/222
+f 237/120/237 227/115/222 195/108/205
+f 145/90/144 113/75/113 130/82/131
+f 160/93/166 130/82/131 138/88/143
+f 192/103/170 138/88/143 167/95/161
+f 195/108/205 167/95/161 193/102/171
+f 221/114/225 193/102/171 199/109/199
+f 160/93/166 145/90/144 130/82/131
+f 192/103/170 160/93/166 138/88/143
+f 195/108/205 192/103/170 167/95/161
+f 221/114/225 195/108/205 193/102/171
+f 113/75/113 83/67/83 98/72/98
+f 130/82/131 98/72/98 106/77/105
+f 138/88/143 106/77/105 125/83/126
+f 167/95/161 125/83/126 143/89/139
+f 193/102/171 143/89/139 163/94/164
+f 199/109/199 163/94/164 191/101/191
+f 130/82/131 113/75/113 98/72/98
+f 138/88/143 130/82/131 106/77/105
+f 138/88/143 125/83/126 167/95/161
+f 167/95/161 143/89/139 193/102/171
+f 199/109/199 193/102/171 163/94/164
+f 83/67/83 65/54/66 64/57/67
+f 65/54/66 51/39/51 47/47/47
+f 64/57/67 47/47/47 50/52/50
+f 65/54/66 47/47/47 64/57/67
+f 51/39/51 37/30/36 33/36/33
+f 47/47/47 33/36/33 32/41/32
+f 50/52/50 32/41/32 35/46/37
+f 51/39/51 33/36/33 47/47/47
+f 47/47/47 32/41/32 50/52/50
+f 37/30/36 27/16/27 19/19/16
+f 33/36/33 19/19/16 13/28/12
+f 32/41/32 13/28/12 17/34/17
+f 35/46/37 17/34/17 25/40/26
+f 37/30/36 19/19/16 33/36/33
+f 33/36/33 13/28/12 32/41/32
+f 32/41/32 17/34/17 35/46/37
+f 27/385/27 23/371/23 11/378/10
+f 19/19/16 11/8/10 7/14/5
+f 13/28/12 7/14/5 5/21/7
+f 17/34/17 5/21/7 9/24/8
+f 25/40/26 9/24/8 21/35/21
+f 19/19/16 27/16/27 11/8/10
+f 13/28/12 19/19/16 7/14/5
+f 13/28/12 5/21/7 17/34/17
+f 25/40/26 17/34/17 9/24/8
+f 23/371/23 29/363/28 15/368/15
+f 11/378/10 15/368/15 3/373/3
+f 7/384/5 3/373/3 1/379/1
+f 5/21/7 1/9/1 2/15/2
+f 9/24/8 2/15/2 14/20/14
+f 21/35/21 14/20/14 28/23/29
+f 11/378/10 23/371/23 15/368/15
+f 7/384/5 11/378/10 3/373/3
+f 7/14/5 1/9/1 5/21/7
+f 5/21/7 2/15/2 9/24/8
+f 9/24/8 14/20/14 21/35/21
+f 29/363/28 44/350/38 22/353/20
+f 44/350/38 68/335/65 40/343/42
+f 22/353/20 40/343/42 26/348/24
+f 44/350/38 40/343/42 22/353/20
+f 68/335/65 90/322/88 72/332/73
+f 40/343/42 72/332/73 53/337/53
+f 26/348/24 53/337/53 36/342/35
+f 68/335/65 72/332/73 40/343/42
+f 40/343/42 53/337/53 26/348/24
+f 90/322/88 122/312/122 102/315/100
+f 72/332/73 102/315/100 80/321/80
+f 53/337/53 80/321/80 58/330/57
+f 36/342/35 58/330/57 49/336/49
+f 90/322/88 102/315/100 72/332/73
+f 72/332/73 80/321/80 53/337/53
+f 53/337/53 58/330/57 36/342/35
+f 122/312/122 156/297/156 134/304/134
+f 102/315/100 134/304/134 110/310/109
+f 80/321/80 110/310/109 94/317/93
+f 58/330/57 94/317/93 75/326/74
+f 49/336/49 75/326/74 63/331/69
+f 102/315/100 122/312/122 134/304/134
+f 80/321/80 102/315/100 110/310/109
+f 80/321/80 94/317/93 58/330/57
+f 49/336/49 58/330/57 75/326/74
+f 156/297/156 176/287/181 164/294/165
+f 134/304/134 164/294/165 141/299/138
+f 110/310/109 141/299/138 126/305/125
+f 94/317/93 126/305/125 105/311/107
+f 75/326/74 105/311/107 97/316/96
+f 63/331/69 97/316/96 82/320/82
+f 134/304/134 156/297/156 164/294/165
+f 110/310/109 134/304/134 141/299/138
+f 110/310/109 126/305/125 94/317/93
+f 94/317/93 105/311/107 75/326/74
+f 75/326/74 97/316/96 63/331/69
+f 348/183/348 334/179/334 340/186/340
+f 352/193/353 340/186/340 336/201/336
+f 360/188/360 348/183/348 352/193/353
+f 352/193/353 348/183/348 340/186/340
+f 344/204/346 336/201/336 326/215/327
+f 356/199/358 352/193/353 344/204/346
+f 362/194/362 360/188/360 356/199/358
+f 344/204/346 352/193/353 336/201/336
+f 356/199/358 360/188/360 352/193/353
+f 312/224/313 330/221/331 326/215/327
+f 330/221/331 350/212/350 344/204/346
+f 358/206/356 356/199/358 350/212/350
+f 358/206/356 361/200/361 362/194/362
+f 330/221/331 344/204/346 326/215/327
+f 350/212/350 356/199/358 344/204/346
+f 358/206/356 362/194/362 356/199/358
+f 298/239/296 316/232/316 312/224/313
+f 316/232/316 331/226/330 330/221/331
+f 331/226/330 346/219/347 350/212/350
+f 346/219/347 354/208/355 358/206/356
+f 354/208/355 349/205/349 361/200/361
+f 316/232/316 330/221/331 312/224/313
+f 331/226/330 350/212/350 330/221/331
+f 346/219/347 358/206/356 350/212/350
+f 354/208/355 361/200/361 358/206/356
+f 280/252/280 299/242/297 298/239/296
+f 299/242/297 313/237/312 316/232/316
+f 313/237/312 328/231/326 331/226/330
+f 328/231/326 338/225/338 346/219/347
+f 342/220/343 354/208/355 338/225/338
+f 342/220/343 335/209/335 349/205/349
+f 299/242/297 316/232/316 298/239/296
+f 313/237/312 331/226/330 316/232/316
+f 328/231/326 346/219/347 331/226/330
+f 338/225/338 354/208/355 346/219/347
+f 342/220/343 349/205/349 354/208/355
+f 199/109/199 191/101/191 207/112/207
+f 229/119/228 207/112/207 241/127/241
+f 221/114/225 199/109/199 229/119/228
+f 229/119/228 199/109/199 207/112/207
+f 261/130/262 241/127/241 273/137/275
+f 253/125/252 229/119/228 261/130/262
+f 237/120/237 221/114/225 253/125/252
+f 261/130/262 229/119/228 241/127/241
+f 253/125/252 221/114/225 229/119/228
+f 295/150/298 291/147/290 273/137/275
+f 291/147/290 283/139/284 261/130/262
+f 269/132/270 253/125/252 283/139/284
+f 269/132/270 259/126/256 237/120/237
+f 291/147/290 261/130/262 273/137/275
+f 283/139/284 253/125/252 261/130/262
+f 269/132/270 237/120/237 253/125/252
+f 319/165/324 323/158/321 295/150/298
+f 323/158/321 309/152/311 291/147/290
+f 309/152/311 305/145/307 283/139/284
+f 305/145/307 289/143/289 269/132/270
+f 289/143/289 266/131/267 259/126/256
+f 323/158/321 291/147/290 295/150/298
+f 309/152/311 283/139/284 291/147/290
+f 305/145/307 269/132/270 283/139/284
+f 289/143/289 259/126/256 269/132/270
+f 334/179/334 341/168/342 319/165/324
+f 341/168/342 337/163/339 323/158/321
+f 337/163/339 327/157/328 309/152/311
+f 327/157/328 314/151/315 305/145/307
+f 300/146/295 289/143/289 314/151/315
+f 300/146/295 281/135/281 266/131/267
+f 341/168/342 323/158/321 319/165/324
+f 337/163/339 309/152/311 323/158/321
+f 327/157/328 305/145/307 309/152/311
+f 314/151/315 289/143/289 305/145/307
+f 300/146/295 266/131/267 289/143/289
+f 21/35/21 28/23/29 43/38/39
+f 39/45/45 43/38/39 67/53/64
+f 25/40/26 21/35/21 39/45/45
+f 39/45/45 21/35/21 43/38/39
+f 71/56/70 67/53/64 89/64/89
+f 54/51/54 39/45/45 71/56/70
+f 35/46/37 25/40/26 54/51/54
+f 71/56/70 39/45/45 67/53/64
+f 54/51/54 25/40/26 39/45/45
+f 121/76/121 101/73/103 89/64/89
+f 79/68/78 71/56/70 101/73/103
+f 57/58/56 54/51/54 79/68/78
+f 50/52/50 35/46/37 57/58/56
+f 101/73/103 71/56/70 89/64/89
+f 79/68/78 54/51/54 71/56/70
+f 57/58/56 35/46/37 54/51/54
+f 155/91/157 133/84/135 121/76/121
+f 133/84/135 109/78/111 101/73/103
+f 109/78/111 93/71/92 79/68/78
+f 76/66/75 57/58/56 93/71/92
+f 76/66/75 64/57/67 50/52/50
+f 133/84/135 101/73/103 121/76/121
+f 109/78/111 79/68/78 101/73/103
+f 93/71/92 57/58/56 79/68/78
+f 76/66/75 50/52/50 57/58/56
+f 191/101/191 163/94/164 155/91/157
+f 163/94/164 143/89/139 133/84/135
+f 143/89/139 125/83/126 109/78/111
+f 106/77/105 93/71/92 125/83/126
+f 98/72/98 76/66/75 106/77/105
+f 83/67/83 64/57/67 98/72/98
+f 163/94/164 133/84/135 155/91/157
+f 143/89/139 109/78/111 133/84/135
+f 125/83/126 93/71/92 109/78/111
+f 106/77/105 76/66/75 93/71/92
+f 98/72/98 64/57/67 76/66/75
+f 63/331/69 82/320/82 62/334/68
+f 46/341/46 62/334/68 48/349/48
+f 49/336/49 63/331/69 46/341/46
+f 46/341/46 63/331/69 62/334/68
+f 30/352/31 48/349/48 34/366/34
+f 31/347/30 46/341/46 30/352/31
+f 36/342/35 49/336/49 31/347/30
+f 30/352/31 46/341/46 48/349/48
+f 31/347/30 49/336/49 46/341/46
+f 24/372/25 16/369/18 34/366/34
+f 12/358/13 30/352/31 16/369/18
+f 18/354/19 31/347/30 12/358/13
+f 26/348/24 36/342/35 18/354/19
+f 16/369/18 30/352/31 34/366/34
+f 12/358/13 31/347/30 30/352/31
+f 18/354/19 36/342/35 31/347/30
+f 20/17/22 8/10/9 24/3/25
+f 8/380/9 4/374/4 16/369/18
+f 4/374/4 6/367/6 12/358/13
+f 10/362/11 18/354/19 6/367/6
+f 10/362/11 22/353/20 26/348/24
+f 8/380/9 16/369/18 24/372/25
+f 4/374/4 12/358/13 16/369/18
+f 6/367/6 18/354/19 12/358/13
+f 10/362/11 26/348/24 18/354/19
+f 28/23/29 14/20/14 20/17/22
+f 14/20/14 2/15/2 8/10/9
+f 2/15/2 1/9/1 4/4/4
+f 3/373/3 6/367/6 1/379/1
+f 15/368/15 10/362/11 3/373/3
+f 29/363/28 22/353/20 15/368/15
+f 14/20/14 8/10/9 20/17/22
+f 2/15/2 4/4/4 8/10/9
+f 1/379/1 6/367/6 4/374/4
+f 3/373/3 10/362/11 6/367/6
+f 15/368/15 22/353/20 10/362/11
+f 265/257/265 280/252/280 250/260/250
+f 233/267/232 250/260/250 218/275/219
+f 257/262/257 265/257/265 233/267/232
+f 233/267/232 265/257/265 250/260/250
+f 203/278/196 218/275/219 170/284/172
+f 225/273/220 233/267/232 203/278/196
+f 238/268/236 257/262/257 225/273/220
+f 203/278/196 233/267/232 218/275/219
+f 225/273/220 257/262/257 233/267/232
+f 144/298/145 159/295/169 170/284/172
+f 159/295/169 171/285/192 203/278/196
+f 196/280/202 225/273/220 171/285/192
+f 196/280/202 222/274/224 238/268/236
+f 159/295/169 203/278/196 170/284/172
+f 171/285/192 225/273/220 203/278/196
+f 196/280/202 238/268/236 225/273/220
+f 112/313/112 129/306/130 144/298/145
+f 129/306/130 137/300/141 159/295/169
+f 137/300/141 168/293/158 171/285/192
+f 168/293/158 173/286/174 196/280/202
+f 173/286/174 200/279/198 222/274/224
+f 129/306/130 159/295/169 144/298/145
+f 137/300/141 171/285/192 159/295/169
+f 168/293/158 196/280/202 171/285/192
+f 173/286/174 222/274/224 196/280/202
+f 82/320/82 97/316/96 112/313/112
+f 97/316/96 105/311/107 129/306/130
+f 105/311/107 126/305/125 137/300/141
+f 141/299/138 168/293/158 126/305/125
+f 164/294/165 173/286/174 141/299/138
+f 164/294/165 176/287/181 200/279/198
+f 97/316/96 129/306/130 112/313/112
+f 105/311/107 137/300/141 129/306/130
+f 126/305/125 168/293/158 137/300/141
+f 141/299/138 173/286/174 168/293/158
+f 164/294/165 200/279/198 173/286/174
diff --git a/base/src/main.cpp b/base/src/main.cpp
index 88aa6bb..34eebec 100644
--- a/base/src/main.cpp
+++ b/base/src/main.cpp
@@ -80,6 +80,8 @@ device_mesh_t uploadMesh(const mesh_t & mesh) {
out.texname = mesh.texname;
out.color = mesh.color;
+ //Specular
+ out.specular = mesh.specular;
return out;
}
@@ -113,6 +115,10 @@ void initMesh() {
shape.mesh.positions[3*idx2+1],
shape.mesh.positions[3*idx2+2]);
+
+ //cout<<"Specular "<< shape.material.specular[0] << " "< allLight;
void draw_light(vec3 pos, float strength, mat4 sc, mat4 vp, float NEARP) {
float radius = strength;
vec4 light = cam.get_view() * vec4(pos, 1.0);
@@ -637,18 +766,23 @@ void draw_light(vec3 pos, float strength, mat4 sc, mat4 vp, float NEARP) {
glUniform4fv(glGetUniformLocation(point_prog, "u_Light"), 1, &(light[0]));
glUniform1f(glGetUniformLocation(point_prog, "u_LightIl"), strength);
+ allLight.push_back(light);
+
+ //glUniform4fv(glGetUniformLocation(post_prog, "u_Light"), 1, &(light[0]));
+ //glUniform4fv(glGetUniformLocation(post_prog2, "u_Light"), 1, &(light[0]));
+
vec4 left = vp * vec4(pos + radius*cam.start_left, 1.0);
vec4 up = vp * vec4(pos + radius*cam.up, 1.0);
vec4 center = vp * vec4(pos, 1.0);
- left = sc * left;
- up = sc * up;
- center = sc * center;
-
left /= left.w;
up /= up.w;
center /= center.w;
+ left = sc * left;
+ up = sc * up;
+ center = sc * center;
+
float hw = glm::distance(left, center);
float hh = glm::distance(up, center);
@@ -681,6 +815,11 @@ void updateDisplayText(char * disp) {
case(DISPLAY_LIGHTS):
sprintf(disp, "Displaying Lights");
break;
+ case(DISPLAY_TONE):
+ sprintf(disp, "Displaying Tone");
+ case(DISPLAY_BLOOM):
+ sprintf(disp, "Displaying Bloom");
+ break;
}
}
@@ -711,13 +850,23 @@ void updateTitle() {
}
bool doIScissor = true;
+int time = 0;
+float l1z = 0.0f;
+float l2z = 5.0f;
+
+float speed = 0.00f;
+float up1z = speed;
+float up2z = -speed;
+
void display(void)
{
// clear the screen
+ // Stage 1 -- RENDER TO G-BUFFER
bindFBO(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw_mesh();
+ // Stage 2 -- RENDER TO P-BUFFER
setTextures();
bindFBO(1);
glEnable(GL_BLEND);
@@ -725,7 +874,7 @@ void display(void)
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ONE);
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_TONE || display_type == DISPLAY_BLOOM)
{
setup_quad(point_prog);
if(doIScissor) glEnable(GL_SCISSOR_TEST);
@@ -740,17 +889,47 @@ void display(void)
0.0, 0.0, 1.0, 0.0,
0.5, 0.5, 0.0, 1.0);
- draw_light(vec3(2.5, -2.5, 5.0), 0.50, sc, vp, NEARP);
+
+ if(l1z >= 5.0)
+ up1z = -speed;
+ else if(l1z <= 0.0f)
+ up1z = speed;
+ l1z += up1z;
+
+ if(l2z >= 5.0)
+ up2z = -speed;
+ else if(l2z <= 0.0)
+ up2z = speed;
+ l2z += up2z;
+
+ int count = 0;
+ //float ly = -2.0;
+ /*for(float ly = - 1.0 ; ly >= -6.0; ly -= 0.5)
+ for(float i = 0.0; i < 6.0; i+= 0.6)
+ {
+ if(count %2 == 0)
+ draw_light(vec3(i, ly, l1z), 1.0, sc, vp, NEARP);
+ else
+ draw_light(vec3(i, ly, l2z), 1.0, sc, vp, NEARP);
+ count++;
+ }*/
+
+ draw_light(vec3(2.5, -2.5, 5.0), 5.0, sc, vp, NEARP);
+
+ //draw_light(vec3(10.0, -10.0, 10.0), 50.0, sc, vp, NEARP);
glDisable(GL_SCISSOR_TEST);
+
vec4 dir_light(0.1, 1.0, 1.0, 0.0);
dir_light = cam.get_view() * dir_light;
dir_light = normalize(dir_light);
- dir_light.w = 0.3;
- float strength = 0.09;
+ dir_light.w = 0.3;
+ float strength = 0.09;
setup_quad(ambient_prog);
glUniform4fv(glGetUniformLocation(ambient_prog, "u_Light"), 1, &(dir_light[0]));
glUniform1f(glGetUniformLocation(ambient_prog, "u_LightIl"), strength);
+
+ //setup_quad(post_prog2);
draw_quad();
}
else
@@ -758,17 +937,28 @@ void display(void)
setup_quad(diagnostic_prog);
draw_quad();
}
- glDisable(GL_BLEND);
+ //glDisable(GL_BLEND);
+
+ //Stage 3 -- RENDER TO SCREEN
setTextures();
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ bindFBO(2);
+ glUseProgram(post_prog);
+ //glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glEnable(GL_TEXTURE_2D);
- glUseProgram(post_prog);
+ glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, postTexture);
glUniform1i(glGetUniformLocation(post_prog, "u_Posttex"),0);
+
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, specularTexture);
+ glUniform1i(glGetUniformLocation(post_prog, "u_Speculartex"),1);
+
+ glActiveTexture(GL_TEXTURE2);
+ glBindTexture(GL_TEXTURE_2D, positionTexture);
+ glUniform1i(glGetUniformLocation(post_prog, "u_Positiontex"),2);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, random_normal_tex);
@@ -780,7 +970,47 @@ void display(void)
glUniform1i(glGetUniformLocation(post_prog, "u_ScreenHeight"), height);
glUniform1i(glGetUniformLocation(post_prog, "u_ScreenWidth"), width);
+ glUniform1i(glGetUniformLocation(post_prog, "u_DisplayType"), display_type);
+
draw_quad();
+ glDisable(GL_BLEND);
+
+ //Stage 4 One more stage for convotional
+ setTextures();
+ glUseProgram(post_prog2);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_TEXTURE_2D);
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, postTexture2);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_Posttex"),0);
+
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, specularTexture);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_Speculartex"),1);
+
+ glActiveTexture(GL_TEXTURE2);
+ glBindTexture(GL_TEXTURE_2D, positionTexture);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_Positiontex"),2);
+
+ glActiveTexture(GL_TEXTURE3);
+ glBindTexture(GL_TEXTURE_2D, normalTexture);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_Normaltex"),3);
+
+ glActiveTexture(GL_TEXTURE4);
+ glBindTexture(GL_TEXTURE_2D, random_normal_tex);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_RandomNormaltex"),4);
+
+ glActiveTexture(GL_TEXTURE5);
+ glBindTexture(GL_TEXTURE_2D, random_scalar_tex);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_RandomScalartex"),5);
+
+ glUniform1i(glGetUniformLocation(post_prog2, "u_ScreenHeight"), height);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_ScreenWidth"), width);
+ glUniform1i(glGetUniformLocation(post_prog2, "u_DisplayType"), display_type);
+
+ draw_quad();
glEnable(GL_DEPTH_TEST);
updateTitle();
@@ -877,6 +1107,15 @@ void keyboard(unsigned char key, int x, int y) {
case('5'):
display_type = DISPLAY_LIGHTS;
break;
+ case('6'):
+ display_type = DISPLAY_TONE;
+ break;
+ case('7'):
+ display_type = DISPLAY_BLOOM;
+ break;
+ case('8'):
+ display_type = DISPLAY_OCCLUSION;
+ break;
case('0'):
display_type = DISPLAY_TOTAL;
break;
@@ -929,6 +1168,8 @@ int main (int argc, char* argv[])
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
width = 1280;
height = 720;
+ /*width = 1360;
+ height = 768;*/
glutInitWindowSize(width,height);
glutCreateWindow("CIS565 OpenGL Frame");
glewInit();
diff --git a/base/src/main.h b/base/src/main.h
index 0a96a3a..f8f3ee4 100644
--- a/base/src/main.h
+++ b/base/src/main.h
@@ -37,6 +37,7 @@ typedef struct {
std::vector indices;
std::string texname;
glm::vec3 color;
+ glm::vec4 specular;//including the specular color and shiness
} mesh_t;
typedef struct {
@@ -47,6 +48,7 @@ typedef struct {
unsigned int vbo_normals;
unsigned int vbo_texcoords;
glm::vec3 color;
+ glm::vec4 specular;
std::string texname;
} device_mesh_t;
@@ -83,7 +85,10 @@ enum Display {
DISPLAY_POSITION = 2,
DISPLAY_COLOR = 3,
DISPLAY_TOTAL = 4,
- DISPLAY_LIGHTS = 5
+ DISPLAY_LIGHTS = 5,
+ DISPLAY_TONE = 6,
+ DISPLAY_BLOOM = 7,
+ DISPLAY_OCCLUSION = 8
};
char* loadFile(char *fname, GLint &fSize);
diff --git a/before.png b/before.png
new file mode 100644
index 0000000..2c1c34f
Binary files /dev/null and b/before.png differ
diff --git a/numberLights.png b/numberLights.png
new file mode 100644
index 0000000..69df4d1
Binary files /dev/null and b/numberLights.png differ
diff --git a/total.png b/total.png
new file mode 100644
index 0000000..197c08a
Binary files /dev/null and b/total.png differ
diff --git a/totalc.png b/totalc.png
new file mode 100644
index 0000000..42da956
Binary files /dev/null and b/totalc.png differ
diff --git a/withSpecular.png b/withSpecular.png
new file mode 100644
index 0000000..8497c81
Binary files /dev/null and b/withSpecular.png differ
diff --git a/withoutSpecular.png b/withoutSpecular.png
new file mode 100644
index 0000000..fcb9b4a
Binary files /dev/null and b/withoutSpecular.png differ