// Copyright 2011 Riccardo Monica

#version 120
#extension GL_EXT_geometry_shader4: enable

varying out float gmatshininess;
varying out vec3 gmatspecular;
varying out vec3 geyeposition;
varying out vec3 gnormal;

varying in float vmatshininess[3];
varying in vec3 vmatspecular[3];
varying in vec3 veyeposition[3];
varying in vec3 vnormal[3];

const float epsilon = 0.01;

void main()
  {
  gl_BackColor = vec4(0.0,0.0,0.0,1.0);

  vec3 diff1 = veyeposition[0] - veyeposition[1];
  vec3 diff2 = veyeposition[1] - veyeposition[2];
  vec3 diff3 = veyeposition[2] - veyeposition[0];

  float lenq1 = dot(diff1,diff1);
  float lenq2 = dot(diff2,diff2);
  float lenq3 = dot(diff3,diff3);

  int equals = 0;

  if (abs(lenq1 - lenq2) < epsilon)
    equals++;

  if (abs(lenq2 - lenq3) < epsilon)
    equals++;

  if (abs(lenq3 - lenq1) < epsilon)
    equals++;

  // all obtuse ones are blue, but isosceles are more blue than others
  bool obtuse = lenq1 + lenq2 < lenq3 || lenq2 + lenq3 < lenq1 || lenq3 + lenq1 < lenq2;

  // all right ones are red, but isosceles are more red than others
  bool right = abs(lenq1 + lenq2 - lenq3) < epsilon || abs(lenq1 + lenq3 - lenq2) < epsilon || abs(lenq3 + lenq2 - lenq1) < epsilon;

  // isosceles:             right: red               obtuse: blue                     otherwise: yellow
  if (equals == 1)
    gl_FrontColor = right ? vec4(0.9,0.0,0.0,1.0) : (obtuse ? vec4(0.0,0.0,0.9,1.0) : vec4(0.9,0.9,0.0,1.0));

  // scalene:               right: dark red          obtuse: dark blue                otherwise: green
  if (equals == 0)
    gl_FrontColor = right ? vec4(0.3,0.0,0.0,1.0) : (obtuse ? vec4(0.0,0.0,0.3,1.0) : vec4(0.0,0.9,0.0,1.0));

  // equilateral: orange
  if (equals > 1)
    gl_FrontColor = vec4(0.9,0.5,0.0,1.0);

  for (int i = 0; i < 3; i++)
    {
    gl_Position = gl_PositionIn[i];
    
    gmatshininess = vmatshininess[i];
    gmatspecular = vmatspecular[i];
    geyeposition = veyeposition[i];
    gnormal = vnormal[i];
    
    EmitVertex();
    }
    
  EndPrimitive();
  }
