16 #define TACHYON_INTERNAL 1 28 (
void (*)(
const void *,
const void *,
const void *,
void *))(
light_normal),
51 l->tex->flags = RT_TEXTURE_SHADOWCAST | RT_TEXTURE_ISLIGHT;
72 l->tex->flags = RT_TEXTURE_SHADOWCAST | RT_TEXTURE_ISLIGHT;
96 flt fallstart,
flt fallend) {
105 l->tex->flags = RT_TEXTURE_SHADOWCAST | RT_TEXTURE_ISLIGHT;
107 l->tex->specular=0.0;
150 shadevars->L = li->
dir;
151 shadevars->Llen = FHUGE;
152 VDOT(inten, (shadevars->N), li->
dir)
164 VSUB(li->
ctr, (shadevars->hit), (shadevars->L))
167 len =
SQRT(shadevars->L.x*shadevars->L.x + shadevars->L.y*shadevars->L.y + shadevars->L.z*shadevars->L.z) + EPSILON;
169 shadevars->L.x /= len;
170 shadevars->L.y /= len;
171 shadevars->L.z /= len;
172 shadevars->Llen = len;
174 VDOT(inten, shadevars->N, shadevars->L)
186 VSUB(li->
ctr, (shadevars->hit), (shadevars->L))
189 len =
SQRT(shadevars->L.x*shadevars->L.x + shadevars->L.y*shadevars->L.y + shadevars->L.z*shadevars->L.z) + EPSILON;
191 shadevars->L.x /= len;
192 shadevars->L.y /= len;
193 shadevars->L.z /= len;
194 shadevars->Llen = len;
196 VDOT(inten, shadevars->N, shadevars->L)
198 inten *= li->
spotfunc(li, &shadevars->L);
212 return 1.0 / (li->
Kc + ((li->
Kl + li->
Kq*Llen) * Llen));
243 static int light_bbox(
void * obj, vector * min, vector * max) {
249 flt b, disc, t1, t2, temp;
253 if (ry->flags & RT_RAY_SHADOW)
260 disc=b*b + l->
rad*l->
rad - temp;
262 if (disc<=0.0)
return;
268 ry->add_intersection(t2, (
object *) l, ry);
272 ry->add_intersection(t1, (
object *) l, ry);
278 N->x = pnt->x - l->
ctr.x;
279 N->y = pnt->y - l->
ctr.y;
280 N->z = pnt->z - l->
ctr.z;
282 invlen = 1.0 /
SQRT(N->x*N->x + N->y*N->y + N->z*N->z);
288 if (
VDot(N, &(incident->d)) > 0.0) {
static flt directional_light_shade_diffuse(directional_light *li, shadedata *shadevars)
flt Kq
quadratic attenuation factor
static flt light_complex_attenuation(void *vli, flt Llen)
static flt light_no_falloff(void *vli, vector *L)
flt fallstart
fallof start angle
flt Kl
linear attenuation factor
static flt simple_point_light_shade_diffuse(point_light *li, shadedata *shadevars)
static int light_bbox(void *obj, vector *min, vector *max)
flt rad
point light radius when visible
flt(* attenuationfunc)(void *, flt)
attenuation fctn pointer
flt(* spotfunc)(void *, vector *)
spotlight fctn pointer
RT_OBJECT_HEAD flt(* shade_diffuse)(struct light_t *, shadedata *)
diffuse shading function
static void light_normal(const point_light *l, const vector *pnt, const ray *incident, vector *N)
flt VDot(apivector *a, apivector *b)
point_light * newpointlight(void *tex, vector ctr, flt rad)
static flt light_no_attenuation(void *vli, flt Llen)
double flt
generic floating point number, using double
static object_methods light_methods
flt fallend
fallof end angle
flt Kc
constant attenuation factor
vector ctr
point light position
#define VDOT(return, a, b)
void light_set_attenuation(point_light *li, flt Kc, flt Kl, flt Kq)
RT_OBJECT_HEAD flt(* shade_diffuse)(struct directional_light_t *, shadedata *)
diffuse shading function
static flt light_spotlight_falloff(void *vli, vector *L)
Tachyon cross-platform timers, special math function wrappers, and RNGs.
vector spotdir
spotlight direction
point_light * newspotlight(void *tex, vector ctr, flt rad, vector dir, flt fallstart, flt fallend)
static flt point_light_shade_diffuse(point_light *li, shadedata *shadevars)
static void light_intersect(const point_light *l, ray *ry)
RT_OBJECT_HEAD flt(* shade_diffuse)(struct point_light_t *, shadedata *)
diffuse shading function
Tachyon public API function prototypes and declarations used to drive the ray tracing engine...
vector dir
lighting direction
directional_light * newdirectionallight(void *tex, vector dir)
void free_light_special(void *voidlight)