#include "rmannotes.sl" surface dispIllum(float lineR=0.15, domeR=0.4, bumpR=0.15, Ka=1, line_Kd=.4, line_Ks=0.8, line_rough=0.05, dome_Kd=.9, dome_Ks=0.1, dome_rough=0.8, bump_Kd=.5, bump_Ks=0.5, bump_rough=0.3) { float fuz = 0.05, d, max_height, R; float layer_mag, surface_mag=0; float layer_Kd, layer_Ks, layer_rough; float surface_Kd=1, surface_Ks=.5, surface_rough=.3; color surface_color = 1, layer_color, layer_opac; /**************************************************************/ /* line layer */ max_height = lineR; point p1 = point (-0.25, 0.5, 0); /* left high */ point p2 = point (1.25, 0.5, 0); /* right low */ d = ptlined(p1, p2, point(s, t, 0)); layer_color = color(.8, .6, .2); layer_opac = 1 - smoothstep(lineR - fuz, lineR, d); /* line */ layer_mag = max_height * (1-pow(clamp(d/lineR,0,1),2)); layer_Kd = line_Kd; layer_Ks = line_Ks; layer_rough = line_rough; surface_color = blend(surface_color, layer_color, layer_opac); surface_mag = max(layer_mag, surface_mag); surface_Kd = blend(surface_Kd, layer_Kd, comp(layer_opac,0)); surface_Ks = blend(surface_Ks, layer_Ks, comp(layer_opac,0)); surface_rough = blend(surface_rough, layer_rough, comp(layer_opac,0)); color line_opac = layer_opac; /* note: store for later use below */ /**************************************************************/ /* bump layer */ float freq = 3; float ss = repeat(s, freq); float tt = repeat(t, freq); d = distance(point(.5,.5,0), point(ss,tt,0)); /* dist from center */ max_height = bumpR/freq; layer_color = color(.1, .3, .9); layer_opac = 1 - smoothstep(bumpR-fuz, bumpR, d); /* circle */ layer_mag = max_height * (1-smoothstep(0, bumpR, d)); layer_Kd = bump_Kd; layer_Ks = bump_Ks; layer_rough = bump_rough; /* kill blue bumps outside the gold lines! */ layer_opac *= line_opac; layer_mag *= comp(line_opac, 0); surface_color = blend(surface_color, layer_color, layer_opac); surface_mag += layer_mag; surface_Kd = blend(surface_Kd, layer_Kd, comp(layer_opac,0)); surface_Ks = blend(surface_Ks, layer_Ks, comp(layer_opac,0)); surface_rough = blend(surface_rough, layer_rough, comp(layer_opac,0)); /**************************************************************/ /* dome layer */ d = distance(point(.5,.5,0), point(s,t,0)); /* dist from center */ max_height = domeR; layer_color = color(.8, .6, .2); layer_opac = 1 - step(domeR, d); /* circle of color */ layer_mag = max_height * (0.5+0.5*cos(clamp(d/domeR,0,1)*PI)); layer_Kd = dome_Kd; layer_Ks = dome_Ks; layer_rough = dome_rough; if(layer_mag > surface_mag) { /* only use color if layer is on top */ surface_color = blend(surface_color, layer_color, layer_opac); surface_mag = max(layer_mag, surface_mag); surface_Kd = blend(surface_Kd, layer_Kd, comp(layer_opac,0)); surface_Ks = blend(surface_Ks, layer_Ks, comp(layer_opac,0)); surface_rough = blend(surface_rough, layer_rough, comp(layer_opac,0)); } /**************************************************************/ /* displace point */ vector Nn = normalize(N); normal Nf = faceforward (normalize(N),I); P += Nn * (surface_mag / length(vtransform("shader", Nn))); /**************************************************************/ /* calculate layer lighting using new P location */ N = calculatenormal(P); Nf = faceforward (normalize(N),I); surface_color = surface_color * (Ka*ambient() + surface_Kd*diffuse(Nf)) + surface_Ks*specular(Nf, -normalize(I), surface_rough); /**************************************************************/ Ci = surface_color; }