(f*f)*(3.0-(2.0*f));
  return (-1.0)+(2.0*(mix(mix(hash(i+vec2(0.0,0.0)),hash(i+vec2(1.0,0.0)),u.x),mix(hash(i+vec2(0.0,1.0)),hash(i+vec2(1.0,1.0)),u.x),u.y)));
}
float diffuse(in vec3 n,in vec3 l,in float p){
  return pow((dot(n,l)*0.4)+0.6,p);
}
float specular(in vec3 n,in vec3 l,in vec3 e,in float s){
  float nrm=(s+8.0)/(PI*8.0);
  return pow(max(dot(reflect(e,n),l),0.0),s)*nrm;
}
vec3 getSkyColor(in vec3 c){
  vec3 e=vec3(c.x,((max(c.y,0.0)*0.8)+0.2)*0.18,c.z);
  return (vec3(pow(1.0-e.y,2.0),1.0-e.y,0