// Copyright 2011 Riccardo Monica

#version 120

uniform vec2 initC;
uniform int numIter;

varying vec3 veyeposition;
varying vec3 vnormal;

varying vec3 oPosition;

vec4 ApplyLight(in vec4 oColor, in vec3 relativepos, in vec3 normal,in vec3 matspecular,in float matshininess);
  
vec2 Fractal(float x,float y)
  {
  vec2 c = initC;
  vec2 z = vec2(x,y);
  
  for (int i = 0; i < numIter; i++)
    {
    vec2 qr = vec2(z.x*z.x - z.y*z.y,2.0*z.x*z.y);
    z = qr + c;
	
    if (abs(dot(z,z)) > 30.0)
      return max(z / (abs(z.x) + abs(z.y)),vec2(0.0,0.0));
    }
	
  return vec2(0.5,0.5);
  }

void main()
  {
  vec2 f = Fractal(oPosition.x,oPosition.y);
  
  vec3 color = f.x * vec3(0.0,1.0,0.0) + f.y * vec3(0.0,0.0,1.0);
  color = clamp(color,0.0,1.0);

  vec4 rs = ApplyLight(vec4(color,1.0),veyeposition,normalize(vnormal),vec3(0.0,0.0,0.0),16.0);
  
  gl_FragColor = rs;
  }
