home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * slideprojector(): Cast a texture map into a scene as a light source
- */
- light
- RCSlideProjector(
- float fieldofview=PI/32;
- point from = (8, -4, 10),
- to = (0,0,0),
- up = point "eye" (0,1,0);
- string slidename = "",
- shadowname = "" )
- {
- uniform point relT, /* normalized direction vector */
- relU, /* "vertical" perspective of surface point */
- relV; /* "horizontal" perspective of surface point */
- uniform float spread = 1/tan(fieldofview/2); /* spread of "beam" */
- float Pt, /* projection of Ps on relT (distance of
- surface point along light direction) */
- Pu, /* projection of Ps on relU */
- Pv, /* projection of Ps on relU */
- sloc, tloc; /* perspected surface point */
-
- /* Initialize uniform variables for perspective */
- relT = normalize(to - from);
- relU = relT ^ up;
- relV = normalize(relT ^ relU);
- relU = relV^relT;
-
- illuminate(from, relT, atan(sqrt(2)/spread)) {
- L = Ps - from; /* direction of light source from surf. point */
- Pt = L.relT; /* coordinates of Ps along relT, relU, relV */
- Pu = L.relU;
- Pv = L.relV;
- sloc = spread*Pu/Pt; /* perspective divide */
- tloc = spread*Pv/Pt;
- sloc = sloc*.5 + .5; /* correction from [-1,1] to [0,1] */
- tloc = tloc*.5 + .5;
- Cl = color texture(slidename, sloc,tloc);
- if( shadowname != "" )
- Cl *= 1-shadow(shadowname, Ps);
- }
- }
-