/*========== Celtic Braid Shader ==========*/ /*========== by Brandon Onstott ==========*/ /*========== ==========*/ /*========== Uses ptlined() function to ==========*/ /*========== create a three-strand repeatable ==========*/ /*========== braid. Can switch between ==========*/ /*========== cartesian and polar coordinates. ==========*/ /*========== ==========*/ /*========== February 11, 1999 ==========*/ /*========== VIZA 616 - Rendering and Shading ==========*/ /*========== Visualization Laboratory ==========*/ #include "rmannotes.sl" surface celtic_noise ( float Ks = 0.50, Kd = 0.50, Ka = 1.00, roughness = 0.10; color specularcolor = 1.00; float linewidth = 0.10, fuzz = 0.01, freq = 10.00, rmin = 0.20, rmax = 0.45, rndm = 0.00, rdmf = 10.00, POLAR = 0.00 ) { normal Nf; vector V; point Ps, Psh; point l1a = point( 1.333, 0.8, 0); point l1b = point( 0.833, 0.2, 0); point l2a = point( 1.167, 0.2, 0); point l2b = point( 0.667, 0.8, 0); point l3a = point( 1.000, 0.8, 0); point l3b = point( 0.500, 0.2, 0); point l4a = point( 0.833, 0.2, 0); point l4b = point( 0.333, 0.8, 0); point l5a = point( 0.667, 0.8, 0); point l5b = point( 0.167, 0.2, 0); point l6a = point( 0.500, 0.2, 0); point l6b = point( 0.000, 0.8, 0); point l7a = point( 0.333, 0.8, 0); point l7b = point(-0.167, 0.2, 0); point l8a = point( 0.167, 0.2, 0); point l8b = point(-0.333, 0.8, 0); point l9a = point( 0.000, 0.8, 0); point l9b = point(-0.500, 0.2, 0); color surface_color, surface_opac, layer_color, layer_opac; color color1, color2, color3; float ss, tt, r, theta, rfreq; surface_color = color(0,0,0); surface_opac = 0.0; color1 = Cs; color2 = Cs * .66; color3 = Cs * .33; Psh = transform("shader", P); ss = repeat(s, freq); tt = repeat(t, freq); /*============ POLAR COORDINATES ===================*/ if(POLAR == 1){ rfreq = freq * 0.158333; ss = s-0.5; tt = t-0.5; topolar2d(ss, tt, r, theta); tt = (r - rmin) * (1.0/(rmax-rmin)); ss = repeat(theta, rfreq); } /*====================================================*/ Ps = point(ss,tt,0) + rndm*(0.5 - vector(noise(Psh*rdmf))); /* LINE 1 */ layer_color = color1; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l1a,l1b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 2 */ layer_color = color2; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l2a,l2b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 3 */ layer_color = color3; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l3a,l3b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 4 */ layer_color = color1; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l4a,l4b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 5 */ layer_color = color2; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l5a,l5b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 6 */ layer_color = color3; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l6a,l6b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 7 */ layer_color = color1; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l7a,l7b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 8 */ layer_color = color2; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l8a,l8b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); /* LINE 9 */ layer_color = color3; layer_opac = 1.0 - smoothstep(linewidth, linewidth+fuzz, ptlined(l9a,l9b,Ps)); surface_color = blend(surface_color, layer_color, layer_opac); surface_opac = union(surface_opac, layer_opac); Nf = faceforward( normalize(N), I ); V = -normalize(I); Oi = surface_opac; Ci = Oi * ( surface_color * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks * specular(Nf,V,roughness) ); }