#include "rmannotes.sl" surface cavity_c (float freq=4, Ks=.75, Kd=.25, Ka=.2, roughness=.15; color specularcolor=color(1,1,1), interstitial_color=color(.303, .409,.258), vein_color=color(1,0,0); float texfreq=35) { /* ILLUMINATION VARS */ color spec, amb, diff; point Nf, V; /* COLOR VARS */ color surface_color, layer_color; color surface_opac, layer_opac; /* TURBULENCE VARS */ float turb, turb1, turb2, f; /* SURFACE POINT VARS */ float ss, tt, radius, d, fuzz, noi, noiscale, noifreq; float col, row, tilenoi; point center; turb = 0; /* INITIAL SURFACE PARAMETERS - USE USER SETTINGS */ surface_color = interstitial_color; surface_opac = Os; /* ILLUMINATION CALCULATIONS */ Nf = faceforward(normalize(N), I); V = -normalize(I); amb = Ka * ambient(); diff = Kd * diffuse(Nf); spec = Ks * specularcolor * specular(Nf, V, roughness); /* %%%%%%%%%%%%%%%%%%%%%%%% PURE STOCHASTIC PATTERN (TURBULENCE) */ /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AND SOLID TEXTURE */ /* CALCULATE TURBULENCE */ for (f = 1; f < freq; f *= 2) turb += abs(snoise(P * f + 4*PI)) / f; turb1 = pow(1-turb, 2); turb2 = pow(turb, 4); /* VEINS */ layer_opac = turb1; layer_color = vein_color * (amb+diff); surface_color = blend(surface_color, layer_color, layer_opac); /* INTERSTITIAL SPACES */ layer_opac = turb2; layer_color = color(1,1,1) * (amb + diff) + spec; surface_color = blend(surface_color, layer_color, layer_opac); /* TINY BUMPS */ fuzz = .05; noiscale = .2; noifreq = 40; noi = noise(s * noifreq, t * noifreq); /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PERTURBED REGULAR PATTERNS */ ss = s + snoise(noi + 325) * noiscale; tt = t + snoise(noi + 325) * noiscale; ss=repeat(s, texfreq); tt=repeat(t, texfreq); /* base seed to udn on current row and column of tile */ col = whichtile(s, texfreq); row = whichtile(t, texfreq); tilenoi = noise(col * 10 + 0.5, row * 10 + 0.5); radius = .3; center = (.5 + snoise(noi + 2), .5 + snoise(noi + 24), 0); d = distance(center, (ss,tt,0)); /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BOMBING */ /* generate tile only 30% of time */ if (udn(tilenoi * 234, 0, 1) > 0.7) { layer_opac = turb2 * (1-smoothstep(radius - fuzz, radius, d)); layer_color = color(udn(tilenoi * 343, 0, 1), udn(tilenoi * 6222, 0, 1), udn(tilenoi * 23, 0, 1)); surface_color = blend(surface_color, layer_color, layer_opac); } /* output */ Oi = surface_opac; Ci = surface_opac * surface_color; }