/*
  Dan Schneider
  Andrew Sun
 
  Project 2
 
  a grill shader

  light passes through the holes

 */

surface
grille ( float Ka = 1, Kd = 1;
	/*
	  size of the hole
	*/
	float holeradius = .1;
	/*
	  spacing between dots
	*/
	float spacing = .5;
	   )
{
  normal Nf;
  float inCircle;
  float ucenter,vcenter;
  float u1,v1;
  float ucircle, vcircle, rcircle;
  
  u1 = mod (u, spacing);
  v1 = mod (v, spacing);
  
  /*
   calculate the center
   various test cases used because mod returns a positive value.
  */
  if (u < 0) {
    if (u1 < spacing/2) {
      ucenter = u + u1;
    } else {
      ucenter = u + (u1 - spacing);
    }
  }  else {
    if (u1 < spacing/2) {
      ucenter = u - u1;
    } else {
      ucenter = u - (u1 - spacing);
    }
  }
  if (v < 0) {
    if (v1 < spacing/2) {
      vcenter = v + v1;
    } else {
      vcenter = v + (v1 - spacing);
    }
  }  else {
    if (v1 < spacing/2) {
      vcenter = v - v1;
    } else {
      vcenter = v - (v1 - spacing);
    }
  } 

  /*
    calculate if point is in circle
    ucircle + vcircle <= rcircle
    (u^2)   + (v^2)   <= (r^2)
  */
  ucircle = (ucenter - u)*(ucenter - u);
  vcircle = (vcenter - v)*(vcenter - v);
  rcircle = holeradius*holeradius;
  if (ucircle + vcircle <= rcircle) {
    inCircle = 1;
  } else {
    inCircle = 0;
  }

  if (inCircle != 0) {
    Os = 0;
  } else {
    Os = 1;
  }

  Nf = faceforward (normalize(N),I);
  /*
    incident ray color
  */
  Ci = Cs*(Ka * ambient() + Kd * diffuse(Nf));
  /*
    incident ray opacity
  */
  Oi = Os;  /* = surface opacity */
}