ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/lampcolor.c
Revision: 2.11
Committed: Sat Dec 28 18:05:14 2019 UTC (4 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R3, HEAD
Changes since 2.10: +1 -3 lines
Log Message:
Removed redundant include files

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: lampcolor.c,v 2.10 2004/03/18 05:22:00 greg Exp $";
3 #endif
4 /*
5 * Program to convert lamp color from table and compute radiance.
6 */
7
8 #include <math.h>
9
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 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 char buf[64];
67 int i;
68
69 if (argc > 1) lamptab = argv[1];
70 if (loadlamps(lamptab) == 0) {
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 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 }