/* 
  Dan Schneider
  Andrew Sun
 
  Project 2
 
  wallpaper shader.

  alternating stripe and column of dots in between

 */

surface
wallpaper ( float Ka = 1, Kd = 1;
	color wallcolor = (.7, .7, .2);
	float cSpacing = .5;  //space between columns
	/*
	  info on dot
	*/
	color dotcolor = (0, 0, 1);
	float dotradius = .2;
	float dSpacing = 1; //space between dots.

	/*
	  info on stripe
	*/
	float stripewidth = .3;
	color stripecolor = (0, 1, 1);

	   )
{
  normal Nf;
  float inCircle;
  float inStripe;
  float ucenter,vcenter;
  float u1,v1, uTemp, vTemp;
  float ucircle, vcircle, rcircle;
  color cTemp;
  
  uTemp = abs(u);
  vTemp = abs(v);

  u1 = mod (uTemp, cSpacing);
  v1 = mod (vTemp, dSpacing);
  
  /*
   calculate the center
   various test cases used because mod returns a positive value.
  */

  if (u1 < cSpacing/2) {
    ucenter = uTemp - u1;
  } else {
    ucenter = uTemp - (u1 - cSpacing);
  }
  
  if (v1 < dSpacing/2) {
    vcenter = vTemp - v1;
  } else {
    vcenter = vTemp - (v1 - dSpacing);
  }
 
  /*
    calculate if point is in circle
    ucircle + vcircle <= rcircle
    (u^2)   + (v^2)   <= (r^2)
  */
  ucircle = (ucenter - uTemp)*(ucenter - uTemp);
  vcircle = (vcenter - vTemp)*(vcenter - vTemp);
  rcircle = dotradius*dotradius;
 
  inCircle = 0;
  
  if (ucircle + vcircle <= rcircle) {
    if (mod (ucenter/cSpacing,2) == 1) {
      inCircle = 1;
    }
  }
  
  inStripe = 0;
  if (mod (ucenter/cSpacing,2) == 0) {
      if (abs(ucenter - uTemp) < stripewidth/2) {
        inStripe = 1;
      }
  }
  
  cTemp = wallcolor;
  if (inCircle == 1) {
    cTemp = dotcolor;
  }
  if (inStripe == 1) {
    cTemp = stripecolor;
  }

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