ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/ray.h
Revision: 2.62
Committed: Fri Jun 20 18:05:30 2025 UTC (12 hours, 37 minutes ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.61: +3 -3 lines
Log Message:
refactor: Changed macros to function type for clarity

File Contents

# Content
1 /* RCSid $Id: ray.h,v 2.61 2025/06/20 16:48:39 greg Exp $ */
2 /*
3 * ray.h - header file for routines using rays.
4 */
5 #ifndef _RAD_RAY_H_
6 #define _RAD_RAY_H_
7
8 #include "standard.h"
9 #include "octree.h"
10 #include "object.h"
11 #include "color.h"
12 #include "pmapparm.h"
13
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17
18 #ifndef RNUMBER
19 #define RNUMBER size_t /* ray counter (>= sizeof pointer) */
20 #endif
21
22 #define MAXDIM 36 /* maximum number of sampling dimensions */
23 #define XTRADIM 3 /* #spare dimensions */
24 #define ndims_inc() (ndims -= ndims>=MAXDIM-XTRADIM, ndims++)
25 #define dec_ndims() (ndims -= ndims>0)
26
27 /* ray type flags */
28 #define PRIMARY 01 /* original ray */
29 #define RSHADOW 02 /* reflected ray to light source */
30 #define REFLECTED 04 /* reflected ray */
31 #define REFRACTED 010 /* refracted (bent) ray */
32 #define TRANS 020 /* transmitted/transferred ray */
33 #define RAMBIENT 040 /* reflected diffuse interreflection */
34 #define RSPECULAR 0100 /* reflected specular */
35 #define TSHADOW 0200 /* transmitted shadow */
36 #define TAMBIENT 0400 /* transmitted ambient */
37 #define TSPECULAR 01000 /* transmitted specular */
38 #define SHADOW (RSHADOW|TSHADOW)
39 #define AMBIENT (RAMBIENT|TAMBIENT)
40 #define SPECULAR (RSPECULAR|TSPECULAR)
41
42 /* reflected ray types */
43 #define RAYREFL (RSHADOW|REFLECTED|RAMBIENT|RSPECULAR)
44
45 /* Arrange so double's come first for optimal alignment */
46 /* Pointers and long's come second for 64-bit mode */
47 /* Int's next (unknown length), then floats, followed by short's & char's */
48 typedef struct ray {
49 FVECT rorg; /* origin of ray */
50 FVECT rdir; /* normalized direction of ray */
51 RREAL rmax; /* maximum distance (aft clipping plane) */
52 RREAL rot; /* distance to object */
53 FVECT rop; /* intersection point */
54 FVECT ron; /* intersection surface normal */
55 RREAL rod; /* -DOT(rdir, ron) */
56 RREAL uv[2]; /* local coordinates */
57 FVECT pert; /* surface normal perturbation */
58 RREAL rmt; /* returned mirrored ray length */
59 RREAL rxt; /* returned unmirrored ray length */
60 const struct ray *parent; /* ray this originated from */
61 OBJECT *clipset; /* set of objects currently clipped */
62 OBJECT *newcset; /* next clipset, used for transmission */
63 void (*revf)(struct ray *); /* ray evaluation function */
64 void (*hitf)(OBJECT *, struct ray *); /* custom hit test */
65 OBJREC *ro; /* intersected object (one with material) */
66 FULLXF *rox; /* object transformation */
67 int *slights; /* list of lights to test for scattering */
68 RNUMBER rno; /* unique ray number */
69 OBJECT robj; /* intersected object number */
70 int rsrc; /* source we're aiming for (or ones to skip) */
71 float rweight; /* cumulative weight (for termination) */
72 float gecc; /* scattering eccentricity coefficient */
73 SCOLOR rcoef; /* contribution coefficient w.r.t. parent */
74 SCOLOR pcol; /* pattern color */
75 SCOLOR mcol; /* mirrored color contribution */
76 SCOLOR rcol; /* returned radiance value */
77 COLOR cext; /* medium extinction coefficient */
78 COLOR albedo; /* medium scattering albedo */
79 short rflips; /* surface orientation has been reversed */
80 short rlvl; /* number of reflections for this ray */
81 short rtype; /* ray type */
82 short crtype; /* cumulative ray type */
83 } RAY;
84
85 #define rayvalue(r) (*(r)->revf)(r)
86
87 #define thrudir(r,v) ((r)->rod > 0 ^ DOT((r)->ron,v) > 0)
88
89 #define raydistance(r) (pbright((r)->mcol) > 0.5*pbright((r)->rcol) ? \
90 (r)->rmt : (r)->rxt)
91
92 #define rayreorient(r) if ((r)->rflips & 1) flipsurface(r); else
93
94 extern char VersionID[]; /* Radiance version ID string */
95 extern char RFeatureList[]; /* newline-separated feature list */
96
97 extern CUBE thescene; /* our scene */
98 extern OBJECT nsceneobjs; /* number of objects in our scene */
99
100 extern RNUMBER raynum; /* next ray ID */
101 extern RNUMBER nrays; /* total rays traced so far */
102
103 extern OBJREC Lamb; /* a Lambertian surface */
104 extern OBJREC Aftplane; /* aft clipping object */
105
106 extern void (*trace)(RAY*); /* global trace reporting callback */
107
108 extern int dimlist[]; /* dimension list for distribution */
109 extern int ndims; /* number of dimensions so far */
110 extern unsigned long
111 samplendx; /* index for this sample */
112
113 extern int do_irrad; /* compute irradiance? */
114
115 extern int rand_samp; /* pure Monte Carlo sampling? */
116
117 extern double dstrsrc; /* square source distribution */
118 extern double shadthresh; /* shadow threshold */
119 extern double shadcert; /* shadow testing certainty */
120 extern int directrelay; /* number of source relays */
121 extern int vspretest; /* virtual source pretest density */
122 extern int directvis; /* light sources visible to eye? */
123 extern double srcsizerat; /* maximum source size/dist. ratio */
124
125 extern double specthresh; /* specular sampling threshold */
126 extern double specjitter; /* specular sampling jitter */
127
128 extern COLOR cextinction; /* global extinction coefficient */
129 extern COLOR salbedo; /* global scattering albedo */
130 extern double seccg; /* global scattering eccentricity */
131 extern double ssampdist; /* scatter sampling distance */
132
133 extern int backvis; /* back face visibility */
134
135 extern int maxdepth; /* maximum recursion depth */
136 extern double minweight; /* minimum ray weight */
137
138 extern char *ambfile; /* ambient file name */
139 extern COLOR ambval; /* ambient value */
140 extern int ambvwt; /* initial weight for ambient value */
141 extern double ambacc; /* ambient accuracy */
142 extern int ambres; /* ambient resolution */
143 extern int ambdiv; /* ambient divisions */
144 extern int ambssamp; /* ambient super-samples */
145 extern int ambounce; /* ambient bounces */
146 extern char *amblist[]; /* ambient include/exclude list */
147 extern int ambincl; /* include == 1, exclude == 0 */
148
149 extern int ray_pnprocs; /* number of child processes */
150 extern int ray_pnidle; /* number of idle processes */
151
152 #ifndef AMBLLEN
153 #define AMBLLEN 512 /* max. ambient list length */
154 #endif
155 #define AMBWORD 12 /* average word length */
156
157 typedef struct { /* rendering parameter holder */
158 int do_irrad;
159 int rand_samp;
160 double dstrsrc;
161 double shadthresh;
162 double shadcert;
163 int directrelay;
164 int vspretest;
165 int directvis;
166 double srcsizerat;
167 COLOR cextinction;
168 COLOR salbedo;
169 double seccg;
170 double ssampdist;
171 double specthresh;
172 double specjitter;
173 int backvis;
174 int maxdepth;
175 double minweight;
176 char ambfile[512];
177 COLOR ambval;
178 int ambvwt;
179 double ambacc;
180 int ambres;
181 int ambdiv;
182 int ambssamp;
183 int ambounce;
184 int ambincl;
185 short amblndx[AMBLLEN+1];
186 char amblval[AMBLLEN*AMBWORD];
187
188 /* PMAP: photon mapping parameters */
189 PhotonMapParams pmapParams [NUM_PMAP_TYPES];
190 } RAYPARAMS;
191
192 #define rpambmod(p,i) ( (i)>=AMBLLEN||(p)->amblndx[i]<0 ? \
193 (char *)NULL : (p)->amblval+(p)->amblndx[i] )
194
195 /* defined in duphead.c */
196 extern void headclean(void);
197 extern void openheader(void);
198 extern void dupheader(void);
199 /* defined in persist.c */
200 extern void persistfile(char *pfn);
201 extern void pfdetach(void);
202 extern void pfclean(void);
203 extern void pflock(int lf);
204 extern void pfhold(void);
205 extern void io_process(void);
206 /* defined in freeobjmem.c */
207 extern int free_objs(OBJECT on, OBJECT no);
208 extern void free_objmem(void);
209 /* defined in preload.c */
210 extern int load_os(OBJREC *op);
211 extern void preload_objs(void);
212 extern char *shm_boundary;
213 extern void cow_memshare(void);
214 extern void cow_doneshare(void);
215 /* defined in raycalls.c */
216 extern void ray_init(char *otnm);
217 extern void ray_trace(RAY *r);
218 extern void ray_done(int freall);
219 extern void ray_save(RAYPARAMS *rp);
220 extern void ray_restore(RAYPARAMS *rp);
221 extern void ray_defaults(RAYPARAMS *rp);
222 extern void reset_random(void);
223 /* defined in raypcalls.c */
224 extern void ray_pinit(char *otnm, int nproc);
225 extern int ray_psend(RAY *r);
226 extern int ray_pqueue(RAY *r);
227 extern int ray_presult(RAY *r, int poll);
228 extern void ray_pdone(int freall);
229 extern void ray_popen(int nadd);
230 extern void ray_pclose(int nsub);
231 /* defined in ray_fifo.c */
232 extern int (*ray_fifo_out)(RAY *r);
233 extern int ray_fifo_in(RAY *r);
234 extern int ray_fifo_flush(void);
235 /* defined in raytrace.c */
236 extern int rayorigin(RAY *r, int rt, const RAY *ro, const SCOLOR rc);
237 extern void rayclear(RAY *r);
238 extern void raytrace(RAY *r);
239 extern int rayreject(OBJREC *o, RAY *r, double t, double rod);
240 extern void rayhit(OBJECT *oset, RAY *r);
241 extern void raycont(RAY *r);
242 extern void raytrans(RAY *r);
243 extern int raytirrad(OBJREC *m, RAY *r);
244 extern int rayshade(RAY *r, int mod);
245 extern void rayparticipate(RAY *r);
246 extern void raytexture(RAY *r, OBJECT mod);
247 extern int raymixture(RAY *r, OBJECT fore, OBJECT back, double coef);
248 extern void raycontrib(SCOLOR rc, const RAY *r, int flags);
249 extern double raydist(const RAY *r, int flags);
250 extern double raynormal(FVECT norm, RAY *r);
251 extern void newrayxf(RAY *r);
252 extern void flipsurface(RAY *r);
253 extern int localhit(RAY *r, CUBE *scene);
254 /* defined in renderopts.c */
255 extern int feature_status(int ac, char *av[]);
256 extern int getrenderopt(int ac, char *av[]);
257 extern void print_rdefaults(void);
258 /* defined in srcdraw.c */
259 extern void init_drawsources(int rad);
260 extern void drawsources(COLORV *pic[], RGBPRIMP primp, float *zbf[],
261 int x0, int xsiz, int y0, int ysiz);
262 /* defined in rt/initotypes.c */
263 extern void initotypes(void);
264 /* module main procedures */
265 extern void rtrace(char *fname, int nproc);
266 extern const char *formstr(int f);
267 extern void rview(void);
268 extern void rpict(int seq, char *pout, char *zout, char *prvr);
269
270 #ifdef __FAST_MATH__
271 #define checknorm(vn) (void)normalize(vn)
272 #else
273 #define checknorm(vn)
274 #endif
275
276 #ifdef __cplusplus
277 }
278 #endif
279 #endif /* _RAD_RAY_H_ */
280