ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/m_mist.c
(Generate patch)

Comparing ray/src/rt/m_mist.c (file contents):
Revision 2.5 by greg, Thu Mar 21 10:24:59 1996 UTC vs.
Revision 2.17 by greg, Tue Apr 19 01:15:06 2005 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1995 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Mist volumetric material.
6   */
7  
8 < #include  "ray.h"
8 > #include "copyright.h"
9  
10 + #include <string.h>
11 +
12 + #include  "ray.h"
13   #include  "source.h"
14 + #include  "rtotypes.h"
15  
16   /*
17   *  A mist volume is used to specify a region in the scene where a certain
# Line 33 | Line 34 | static char SCCSid[] = "$SunId$ LBL";
34   *
35   *  Up to five real arguments may be given for MAT_MIST:
36   *
37 < *      [ext_r  ext_g  ext_b  [albedo [gecc]]]
37 > *      [ext_r  ext_g  ext_b  [albedo_r albedo_g albedo_b [gecc]]]
38   *
39   *  The primaries indicate medium extinction per unit length (absorption
40   *  plus scattering), which is added to the global extinction coefficient, set
# Line 44 | Line 45 | static char SCCSid[] = "$SunId$ LBL";
45   *  scattering.  A value approaching 1 indicates strong forward scattering.
46   */
47  
48 + #ifndef  MAXSLIST
49 + #define  MAXSLIST       32      /* maximum sources to check */
50 + #endif
51 +
52   #define RELAYDELIM      '>'             /* relay delimiter character */
53  
54 < extern COLOR  cextinction;              /* global coefficient of extinction */
55 < extern double  salbedo;                 /* global scattering albedo */
56 < extern double  seccg;                   /* global scattering eccentricity */
54 > static int inslist(int  *sl, int  n);
55 > static int srcmatch(SRCREC  *sp, char  *id);
56 > static void add2slist(RAY  *r, int  *sl);
57  
58  
59   static int
60 < inslist(sl, n)          /* return index of source n if it's in list sl */
61 < register int  *sl;
62 < register int  n;
60 > inslist(                /* return index of source n if it's in list sl */
61 >        register int  *sl,
62 >        register int  n
63 > )
64   {
65          register int  i;
66  
# Line 66 | Line 72 | register int  n;
72  
73  
74   static int
75 < srcmatch(sp, id)        /* check for an id match on a light source */
76 < register SRCREC  *sp;
77 < register char  *id;
75 > srcmatch(       /* check for an id match on a light source */
76 >        register SRCREC  *sp,
77 >        register char  *id
78 > )
79   {
73        extern char  *index();
80          register char  *cp;
81                                                  /* check for relay sources */
82 <        while ((cp = index(id, RELAYDELIM)) != NULL) {
82 >        while ((cp = strchr(id, RELAYDELIM)) != NULL) {
83                  if (!(sp->sflags & SVIRTUAL) || sp->so == NULL)
84                          return(0);
85                  if (strncmp(id, sp->so->oname, cp-id) || sp->so->oname[cp-id])
# Line 87 | Line 93 | register char  *id;
93   }
94  
95  
96 < static
97 < add2slist(r, sl)        /* add source list to ray's */
98 < register RAY  *r;
99 < register int  *sl;
96 > static void
97 > add2slist(      /* add source list to ray's */
98 >        register RAY  *r,
99 >        register int  *sl
100 > )
101   {
102          static int  slspare[MAXSLIST+1];        /* in case of emergence */
103          register int  i;
# Line 102 | Line 109 | register int  *sl;
109          for (i = sl[0]; i > 0; i--)
110                  if (!inslist(r->slights, sl[i])) {
111                          if (r->slights[0] >= MAXSLIST)
112 <                                error(USER, "scattering source list overflow");
112 >                                error(INTERNAL,
113 >                                        "scattering source list overflow");
114                          r->slights[++r->slights[0]] = sl[i];
115                  }
116   }
117  
118  
119 < m_mist(m, r)            /* process a ray entering or leaving some mist */
120 < OBJREC  *m;
121 < register RAY  *r;
119 > extern int
120 > m_mist(         /* process a ray entering or leaving some mist */
121 >        OBJREC  *m,
122 >        register RAY  *r
123 > )
124   {
125          RAY  p;
126          int  *myslist = NULL;
# Line 119 | Line 129 | register RAY  *r;
129          double  re, ge, be;
130          register int  i, j;
131                                          /* check arguments */
132 <        if (m->oargs.nfargs > 5)
132 >        if (m->oargs.nfargs > 7)
133                  objerror(m, USER, "bad arguments");
134                                          /* get source indices */
135          if (m->oargs.nsargs > 0 && (myslist = (int *)m->os) == NULL) {
136                  if (m->oargs.nsargs > MAXSLIST)
137 <                        objerror(m, USER, "too many sources in list");
137 >                        objerror(m, INTERNAL, "too many sources in list");
138                  myslist = (int *)malloc((m->oargs.nsargs+1)*sizeof(int));
139                  if (myslist == NULL)
140                          goto memerr;
# Line 155 | Line 165 | register RAY  *r;
165          } else
166                  setcolor(mext, 0., 0., 0.);
167                                                  /* start transmitted ray */
168 <        if (rayorigin(&p, r, TRANS, 1.) < 0)
168 >        if (rayorigin(&p, TRANS, r, NULL) < 0)
169                  return(1);
170          VCOPY(p.rdir, r->rdir);
171          p.slights = newslist;
# Line 166 | Line 176 | register RAY  *r;
176                  p.slights[0] = 0;
177          if (r->rod > 0.) {                      /* entering ray */
178                  addcolor(p.cext, mext);
179 <                if (m->oargs.nfargs > 3)
180 <                        p.albedo = m->oargs.farg[3];
181 <                if (m->oargs.nfargs > 4)
182 <                        p.gecc = m->oargs.farg[4];
179 >                if (m->oargs.nfargs > 5)
180 >                        setcolor(p.albedo, m->oargs.farg[3],
181 >                                        m->oargs.farg[4], m->oargs.farg[5]);
182 >                if (m->oargs.nfargs > 6)
183 >                        p.gecc = m->oargs.farg[6];
184                  add2slist(&p, myslist);                 /* add to list */
185          } else {                                /* leaving ray */
186                  if (myslist != NULL) {                  /* delete from list */
187                          for (j = myslist[0]; j > 0; j--)
188 <                                if (i = inslist(p.slights, myslist[j]))
188 >                                if ( (i = inslist(p.slights, myslist[j])) )
189                                          p.slights[i] = -1;
190                          for (i = 0, j = 1; j <= p.slights[0]; j++)
191                                  if (p.slights[j] != -1)
192                                          p.slights[++i] = p.slights[j];
193                          if (p.slights[0] - i < myslist[0]) {    /* fix old */
194                                  addcolor(r->cext, mext);
195 <                                if (m->oargs.nfargs > 3)
196 <                                        r->albedo = m->oargs.farg[3];
197 <                                if (m->oargs.nfargs > 4)
198 <                                        r->gecc = m->oargs.farg[4];
195 >                                if (m->oargs.nfargs > 5)
196 >                                        setcolor(r->albedo, m->oargs.farg[3],
197 >                                        m->oargs.farg[4], m->oargs.farg[5]);
198 >                                if (m->oargs.nfargs > 6)
199 >                                        r->gecc = m->oargs.farg[6];
200                                  add2slist(r, myslist);
201                          }
202                          p.slights[0] = i;
# Line 199 | Line 211 | register RAY  *r;
211                                  colval(cextinction,BLU))
212                          be = colval(cextinction,BLU);
213                  setcolor(p.cext, re, ge, be);
214 <                if (m->oargs.nfargs > 3)
215 <                        p.albedo = salbedo;
216 <                if (m->oargs.nfargs > 4)
214 >                if (m->oargs.nfargs > 5)
215 >                        copycolor(p.albedo, salbedo);
216 >                if (m->oargs.nfargs > 6)
217                          p.gecc = seccg;
218          }
219          rayvalue(&p);                           /* calls rayparticipate() */
# Line 210 | Line 222 | register RAY  *r;
222          return(1);
223   memerr:
224          error(SYSTEM, "out of memory in m_mist");
225 +        return 0; /* pro forma return */
226   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines