/* 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 */ }