/* Copyrighted Pixar 1989 */
/* From the RenderMan Companion p.351 */
/* Listing 16.15  Surface shader providing wood-grain texture */

/*
 * wood(): calculate a solid wood texture using noise()
 *
 */
surface
wood (
	float ringscale = 10;
	color lightwood = color (0.3, 0.12, 0.03),
	      darkwood  = color (0.05, 0.01, 0.005);
	float Ka        = 0.2,
	      Kd        = 0.4,
		  Ks        = 0.6,
		  roughness = 0.1)
{
	point NN, V;
	point PP;
	float y, z, r;
	
	/* 
	 * Compute the forward-facing normal NN and the vector
	 * toward the ray orgigin V, both normalized.
	 * These vectors are used by "specular" and "diffuse". */
	NN = faceforward(normalize (N), I);
	V = -normalize(I);
	
	PP = transform("shader", P);
	PP += noise(PP);
	
	/* compute radial distance r from PP to axis of "tree" */
	y = ycomp (PP);
	z = zcomp (PP);
	r = sqrt (y*y + z*z);
	
	/* map radial distance r nto ring position [0, 1] */
	r *= ringscale;
	r += abs (noise(r));
	r -= floor (r);         /* == mod (r, 1) */
	
	/* use ring poisition r to select wood color */
	r = smoothstep (0, 0.8, r) - smoothstep (0.83, 1.0, r);
	Ci = mix(lightwood, darkwood, r);
	
	/* shade using r to vary shininess */
	Oi = Os;
	Ci = Oi * Ci * (Ka * ambient() + Kd * diffuse(NN))
	 + (0.3 * r + 0.7) * Ks * specular (NN, V, roughness);
}
