/* Eric Zimmerman description: This solid texture shader is designed to simulate a block with three pictures on it: a smiley face, an X, and a radioactive warning sign. parameters: The colors of all of the elements can be changed, as well as standard matte optical parameters. */ #include "rmannotes.sl" surface final2(float Ka = 1, Kd = 1, freq = 1; color smiley = color (1, 1, 0), big_x = color (1, 0, 0), radioactive = color (0, 1, 1), outline = color (0, 0, 0), block = color (1, 1, 1), edges = color (0, 0, 1)) { point Nf, PP; color paper, ink; float opac; float r, fuzz, d, d2, box; float a, b, c, e, circle, lw; float draw1, draw2, draw3, draw4, z1, z2, z3, z4; Nf = faceforward(normalize(N), I); paper = block; PP = transform("shader", P); /* DRAW SMILEYFACE*/ /* black outline */ r = .35; fuzz = .01; d = distance ((0, 0, 0), (xcomp(PP), ycomp(PP), 0)); ink = outline; opac = 1- smoothstep(r-fuzz, r+fuzz, d); paper = mix(paper, ink, opac); /* yellow circle */ r = .325; ink = smiley; d = distance ((0, 0, 0), (xcomp(PP), ycomp(PP), 0)); opac = 1- smoothstep(r-fuzz, r+fuzz, d); paper = mix (paper, ink, opac); /* smile */ ink = outline; d = distance ((0, 0, 0), (xcomp(PP), ycomp(PP), 0)); a = pulse(ycomp(PP), -.49, .49, .001); e = pulse(xcomp(PP), -.49, 0, .001); box = union(a, e); b = pulse (d, .23, .2515, .01); opac = intersection(b, box); paper = mix (paper, ink, opac); /* eyes */ r = .03; fuzz = .01; ink = outline; d = distance ((.14, -.075, 0),(xcomp(PP), ycomp(PP), 0)); d2 = distance ((-.14, -.075, 0),(xcomp(PP), ycomp(PP), 0)); opac = union(1- smoothstep(r-fuzz, r+fuzz, d), 1- smoothstep(r-fuzz, r+fuzz, d2)); paper = mix (paper, ink, opac); /* DRAW THE X */ fuzz = 0.01; lw = 0.05; /* main lines */ ink = color big_x; d = ptlined((-.3, -.3, 0), (.3, .3, 0), (ycomp(PP), zcomp(PP), 0)); d2 = ptlined((-.3, .3, 0), (.3, -.3, 0), (ycomp(PP), zcomp(PP), 0)); a = 1- smoothstep(lw - fuzz, lw + fuzz, d); b = 1- smoothstep(lw - fuzz, lw + fuzz, d2); opac = union(a, b); paper = mix(paper, ink, opac); /* seraphs */ d = ptlined((-.35, .3, 0), (-.15, .3, 0), (ycomp(PP), zcomp(PP), 0)); d2 = ptlined((.35, .3, 0), (.15, .3, 0), (ycomp(PP), zcomp(PP), 0)); a = 1- smoothstep(lw - fuzz, lw + fuzz, d); b = 1- smoothstep(lw - fuzz, lw + fuzz, d2); opac = union(a, b); paper = mix(paper, ink, opac); d = ptlined((-.35, -.3, 0), (-.15, -.3, 0), (ycomp(PP), zcomp(PP), 0)); d2 = ptlined((.35, -.3, 0), (.15, -.3, 0), (ycomp(PP), zcomp(PP), 0)); a = 1- smoothstep(lw - fuzz, lw + fuzz, d); b = 1- smoothstep(lw - fuzz, lw + fuzz, d2); opac = union(a, b); paper = mix(paper, ink, opac); /* DRAW RADIOACTIVE SIGN */ r = .3; fuzz = .01; /* lower triangle */ for (a = 0; a < .72; a = a+.05) { ink = radioactive; d = distance ((0, 0, 0), (zcomp(PP), xcomp(PP), 0)); ink = radioactive; circle = 1- smoothstep(r-fuzz, r+fuzz, d); lw = .02; fuzz = .0033333; b = (-.34 + a); d = ptlined((0, -.01, 0), (b, -.48, 0), (zcomp(PP), xcomp(PP), 0)); draw1 = 1- smoothstep(lw - fuzz, lw + fuzz, d); opac = intersection(circle, draw1); paper = mix(paper, ink, opac); } /* upper triangles */ for (a = 0; a < .9; a = a+.05) { d = distance ((0, 0, 0), (zcomp(PP), xcomp(PP), 0)); ink = radioactive; circle = 1- smoothstep(r-fuzz, r+fuzz, d); b = a; d = ptlined((0, .01, 0), (-.48, b, 0), (zcomp(PP), xcomp(PP), 0)); draw1 = 1- smoothstep(lw - fuzz, lw + fuzz, d); d = ptlined((0, .01, 0), (.48, b, 0), (zcomp(PP), xcomp(PP), 0)); draw2 = 1- smoothstep(lw - fuzz, lw + fuzz, d); draw3 = union(draw1, draw2); opac = intersection(circle, draw3); paper = mix(paper, ink, opac); } /* outline circle */ ink = outline; d = distance((0, 0, 0), (zcomp(PP), xcomp(PP), 0)); opac = pulse(d, .32, .36, .01); paper = mix (paper, ink, opac); /* DRAW BLOCK EDGES */ a = 1; b = .45; c = -1; d = -.45; fuzz = .01; ink = edges; draw1 = pulse (xcomp(PP), b, a, fuzz); draw2 = pulse (xcomp(PP), c, d, fuzz); draw3 = pulse (ycomp(PP), b, a, fuzz); draw4 = pulse (ycomp(PP), c, d, fuzz); z1 = intersection(draw1, draw3); z2 = intersection(draw1, draw4); z3 = intersection(draw2, draw3); z4 = intersection(draw2, draw4); opac = union(union(z1, z2), union(z3, z4)); paper = mix (paper, ink, opac); draw1 = pulse (ycomp(PP), b, a, fuzz); draw2 = pulse (ycomp(PP), c, d, fuzz); draw3 = pulse (zcomp(PP), b, a, fuzz); draw4 = pulse (zcomp(PP), c, d, fuzz); z1 = intersection(draw1, draw3); z2 = intersection(draw1, draw4); z3 = intersection(draw2, draw3); z4 = intersection(draw2, draw4); opac = union(union(z1, z2), union(z3, z4)); paper = mix (paper, ink, opac); draw1 = pulse (zcomp(PP), b, a, fuzz); draw2 = pulse (zcomp(PP), c, d, fuzz); draw3 = pulse (xcomp(PP), b, a, fuzz); draw4 = pulse (xcomp(PP), c, d, fuzz); z1 = intersection(draw1, draw3); z2 = intersection(draw1, draw4); z3 = intersection(draw2, draw3); z4 = intersection(draw2, draw4); opac = union(union(z1, z2), union(z3, z4)); paper = mix (paper, ink, opac); Oi = Os; Ci = Os * paper * (Ka * ambient() + Kd * diffuse(Nf)); }