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

Comparing ray/src/gen/gensky.c (file contents):
Revision 1.1 by greg, Thu Feb 2 11:16:29 1989 UTC vs.
Revision 2.8 by greg, Fri Oct 23 14:19:35 1992 UTC

# Line 17 | Line 17 | static char SCCSid[] = "$SunId$ LBL";
17  
18   #include  <math.h>
19  
20 + #include  "color.h"
21  
22 + #ifndef atof
23 + extern double  atof();
24 + #endif
25   extern char  *strcpy(), *strcat(), *malloc();
26   extern double  stadj(), sdec(), sazi(), salt();
27  
# Line 31 | Line 35 | extern double  s_latitude;
35   extern double  s_longitude;
36   extern double  s_meridian;
37                                          /* required values */
38 < int  month, day;
39 < double  hour;
38 > int  month, day;                                /* date */
39 > double  hour;                                   /* time */
40 > int  tsolar;                                    /* 0=standard, 1=solar */
41 > double  altitude, azimuth;                      /* or solar angles */
42                                          /* default values */
43 < int  cloudy = 0;
43 > int  cloudy = 0;                                /* 1=standard, 2=uniform */
44   int  dosun = 1;
45   double  zenithbr = -1.0;
46   double  turbidity = 2.75;
# Line 43 | Line 49 | double  gprefl = 0.2;
49   double  sundir[3];
50   double  groundbr;
51   double  F2;
52 < double  solarbr;
52 > double  solarbr = -1.0;
53  
54   char  *progname;
55   char  errmsg[128];
# Line 53 | Line 59 | main(argc, argv)
59   int  argc;
60   char  *argv[];
61   {
56        extern double  atof();
62          int  i;
63  
64          progname = argv[0];
# Line 63 | Line 68 | char  *argv[];
68          }
69          if (argc < 4)
70                  userror("arg count");
71 <        month = atoi(argv[1]);
72 <        day = atoi(argv[2]);
73 <        hour = atof(argv[3]);
71 >        if (!strcmp(argv[1], "-ang")) {
72 >                altitude = atof(argv[2]) * (PI/180);
73 >                azimuth = atof(argv[3]) * (PI/180);
74 >                month = 0;
75 >        } else {
76 >                month = atoi(argv[1]);
77 >                if (month < 1 || month > 12)
78 >                        userror("bad month");
79 >                day = atoi(argv[2]);
80 >                if (day < 1 || day > 31)
81 >                        userror("bad day");
82 >                hour = atof(argv[3]);
83 >                if (hour < 0 || hour >= 24)
84 >                        userror("bad hour");
85 >                tsolar = argv[3][0] == '+';
86 >        }
87          for (i = 4; i < argc; i++)
88                  if (argv[i][0] == '-' || argv[i][0] == '+')
89                          switch (argv[i][1]) {
# Line 73 | Line 91 | char  *argv[];
91                                  cloudy = 0;
92                                  dosun = argv[i][0] == '+';
93                                  break;
94 +                        case 'r':
95 +                                solarbr = atof(argv[++i]);
96 +                                break;
97                          case 'c':
98 <                                cloudy = 1;
98 >                                cloudy = argv[i][0] == '+' ? 2 : 1;
99                                  dosun = 0;
100                                  break;
101                          case 't':
# Line 102 | Line 123 | char  *argv[];
123                  else
124                          userror("bad option");
125  
126 +        if (fabs(s_meridian-s_longitude) > 30*PI/180)
127 +                fprintf(stderr,
128 +        "%s: warning: %.1f hours btwn. standard meridian and longitude\n",
129 +                        progname, (s_longitude-s_meridian)*12/PI);
130 +
131          printhead(argc, argv);
132  
133          computesky();
# Line 111 | Line 137 | char  *argv[];
137  
138   computesky()                    /* compute sky parameters */
139   {
114        int  jd;
115        double  sd, st;
116        double  altitude, azimuth;
140                                          /* compute solar direction */
141 <        jd = jdate(month, day);                 /* Julian date */
142 <        sd = sdec(jd);                          /* solar declination */
143 <        st = hour + stadj(jd);                  /* solar time */
144 <        altitude = salt(sd, st);
145 <        azimuth = sazi(sd, st);
141 >        if (month) {                    /* from date and time */
142 >                int  jd;
143 >                double  sd, st;
144 >
145 >                jd = jdate(month, day);         /* Julian date */
146 >                sd = sdec(jd);                  /* solar declination */
147 >                if (tsolar)                     /* solar time */
148 >                        st = hour;
149 >                else
150 >                        st = hour + stadj(jd);
151 >                altitude = salt(sd, st);
152 >                azimuth = sazi(sd, st);
153 >        }
154          sundir[0] = -sin(azimuth)*cos(altitude);
155          sundir[1] = -cos(azimuth)*cos(altitude);
156          sundir[2] = sin(altitude);
# Line 128 | Line 159 | computesky()                   /* compute sky parameters */
159          if (zenithbr <= 0.0)
160                  if (cloudy) {
161                          zenithbr = 8.6*sundir[2] + .123;
162 <                        zenithbr *= 1000.0/683.0;
162 >                        zenithbr *= 1000.0/WHTEFFICACY;
163                  } else {
164                          zenithbr = (1.376*turbidity-1.81)*tan(altitude)+0.38;
165 <                        zenithbr *= 1000.0/683.0;
165 >                        zenithbr *= 1000.0/SKYEFFICACY;
166                  }
167 +        if (zenithbr < 0.0)
168 +                zenithbr = 0.0;
169                                          /* Compute horizontal radiance */
170          if (cloudy) {
171 <                groundbr = zenithbr*0.777778;
171 >                if (cloudy == 2)
172 >                        groundbr = zenithbr;
173 >                else
174 >                        groundbr = zenithbr*0.777778;
175                  printf("# Ground ambient level: %f\n", groundbr);
176          } else {
177                  F2 = 0.274*(0.91 + 10.0*exp(-3.0*(PI/2.0-altitude)) +
178                                  0.45*sundir[2]*sundir[2]);
179 <                groundbr = zenithbr*normsc(PI/2.0-altitude)/F2/PI;
179 >                groundbr = zenithbr*normsc(altitude)/F2/PI;
180                  printf("# Ground ambient level: %f\n", groundbr);
181 <                if (sundir[2] > 0.0) {
182 <                        if (sundir[2] > .16)
183 <                                solarbr = 2.47e6 - 3.15e5/sundir[2];
184 <                        else
149 <                                solarbr = 5e5;
181 >                if (sundir[2] > 0.0 && solarbr != 0.0) {
182 >                        if (solarbr < 0.0)
183 >                                solarbr = 1.5e9/SUNEFFICACY *
184 >                                (1.147 - .147/(sundir[2]>.16?sundir[2]:.16));
185                          groundbr += solarbr*6e-5*sundir[2]/PI;
186                  } else
187                          dosun = 0;
# Line 157 | Line 192 | computesky()                   /* compute sky parameters */
192  
193   printsky()                      /* print out sky */
194   {
160        register int  i;
161
195          if (dosun) {
196                  printf("\nvoid light solar\n");
197                  printf("0\n0\n");
198 <                printf("3 %f %f %f\n", solarbr, solarbr, solarbr);
198 >                printf("3 %.2e %.2e %.2e\n", solarbr, solarbr, solarbr);
199                  printf("\nsolar source sun\n");
200                  printf("0\n0\n");
201                  printf("4 %f %f %f 0.5\n", sundir[0], sundir[1], sundir[2]);
# Line 172 | Line 205 | printsky()                     /* print out sky */
205          printf("2 skybright skybright.cal\n");
206          printf("0\n");
207          if (cloudy)
208 <                printf("3 1 %f %f\n", zenithbr, groundbr);
208 >                printf("3 %d %.2e %.2e\n", cloudy, zenithbr, groundbr);
209          else
210 <                printf("7 -1 %f %f %f %f %f %f\n", zenithbr, groundbr, F2,
211 <                                sundir[0], sundir[1], sundir[2]);
210 >                printf("7 -1 %.2e %.2e %.2e %f %f %f\n", zenithbr, groundbr,
211 >                                F2, sundir[0], sundir[1], sundir[2]);
212   }
213  
214  
215   printdefaults()                 /* print default values */
216   {
217 <        if (cloudy)
217 >        if (cloudy == 1)
218                  printf("-c\t\t\t\t# Cloudy sky\n");
219 +        else if (cloudy == 2)
220 +                printf("+c\t\t\t\t# Uniform cloudy sky\n");
221          else if (dosun)
222                  printf("+s\t\t\t\t# Sunny sky with sun\n");
223          else
# Line 204 | Line 239 | char  *msg;
239          if (msg != NULL)
240                  fprintf(stderr, "%s: Use error - %s\n", progname, msg);
241          fprintf(stderr, "Usage: %s month day hour [options]\n", progname);
242 +        fprintf(stderr, "   Or: %s -ang altitude azimuth [options]\n", progname);
243          fprintf(stderr, "   Or: %s -defaults\n", progname);
244          exit(1);
245   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines