/* <copyright>
This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
(c) Copyright 2011 Motorola Mobility, Inc.  All Rights Reserved.
</copyright> */


#ifdef GL_ES
precision highp float;
#endif

// lighting uniforms
uniform vec3 u_lightPos;
uniform vec4 u_lightDiff;
uniform vec4 u_lightAmb;

// diffuse map
uniform sampler2D colMap;

// environment map	
uniform sampler2D envMap;

// normal map
uniform sampler2D normalMap;

//material uniforms
uniform vec4   u_matAmbient;
uniform vec4   u_matDiffuse;
uniform vec4   u_matSpecular;
uniform float  u_matShininess;
uniform vec4   u_matEmission;
uniform float  u_renderGlow;

// varyings
varying vec4 vNormal; // w = texcoord.x
varying vec4 vECPos;  // w = texcoord.y
varying vec3 vEyePos;

void main()
{
  vec4 colMapTexel = vec4(texture2D(colMap, vec2(vNormal.w, vECPos.w)).rgb, 1.0);

  // normal mapping
  vec3 normal = normalize(vNormal.xyz);
  vec3 mapNormal = texture2D(normalMap, vec2(vNormal.w, vECPos.w)).xyz * 2.0 - 1.0;
  mapNormal = normalize(mapNormal.x*vec3(normal.z, 0.0, -normal.x) + vec3(0.0, mapNormal.y, 0.0) + mapNormal.z*normal);
  
  // create envmap coordinates
  vec3 r = reflect( normalize(vec3(vECPos.xyz - vEyePos.xyz)), mapNormal);
  float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + r.z*r.z );
  
  // calculate environment map texel
  vec4 envMapTexel = vec4(texture2D(envMap, vec2(r.x/m + 0.5, r.y/m + 0.5)).rgb, 0.0);
  
  // lighting
  vec3 lightDirection = u_lightPos - vECPos.xyz;
  float lightDist = length(lightDirection);
  lightDirection /= lightDist;
  
  float attenuation = clamp(1.0 - lightDist * 0.01, 0.0, 1.0);
  
  vec3 halfVec = normalize(lightDirection + vEyePos);
  
  float diffuseIntensity = max(0.0, dot(mapNormal, lightDirection));
  float specularModifier = max(0.0, dot(mapNormal, halfVec));
  
  float pf;
  if(diffuseIntensity == 0.0)
	pf = 0.0;
  else
	pf = pow(specularModifier, 76.0);
  
  vec4 ambient = u_matAmbient * u_lightAmb;
  vec4 diffuse = u_matDiffuse * (colMapTexel + envMapTexel);

  if (u_renderGlow <= 0.5)
  	diffuse *= u_lightDiff * diffuseIntensity * attenuation;
  
  vec4 specular = 2.0 * pf * envMapTexel;
  
  gl_FragColor = (colMapTexel*(ambient + diffuse)) + specular + vec4(0.0,0.0,0.0,1.0);
}