#ifdef RCSIDS
static char rcsid[] = "$Id: wood2.sl,v 1.1.2.1 1998-02-06 14:02:32-08 lg Exp $";
#endif
/*
* wood2.sl -- another surface shader for wood.
*
* DESCRIPTION:
* Makes wood solid texture.
*
* PARAMETERS:
* Ka, Kd, Ks, specular, roughness - work just like the plastic shader
* txtscale - overall scaling factor for the texture
* ringscale - scaling for the ring spacing
* lightwood, darkwood - surface colors for the wood itself
* grainy - relative graininess (0 = no fine grain)
*
* AUTHOR: written by Larry Gritz
*
* $Revision: 1.1.2.1 $ $Date: 1998-02-06 14:02:32-08 $
*
* $Log: wood2.sl,v $
* Revision 1.1.2.1 1998-02-06 14:02:32-08 lg
* Converted to "modern" SL with appropriate use of vector & normal types
*
* Revision 1.1 1995-12-05 15:05:47-08 lg
* Initial RCS revision
*
* 19 Jan 1994 -- recoded by lg in correct shading language.
* March 1991 -- original by Larry Gritz
*/
surface
wood2 ( float Ka = 1, Kd = .75, Ks = .4;
float roughness = .1;
color specularcolor = 1;
float ringscale = 15;
float txtscale = 1;
color lightwood = color (0.69, 0.44, 0.25);
color darkwood = color (0.35, 0.22, 0.08);
float grainy = 1; )
{
point PP, PQ; /* shading space point to be computed */
normal Nf; /* forward facing normal */
color Ct; /* surface color of the wood */
float r, r2;
float my_t;
/* Calculate in shader space */
PP = txtscale * transform ("shader", P);
my_t = zcomp(PP) / ringscale;
PQ = point (xcomp(PP)*8, ycomp(PP)*8, zcomp(PP));
my_t += noise (PQ) / 16;
PQ = point (xcomp(PP), my_t, ycomp(PP)+12.93);
r = ringscale * noise (PQ);
r -= floor (r);
r = 0.2 + 0.8 * smoothstep(0.2, 0.55, r) * (1 - smoothstep(0.75, 0.8, r));
/* \/-- extra line added for fine grain */
PQ = point (xcomp(PP)*128+5, zcomp(PP)*8-3, ycomp(PP)*128+1);
r2 = grainy * (1.3 - noise (PQ)) + (1-grainy);
Ct = mix (lightwood, darkwood, r*r2*r2);
/*
* Use the plastic illumination model
*/
Nf = faceforward (normalize(N),I);
Oi = Os;
Ci = Os * ( Ct * (Ka*ambient() + Kd*diffuse(Nf)) +
specularcolor * Ks*specular(Nf,-normalize(I),roughness));
}