/* paisley.sl * * creates two layers of paisleys with a third dotted layer * taking the usual parameters */ #include "/usr/local/accad/shaders/rmannotes.sl" surface paisley( float hfreq1 = 4, vfreq1 = 4, hfreq2 = 3, vfreq2 = 3; float angle1 = 0.5, angle2 = 0.0; float Ka = 0.5, Kd = 0.5, Ks = 0.5, roughness = 0.1; color specularcolor = 1; ) { color surface_color, layer_color; color surface_opac, layer_opac; float fuzz = 0.025; point center1, center2, center3; float radius1, radius2, radius3; float d1, d2, d3; float x1, y1, lo1, lo2, lo3; float ss, tt, sss, ttt; /* background layer */ surface_color = Cs; surface_opac = Os; /* lower paisley layer */ layer_color = color (0.5, 0.1, 0.95); x1 = noise(s)*0.5; sss = repeat(s, hfreq1); ttt = repeat(t, vfreq1); rotate2d(sss, ttt, angle1, 0.5, 0.5, ss, tt); center1 = (0.5, 0.5, 0.0); radius1 = 0.5; d1 = distance(center1, (ss, tt, 0)); center2 = (x1, 0.5, 0.0); radius2 = x1; d2 = distance(center2, (ss, tt, 0)); center3 = (0.5 + x1, 0.5, 0.0); radius3 = 0.5 - x1; d3 = distance(center3, (ss, tt, 0)); lo1 = (1 - smoothstep(radius1 - fuzz, radius1, d1)) * (1 - smoothstep(0.5 - fuzz, 0.5, tt)); lo2 = 1 - smoothstep(radius2 - fuzz, radius2, d2); lo3 = 1 - smoothstep(radius3 - fuzz, radius3, d3); layer_opac = difference(union(lo1, lo2), lo3); surface_color = blend(surface_color, layer_color, layer_opac); /* upper paisley layer */ layer_color = color (0.1, 0.05, 0.95); x1 = noise(t)*0.5; sss = repeat(-s, hfreq2); ttt = repeat(-t, vfreq2); rotate2d(sss, ttt, angle2, 0.5, 0.5, ss, tt); center1 = (0.5, 0.5, 0.0); radius1 = 0.5; d1 = distance(center1, (ss, tt, 0)); center2 = (x1, 0.5, 0.0); radius2 = x1; d2 = distance(center2, (ss, tt, 0)); center3 = (0.5 + x1, 0.5, 0.0); radius3 = 0.5 - x1; d3 = distance(center3, (ss, tt, 0)); lo1 = (1 - smoothstep(radius1 - fuzz, radius1, d1)) * (1 - smoothstep(0.5 - fuzz, 0.5, tt)); lo2 = 1 - smoothstep(radius2 - fuzz, radius2, d2); lo3 = 1 - smoothstep(radius3 - fuzz, radius3, d3); layer_opac = difference(union(lo1, lo2), lo3)*0.5; surface_color = blend(surface_color, layer_color, layer_opac); /* dot layer */ layer_color = color (0.596, 0.984, 0.596); center1 = (x1, 0.5, 0); radius1 = x1 / 5.0; d1 = distance(center1, (ss, tt, 0)); layer_opac = (1 - smoothstep(radius1 - fuzz, radius1, d1))* 0.8; surface_color = blend(surface_color, layer_color, layer_opac); /* output */ Oi = surface_opac; Ci = surface_opac * surface_color * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks * specular(Nf, V, roughness); }