ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/source.h
Revision: 1.15
Committed: Mon Oct 21 14:27:34 1991 UTC (32 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.14: +1 -1 lines
Log Message:
changed maximum sampling and strategy

File Contents

# Content
1 /* Copyright (c) 1986 Regents of the University of California */
2
3 /* SCCSid "$SunId$ LBL" */
4
5 /*
6 * source.h - header file for ray tracing sources.
7 *
8 * 8/20/85
9 */
10
11 #define AIMREQT 100 /* required aim success/failure */
12
13 #define SDISTANT 01 /* source distant flag */
14 #define SSKIP 02 /* source skip flag */
15 #define SPROX 04 /* source proximity flag */
16 #define SSPOT 010 /* source spotlight flag */
17 #define SVIRTUAL 020 /* source virtual flag */
18 #define SFLAT 040 /* source flat flag */
19 #define SCYL 0100 /* source cylindrical flag */
20 #define SFOLLOW 0200 /* source follow path flag */
21
22 typedef struct {
23 FVECT aim; /* aim direction or center */
24 float siz; /* output solid angle or area */
25 float flen; /* focal length */
26 } SPOT; /* spotlight */
27
28 typedef struct {
29 int sflags; /* source flags */
30 FVECT sloc; /* direction or position of source */
31 FVECT ss[3]; /* source dimension vectors, U, V, and W */
32 float srad; /* maximum source radius */
33 float ss2; /* solid angle or projected area */
34 struct {
35 float prox; /* proximity */
36 SPOT *s; /* spot */
37 } sl; /* localized source information */
38 union {
39 int success; /* successes - AIMREQT*failures */
40 struct {
41 short pn; /* projection number */
42 short sn; /* next source to aim for */
43 } sv; /* virtual source */
44 } sa; /* source aiming information */
45 long ntests, nhits; /* shadow tests and hits */
46 OBJREC *so; /* source destination object */
47 } SRCREC; /* light source */
48
49 #define MAXSPART 64 /* maximum partitions per source */
50
51 #define SU 0 /* U vector or partition */
52 #define SV 1 /* V vector or partition */
53 #define SW 2 /* W vector or partition */
54 #define S0 3 /* leaf partition */
55
56 #define snorm ss[SW] /* normal vector for flat source */
57
58 typedef struct {
59 int sn; /* source number */
60 short np; /* number of partitions */
61 short sp; /* this partition number */
62 double dom; /* solid angle of partition */
63 unsigned char spt[MAXSPART/2]; /* source partitioning */
64 } SRCINDEX; /* source index structure */
65
66 #define initsrcindex(s) ((s)->sn = (s)->sp = -1, (s)->np = 0)
67
68 #define clrpart(pt) bzero((char *)(pt), MAXSPART/2)
69 #define setpart(pt,i,v) ((pt)[(i)>>2] |= (v)<<(((i)&3)<<1))
70 #define spart(pt,pi) ((pt)[(pi)>>2] >> (((pi)&3)<<1) & 3)
71
72 /*
73 * Special support functions for sources
74 */
75
76 /*
77 * Virtual source materials must define the following.
78 *
79 * vproj(pm, op, sp, i) Compute i'th virtual projection
80 * of source sp in object op and assign
81 * the 4x4 transformation matrix pm.
82 * Return 1 on success, 0 if no i'th projection.
83 *
84 * nproj The number of projections. The value of
85 * i passed to vproj runs from 0 to nproj-1.
86 */
87
88 typedef struct {
89 int (*vproj)(); /* project virtual sources */
90 int nproj; /* number of possible projections */
91 } VSMATERIAL; /* virtual source material functions */
92
93 typedef struct {
94 int (*setsrc)(); /* set light source for object */
95 int (*partit)(); /* partition light source object */
96 double (*getpleq)(); /* plane equation for surface */
97 double (*getdisk)(); /* maximum disk for surface */
98 } SOBJECT; /* source object functions */
99
100 typedef union {
101 VSMATERIAL *mf; /* material functions */
102 SOBJECT *of; /* object functions */
103 } SRCFUNC; /* source functions */
104
105 extern SRCFUNC sfun[]; /* source dispatch table */
106
107 extern SRCREC *source; /* our source list */
108 extern int nsources; /* the number of sources */
109
110 extern int srcvalue(); /* compute source value w/o shadows */
111 extern double nextssamp(); /* get next source sample location */
112 extern double scylform(); /* cosine to axis of cylinder */
113
114 #define sflatform(sn,dir) -DOT(source[sn].snorm, dir)
115
116 extern double intercircle(); /* intersect two circles */
117 extern double spotdisk(); /* intersecting disk for spot */
118 extern double beamdisk(); /* intersecting disk for beam */
119
120 extern SPOT *makespot(); /* make spotlight */
121
122 extern double dstrsrc; /* source distribution amount */
123 extern double shadthresh; /* relative shadow threshold */
124 extern double shadcert; /* shadow testing certainty */
125 extern double srcsizerat; /* max. ratio of source size/dist. */
126 extern int directrelay; /* maximum number of source relays */
127 extern int vspretest; /* virtual source pretest density */
128 extern int directinvis; /* sources invisible? */
129
130 #define getplaneq(c,o) (*sfun[(o)->otype].of->getpleq)(c,o)
131 #define getmaxdisk(c,o) (*sfun[(o)->otype].of->getdisk)(c,o)
132 #define setsource(s,o) (*sfun[(o)->otype].of->setsrc)(s,o)