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

Comparing ray/src/cv/lampcolor.c (file contents):
Revision 1.1 by greg, Thu Mar 14 13:55:03 1991 UTC vs.
Revision 2.11 by greg, Sat Dec 28 18:05:14 2019 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1991 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 < * Do dah program to convert lamp color from table.
5 > * Program to convert lamp color from table and compute radiance.
6   */
7  
8 < #include <stdio.h>
8 > #include <math.h>
9  
10 < extern float    *matchlamp();
10 > #include "rtmath.h"
11 > #include "rtio.h"
12 > #include "color.h"
13  
14 +                                /* lamp parameters */
15 + #define LTYPE           0
16 + #define LUNIT           1
17 + #define LGEOM           2
18 + #define LOUTP           3
19 + #define NPARAMS         4
20  
21 < main(argc, argv)
22 < int     argc;
23 < char    *argv[];
21 > static int typecheck(char *s);
22 > static int unitcheck(char *s);
23 > static int geomcheck(char *s);
24 > static int outpcheck(char *s);
25 > static void compute(void);
26 > static int getpolygon(void), getsphere(void), getcylinder(void), getring(void);
27 > static int getd(char *name, double *dp, char *help);
28 >
29 >
30 > float   *lampcolor;             /* the lamp color (RGB) */
31 > double  unit2meter;             /* conversion from units to meters */
32 > double  area;                   /* radiating area for this geometry */
33 > double  lumens;                 /* total lamp lumens */
34 >
35 > struct {
36 >        char    *name;
37 >        char    value[64];
38 >        int     (*check)();
39 >        char    *help;
40 > } param[NPARAMS] = {
41 >        { "lamp type", "WHITE", typecheck,
42 > "The lamp type is a string which corresponds to one of the types registered\n\
43 > in the lamp table file.  A value of \"WHITE\" means an uncolored source,\n\
44 > which may be preferable because it results in a color balanced image." },
45 >        { "length unit", "meter", unitcheck,
46 > "Unit must be one of:  \"meter\", \"centimeter\", \"foot\", or \"inch\".\n\
47 > These may be abbreviated as a single letter." },
48 >        { "lamp geometry", "polygon", geomcheck,
49 > "The lamp geometry must be one of:  \"polygon\", \"sphere\", \"cylinder\"\n\
50 > or \"ring\".  These may be abbreviated as a single letter." },
51 >        { "total lamp lumens", "0", outpcheck,
52 > "This is the overall light output of the lamp and its fixture.  If you do\n\
53 > not know this value explicitly, you can compute the approximate lumens\n\
54 > by multiplying the input wattage by 14 for incandescent fixtures or 70\n\
55 > for fluorescent fixtures." },
56 > };
57 >
58 >
59 > int
60 > main(
61 >        int     argc,
62 >        char    *argv[]
63 > )
64   {
65          char    *lamptab = "lamp.tab";
66 <        float   *lcol;
67 <        char    buf[80];
66 >        char    buf[64];
67 >        int     i;
68  
69          if (argc > 1) lamptab = argv[1];
70          if (loadlamps(lamptab) == 0) {
71 <                perror(lamptab);
71 >                fprintf(stderr, "%s: no such lamp table\n", lamptab);
72                  exit(1);
73          }
74 +        printf("Program to compute lamp radiance.  Enter '?' for help.\n");
75          for ( ; ; ) {
76 <                printf("Enter lamp type: ");
77 <                buf[0] = '\0';
78 <                gets(buf);
79 <                if (!buf[0]) exit(0);
80 <                if ((lcol = matchlamp(buf)) == NULL)
81 <                        printf("No match in table\n");
82 <                else
83 <                        printf("RGB = (%f,%f,%f)\n", lcol[0], lcol[1], lcol[2]);
76 >                i = 0;
77 >                while (i < NPARAMS) {
78 >                        printf("Enter %s [%s]: ", param[i].name,
79 >                                        param[i].value);
80 >                        if (fgetline(buf, sizeof(buf), stdin) == NULL)
81 >                                exit(0);
82 >                        if (buf[0] == '?') {
83 >                                puts(param[i].help);
84 >                                continue;
85 >                        }
86 >                        if (buf[0])
87 >                                strcpy(param[i].value, buf);
88 >                        if (!(*param[i].check)(param[i].value)) {
89 >                                fprintf(stderr, "%s: bad value for %s\n",
90 >                                                param[i].value, param[i].name);
91 >                                continue;
92 >                        }
93 >                        i++;
94 >                }
95 >                compute();
96          }
97 + }
98 +
99 +
100 + static int
101 + typecheck(                      /* check lamp type */
102 +        char    *s
103 + )
104 + {
105 +        lampcolor = matchlamp(s);
106 +        return(lampcolor != NULL);
107 + }
108 +
109 +
110 + static int
111 + unitcheck(                      /* compute conversion to meters */
112 +        char    *s
113 + )
114 + {
115 +        int     len = strlen(s);
116 +
117 +        switch (*s) {
118 +        case 'm':
119 +                if (strncmp(s, "meters", len))
120 +                        return(0);
121 +                unit2meter = 1.0;
122 +                return(1);
123 +        case 'c':
124 +                if (strncmp(s, "centimeters", len) && strncmp(s, "cms", len))
125 +                        return(0);
126 +                unit2meter = 0.01;
127 +                return(1);
128 +        case 'f':
129 +                if (strncmp(s, "foot", len) && strncmp(s, "feet", len))
130 +                        return(0);
131 +                unit2meter = 0.3048;
132 +                return(1);
133 +        case 'i':
134 +                if (strncmp(s, "inches", len))
135 +                        return(0);
136 +                unit2meter = 0.0254;
137 +                return(1);
138 +        }
139 +        return(0);
140 + }
141 +
142 +
143 + static int
144 + geomcheck(                      /* check/set lamp geometry */
145 +        char    *s
146 + )
147 + {
148 +        int     len = strlen(s);
149 +
150 +        switch (*s) {
151 +        case 'p':
152 +                if (strncmp(s, "polygonal", len))
153 +                        return(0);
154 +                return(getpolygon());
155 +        case 's':
156 +                if (strncmp(s, "sphere", len) && strncmp(s, "spherical", len))
157 +                        return(0);
158 +                return(getsphere());
159 +        case 'c':
160 +                if (strncmp(s,"cylinder",len) && strncmp(s,"cylindrical",len))
161 +                        return(0);
162 +                return(getcylinder());
163 +        case 'r':
164 +                if (strncmp(s, "ring", len) && strncmp(s, "disk", len))
165 +                        return(0);
166 +                return(getring());
167 +        }
168 +        return(0);
169 + }
170 +
171 +
172 + static int
173 + outpcheck(                      /* check lumen output value */
174 +        register char   *s
175 + )
176 + {
177 +        if ((*s < '0' || *s > '9') && *s != '.')
178 +                return(0);
179 +        lumens = atof(s);
180 +        return(1);
181 + }
182 +
183 +
184 + static void
185 + compute(void)                   /* compute lamp radiance */
186 + {
187 +        double  whiteval;
188 +
189 +        whiteval = lumens/area/(WHTEFFICACY*PI);
190 +
191 +        printf("Lamp color (RGB) = %f %f %f\n",
192 +                        lampcolor[0]*whiteval,
193 +                        lampcolor[1]*whiteval,
194 +                        lampcolor[2]*whiteval);
195 + }
196 +
197 +
198 + static int
199 + getd(           /* get a positive double from stdin */
200 +        char    *name,
201 +        double  *dp,
202 +        char    *help
203 + )
204 + {
205 +        char    buf[32];
206 + again:
207 +        printf("%s [%g]: ", name, *dp);
208 +        if (fgets(buf, sizeof(buf), stdin) == NULL)
209 +                return(0);
210 +        if (buf[0] == '?') {
211 +                puts(help);
212 +                goto again;
213 +        }
214 +        if ((buf[0] < '0' || buf[0] > '9') && buf[0] != '.')
215 +                return(0);
216 +        *dp = atof(buf);
217 +        return(1);
218 + }
219 +
220 +
221 + static int
222 + getpolygon(void)                        /* get projected area for a polygon */
223 + {
224 +        static double   parea = 1.0;
225 +
226 +        getd("Polygon area", &parea,
227 +                "Enter the total radiating area of the polygon.");
228 +        area = unit2meter*unit2meter * parea;
229 +        return(1);
230 + }
231 +
232 +
233 + static int
234 + getsphere(void)                 /* get projected area for a sphere */
235 + {
236 +        static double   radius = 1.0;
237 +
238 +        getd("Sphere radius", &radius,
239 +                "Enter the distance from the sphere's center to its surface.");
240 +        area = 4.*PI*unit2meter*unit2meter * radius*radius;
241 +        return(1);
242 + }
243 +
244 +
245 + static int
246 + getcylinder(void)                       /* get projected area for a cylinder */
247 + {
248 +        static double   length = 1.0, radius = 0.1;
249 +
250 +        getd("Cylinder length", &length,
251 +                "Enter the length of the cylinder.");
252 +        getd("Cylinder radius", &radius,
253 +                "Enter the distance from the cylinder's axis to its surface.");
254 +        area = 2.*PI*unit2meter*unit2meter * radius*length;
255 +        return(1);
256 + }
257 +
258 +
259 + static int
260 + getring(void)                   /* get projected area for a ring */
261 + {
262 +        static double   radius = 1.0;
263 +
264 +        getd("Disk radius", &radius,
265 + "Enter the distance from the ring's center to its outer edge.\n\
266 + The inner radius must be zero.");
267 +        area = PI*unit2meter*unit2meter * radius*radius;
268 +        return(1);
269   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines