/* * * Basic woven pattern that allows user to control density of weave (frequency) * Can also control weft_color and warp_color independently * */ #include "rmannotes.sl" surface woven_surf(color specularcolor = 1; float Ka = .6, Kd = 0.6, Ks = 0.4, roughness = 0.3; float freq = 30; color warp_color = color (.652, .598, .524), weft_color = color (.303, .226, .164)) { color surface_color, layer_color; color surface_opac, layer_opac; color warm_white = color (1, .971, .936); color brown = color (.303, .226, .164); color beige = color (.652, .598, .524); float fuzz = 0.025; float ss, tt; float row, col; point center; float radius; float d; point Nf, V; color amb, diff, spec; /* background layer */ surface_color = color (0, 0, 0); surface_opac = Os; /* repeat pattern in the following layers 'freq' times horizontally & vertically */ ss = repeat(s, freq); tt = repeat(t, freq); col = whichtile(s, freq); row = whichtile(t, freq); if (even(row) && odd(col) || even(col) && odd(row)) { /* horizontal bar */ layer_color = weft_color; layer_opac = pulse(0.2, 0.8, fuzz, ss); surface_color = blend(surface_color, layer_color, layer_opac); /* vertical bar */ layer_color = warp_color; layer_opac = pulse(0.2, 0.8, fuzz, tt); surface_color = blend(surface_color, layer_color, layer_opac); } else { /* vertical bar */ layer_color = warp_color; layer_opac = pulse(0.2, 0.8, fuzz, tt); surface_color = blend(surface_color, layer_color, layer_opac); /* horizontal bar */ layer_color = weft_color; layer_opac = pulse(0.2, 0.8, fuzz, ss); surface_color = blend(surface_color, layer_color, layer_opac); } /* illum */ Nf = faceforward(normalize(N), I); V = -normalize(I); amb = surface_color * Ka * ambient(); diff = surface_color * Kd * diffuse(Nf); spec = specularcolor * Ks * specular(Nf, V, roughness); surface_color = (amb + diff + spec); /* output */ Oi = surface_opac; Ci = surface_opac * surface_color; }