28 |
|
|
29 |
|
|
30 |
|
void |
31 |
< |
initstypes() /* initialize source dispatch table */ |
31 |
> |
initstypes(void) /* initialize source dispatch table */ |
32 |
|
{ |
33 |
|
extern VSMATERIAL mirror_vs, direct1_vs, direct2_vs; |
34 |
|
static SOBJECT fsobj = {fsetsrc, flatpart, fgetplaneq, fgetmaxdisk}; |
49 |
|
|
50 |
|
|
51 |
|
int |
52 |
< |
newsource() /* allocate new source in our array */ |
52 |
> |
newsource(void) /* allocate new source in our array */ |
53 |
|
{ |
54 |
|
if (nsources == 0) |
55 |
|
source = (SRCREC *)malloc(SRCINC*sizeof(SRCREC)); |
69 |
|
|
70 |
|
|
71 |
|
void |
72 |
< |
setflatss(src) /* set sampling for a flat source */ |
73 |
< |
register SRCREC *src; |
72 |
> |
setflatss( /* set sampling for a flat source */ |
73 |
> |
SRCREC *src |
74 |
> |
) |
75 |
|
{ |
76 |
|
double mult; |
77 |
< |
register int i; |
77 |
> |
int i; |
78 |
|
|
79 |
< |
src->ss[SV][0] = src->ss[SV][1] = src->ss[SV][2] = 0.0; |
79 |
> |
getperpendicular(src->ss[SU], src->snorm, rand_samp); |
80 |
> |
mult = .5 * sqrt( src->ss2 ); |
81 |
|
for (i = 0; i < 3; i++) |
80 |
– |
if (src->snorm[i] < 0.6 && src->snorm[i] > -0.6) |
81 |
– |
break; |
82 |
– |
src->ss[SV][i] = 1.0; |
83 |
– |
fcross(src->ss[SU], src->ss[SV], src->snorm); |
84 |
– |
mult = .5 * sqrt( src->ss2 / DOT(src->ss[SU],src->ss[SU]) ); |
85 |
– |
for (i = 0; i < 3; i++) |
82 |
|
src->ss[SU][i] *= mult; |
83 |
|
fcross(src->ss[SV], src->snorm, src->ss[SU]); |
84 |
|
} |
85 |
|
|
86 |
|
|
87 |
|
void |
88 |
< |
fsetsrc(src, so) /* set a face as a source */ |
89 |
< |
register SRCREC *src; |
90 |
< |
OBJREC *so; |
88 |
> |
fsetsrc( /* set a face as a source */ |
89 |
> |
SRCREC *src, |
90 |
> |
OBJREC *so |
91 |
> |
) |
92 |
|
{ |
93 |
< |
register FACE *f; |
94 |
< |
register int i, j; |
93 |
> |
FACE *f; |
94 |
> |
int i, j; |
95 |
|
double d; |
96 |
|
|
97 |
|
src->sa.success = 2*AIMREQT-1; /* bitch on second failure */ |
132 |
|
|
133 |
|
|
134 |
|
void |
135 |
< |
ssetsrc(src, so) /* set a source as a source */ |
136 |
< |
register SRCREC *src; |
137 |
< |
register OBJREC *so; |
135 |
> |
ssetsrc( /* set a source as a source */ |
136 |
> |
SRCREC *src, |
137 |
> |
OBJREC *so |
138 |
> |
) |
139 |
|
{ |
140 |
|
double theta; |
141 |
|
|
160 |
|
|
161 |
|
|
162 |
|
void |
163 |
< |
sphsetsrc(src, so) /* set a sphere as a source */ |
164 |
< |
register SRCREC *src; |
165 |
< |
register OBJREC *so; |
163 |
> |
sphsetsrc( /* set a sphere as a source */ |
164 |
> |
SRCREC *src, |
165 |
> |
OBJREC *so |
166 |
> |
) |
167 |
|
{ |
168 |
< |
register int i; |
168 |
> |
int i; |
169 |
|
|
170 |
|
src->sa.success = 2*AIMREQT-1; /* bitch on second failure */ |
171 |
|
src->so = so; |
185 |
|
|
186 |
|
|
187 |
|
void |
188 |
< |
rsetsrc(src, so) /* set a ring (disk) as a source */ |
189 |
< |
register SRCREC *src; |
190 |
< |
OBJREC *so; |
188 |
> |
rsetsrc( /* set a ring (disk) as a source */ |
189 |
> |
SRCREC *src, |
190 |
> |
OBJREC *so |
191 |
> |
) |
192 |
|
{ |
193 |
< |
register CONE *co; |
193 |
> |
CONE *co; |
194 |
|
|
195 |
|
src->sa.success = 2*AIMREQT-1; /* bitch on second failure */ |
196 |
|
src->so = so; |
210 |
|
|
211 |
|
|
212 |
|
void |
213 |
< |
cylsetsrc(src, so) /* set a cylinder as a source */ |
214 |
< |
register SRCREC *src; |
215 |
< |
OBJREC *so; |
213 |
> |
cylsetsrc( /* set a cylinder as a source */ |
214 |
> |
SRCREC *src, |
215 |
> |
OBJREC *so |
216 |
> |
) |
217 |
|
{ |
218 |
< |
register CONE *co; |
219 |
< |
register int i; |
218 |
> |
CONE *co; |
219 |
> |
int i; |
220 |
|
|
221 |
|
src->sa.success = 4*AIMREQT-1; /* bitch on fourth failure */ |
222 |
|
src->so = so; |
234 |
|
/* set sampling vectors */ |
235 |
|
for (i = 0; i < 3; i++) |
236 |
|
src->ss[SU][i] = .5 * co->al * co->ad[i]; |
237 |
< |
src->ss[SV][0] = src->ss[SV][1] = src->ss[SV][2] = 0.0; |
237 |
> |
getperpendicular(src->ss[SW], co->ad, rand_samp); |
238 |
|
for (i = 0; i < 3; i++) |
238 |
– |
if (co->ad[i] < 0.6 && co->ad[i] > -0.6) |
239 |
– |
break; |
240 |
– |
src->ss[SV][i] = 1.0; |
241 |
– |
fcross(src->ss[SW], src->ss[SV], co->ad); |
242 |
– |
normalize(src->ss[SW]); |
243 |
– |
for (i = 0; i < 3; i++) |
239 |
|
src->ss[SW][i] *= .8559 * CO_R0(co); |
240 |
|
fcross(src->ss[SV], src->ss[SW], co->ad); |
241 |
|
} |
242 |
|
|
243 |
|
|
244 |
|
SPOT * |
245 |
< |
makespot(m) /* make a spotlight */ |
246 |
< |
register OBJREC *m; |
245 |
> |
makespot( /* make a spotlight */ |
246 |
> |
OBJREC *m |
247 |
> |
) |
248 |
|
{ |
249 |
< |
register SPOT *ns; |
249 |
> |
SPOT *ns; |
250 |
|
|
251 |
|
if ((ns = (SPOT *)m->os) != NULL) |
252 |
|
return(ns); |
264 |
|
|
265 |
|
|
266 |
|
int |
267 |
< |
spotout(r, s) /* check if we're outside spot region */ |
268 |
< |
register RAY *r; |
269 |
< |
register SPOT *s; |
267 |
> |
spotout( /* check if we're outside spot region */ |
268 |
> |
RAY *r, |
269 |
> |
SPOT *s |
270 |
> |
) |
271 |
|
{ |
272 |
|
double d; |
273 |
|
FVECT vd; |
295 |
|
|
296 |
|
|
297 |
|
double |
298 |
< |
fgetmaxdisk(ocent, op) /* get center and squared radius of face */ |
299 |
< |
FVECT ocent; |
300 |
< |
OBJREC *op; |
298 |
> |
fgetmaxdisk( /* get center and squared radius of face */ |
299 |
> |
FVECT ocent, |
300 |
> |
OBJREC *op |
301 |
> |
) |
302 |
|
{ |
303 |
|
double maxrad2; |
304 |
|
double d; |
305 |
< |
register int i, j; |
306 |
< |
register FACE *f; |
305 |
> |
int i, j; |
306 |
> |
FACE *f; |
307 |
|
|
308 |
|
f = getface(op); |
309 |
|
if (f->area == 0.) |
328 |
|
|
329 |
|
|
330 |
|
double |
331 |
< |
rgetmaxdisk(ocent, op) /* get center and squared radius of ring */ |
332 |
< |
FVECT ocent; |
333 |
< |
OBJREC *op; |
331 |
> |
rgetmaxdisk( /* get center and squared radius of ring */ |
332 |
> |
FVECT ocent, |
333 |
> |
OBJREC *op |
334 |
> |
) |
335 |
|
{ |
336 |
< |
register CONE *co; |
336 |
> |
CONE *co; |
337 |
|
|
338 |
|
co = getcone(op, 0); |
339 |
|
VCOPY(ocent, CO_P0(co)); |
342 |
|
|
343 |
|
|
344 |
|
double |
345 |
< |
fgetplaneq(nvec, op) /* get plane equation for face */ |
346 |
< |
FVECT nvec; |
347 |
< |
OBJREC *op; |
345 |
> |
fgetplaneq( /* get plane equation for face */ |
346 |
> |
FVECT nvec, |
347 |
> |
OBJREC *op |
348 |
> |
) |
349 |
|
{ |
350 |
< |
register FACE *fo; |
350 |
> |
FACE *fo; |
351 |
|
|
352 |
|
fo = getface(op); |
353 |
|
VCOPY(nvec, fo->norm); |
356 |
|
|
357 |
|
|
358 |
|
double |
359 |
< |
rgetplaneq(nvec, op) /* get plane equation for ring */ |
360 |
< |
FVECT nvec; |
361 |
< |
OBJREC *op; |
359 |
> |
rgetplaneq( /* get plane equation for ring */ |
360 |
> |
FVECT nvec, |
361 |
> |
OBJREC *op |
362 |
> |
) |
363 |
|
{ |
364 |
< |
register CONE *co; |
364 |
> |
CONE *co; |
365 |
|
|
366 |
|
co = getcone(op, 0); |
367 |
|
VCOPY(nvec, co->ad); |
370 |
|
|
371 |
|
|
372 |
|
int |
373 |
< |
commonspot(sp1, sp2, org) /* set sp1 to intersection of sp1 and sp2 */ |
374 |
< |
register SPOT *sp1, *sp2; |
375 |
< |
FVECT org; |
373 |
> |
commonspot( /* set sp1 to intersection of sp1 and sp2 */ |
374 |
> |
SPOT *sp1, |
375 |
> |
SPOT *sp2, |
376 |
> |
FVECT org |
377 |
> |
) |
378 |
|
{ |
379 |
|
FVECT cent; |
380 |
|
double rad2, cos1, cos2; |
396 |
|
|
397 |
|
|
398 |
|
int |
399 |
< |
commonbeam(sp1, sp2, dir) /* set sp1 to intersection of sp1 and sp2 */ |
400 |
< |
register SPOT *sp1, *sp2; |
401 |
< |
FVECT dir; |
399 |
> |
commonbeam( /* set sp1 to intersection of sp1 and sp2 */ |
400 |
> |
SPOT *sp1, |
401 |
> |
SPOT *sp2, |
402 |
> |
FVECT dir |
403 |
> |
) |
404 |
|
{ |
405 |
|
FVECT cent, c1, c2; |
406 |
|
double rad2, d; |
420 |
|
|
421 |
|
|
422 |
|
int |
423 |
< |
checkspot(sp, nrm) /* check spotlight for behind source */ |
424 |
< |
register SPOT *sp; /* spotlight */ |
425 |
< |
FVECT nrm; /* source surface normal */ |
423 |
> |
checkspot( /* check spotlight for behind source */ |
424 |
> |
SPOT *sp, /* spotlight */ |
425 |
> |
FVECT nrm /* source surface normal */ |
426 |
> |
) |
427 |
|
{ |
428 |
|
double d, d1; |
429 |
|
|
437 |
|
|
438 |
|
|
439 |
|
double |
440 |
< |
spotdisk(oc, op, sp, pos) /* intersect spot with object op */ |
441 |
< |
FVECT oc; |
442 |
< |
OBJREC *op; |
443 |
< |
register SPOT *sp; |
444 |
< |
FVECT pos; |
440 |
> |
spotdisk( /* intersect spot with object op */ |
441 |
> |
FVECT oc, |
442 |
> |
OBJREC *op, |
443 |
> |
SPOT *sp, |
444 |
> |
FVECT pos |
445 |
> |
) |
446 |
|
{ |
447 |
|
FVECT onorm; |
448 |
|
double offs, d, dist; |
460 |
|
|
461 |
|
|
462 |
|
double |
463 |
< |
beamdisk(oc, op, sp, dir) /* intersect beam with object op */ |
464 |
< |
FVECT oc; |
465 |
< |
OBJREC *op; |
466 |
< |
register SPOT *sp; |
467 |
< |
FVECT dir; |
463 |
> |
beamdisk( /* intersect beam with object op */ |
464 |
> |
FVECT oc, |
465 |
> |
OBJREC *op, |
466 |
> |
SPOT *sp, |
467 |
> |
FVECT dir |
468 |
> |
) |
469 |
|
{ |
470 |
|
FVECT onorm; |
471 |
|
double offs, d, dist; |
481 |
|
|
482 |
|
|
483 |
|
double |
484 |
< |
intercircle(cc, c1, c2, r1s, r2s) /* intersect two circles */ |
485 |
< |
FVECT cc; /* midpoint (return value) */ |
486 |
< |
FVECT c1, c2; /* circle centers */ |
487 |
< |
double r1s, r2s; /* radii squared */ |
484 |
> |
intercircle( /* intersect two circles */ |
485 |
> |
FVECT cc, /* midpoint (return value) */ |
486 |
> |
FVECT c1, /* circle centers */ |
487 |
> |
FVECT c2, |
488 |
> |
double r1s, /* radii squared */ |
489 |
> |
double r2s |
490 |
> |
) |
491 |
|
{ |
492 |
|
double a2, d2, l; |
493 |
|
FVECT disp; |