// Copyright 2011 Riccardo Monica

#version 400

layout(triangles, equal_spacing, ccw) in;
in vec3 tcPosition[];

in vec3 tcNormal[];
in vec4 tcColor[];
in float tcmatshininess[];
in vec3 tcmatspecular[];

out vec4 tecolor;
out vec3 tePosition;

uniform mat4 modelviewmatrix;

vec4 ApplyLight(in vec4 oColor, in vec3 relativepos, in vec3 normal,
  in vec3 matspecular,in float matshininess);

void main()
  {
  // position
  vec3 p0 = gl_TessCoord.x * tcPosition[0];
  vec3 p1 = gl_TessCoord.y * tcPosition[1];
  vec3 p2 = gl_TessCoord.z * tcPosition[2];
  vec3 position = (p0 + p1 + p2);
    
  // normal
  p0 = gl_TessCoord.x * tcNormal[0];
  p1 = gl_TessCoord.y * tcNormal[1];
  p2 = gl_TessCoord.z * tcNormal[2];
  vec3 normal = p0 + p1 + p2;
  mat3 normalmatrix = mat3(inverse(transpose(modelviewmatrix)));
  normal = normalize(normalmatrix * normal);
    
  // average color, shininess and specular
  vec4 avgcolor = (tcColor[0] + tcColor[1] + tcColor[2]) / 3.0;
  float avgshini = (tcmatshininess[0] + tcmatshininess[1] + tcmatshininess[2]) / 3.0;
  vec3 avgspec = (tcmatspecular[0] + tcmatspecular[1] + tcmatspecular[2]) / 3.0;
    
  // lighting
  vec4 rp4 = modelviewmatrix * vec4(position, 1.0);
  vec3 relativepos = rp4.xyz / rp4.w;
  tecolor = ApplyLight(avgcolor,relativepos,normal,avgspec,avgshini);
    
  tePosition = position;
  }
