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