ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/lookamb.c
Revision: 2.19
Committed: Mon Dec 18 20:19:48 2023 UTC (4 months, 2 weeks ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.18: +5 -3 lines
Log Message:
fix(lookamb): Added step to ensure normals are normalized

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: lookamb.c,v 2.18 2023/11/15 18:02:52 greg Exp $";
3 #endif
4 /*
5 * lookamb.c - program to examine ambient components.
6 */
7
8 #include "copyright.h"
9
10 #include "platform.h"
11 #include "ray.h"
12 #include "ambient.h"
13
14
15 int dataonly = 0;
16 int header = 1;
17 int reverse = 0;
18
19 AMBVAL av;
20
21
22 static void
23 lookamb( /* load & convert ambient values from a file */
24 FILE *fp
25 )
26 {
27 FVECT norm, uvec;
28 COLOR avcol;
29
30 while (readambval(&av, fp)) {
31 decodedir(norm, av.ndir);
32 decodedir(uvec, av.udir);
33 scolor2rgb(avcol, av.val, AMB_CNDX[3], AMB_WLPART);
34 if (dataonly) {
35 printf("%f\t%f\t%f\t", av.pos[0], av.pos[1], av.pos[2]);
36 printf("%f\t%f\t%f\t", norm[0], norm[1], norm[2]);
37 printf("%f\t%f\t%f\t", uvec[0], uvec[1], uvec[2]);
38 printf("%d\t%f\t%f\t%f\t", av.lvl, av.weight,
39 av.rad[0], av.rad[1]);
40 printf("%e\t%e\t%e\t", colval(avcol,RED),
41 colval(avcol,GRN),
42 colval(avcol,BLU));
43 printf("%f\t%f\t", av.gpos[0], av.gpos[1]);
44 printf("%f\t%f\t", av.gdir[0], av.gdir[1]);
45 printf("%u\n", av.corral);
46 } else {
47 printf("Position:\t%f\t%f\t%f\n", av.pos[0],
48 av.pos[1], av.pos[2]);
49 printf("Normal:\t\t%f\t%f\t%f\n",
50 norm[0], norm[1], norm[2]);
51 printf("Uvector:\t%f\t%f\t%f\n",
52 uvec[0], uvec[1], uvec[2]);
53 printf("Lvl,Wt,UVrad:\t%d\t\t%f\t%f\t%f\n", av.lvl,
54 av.weight, av.rad[0], av.rad[1]);
55 printf("Value:\t\t%e\t%e\t%e\n", colval(avcol,RED),
56 colval(avcol,GRN), colval(avcol,BLU));
57 printf("Pos.Grad:\t%f\t%f\n", av.gpos[0], av.gpos[1]);
58 printf("Dir.Grad:\t%f\t%f\n", av.gdir[0], av.gdir[1]);
59 printf("Corral:\t\t%8X\n\n", av.corral);
60 }
61 if (ferror(stdout))
62 exit(1);
63 }
64 }
65
66
67 static void
68 writamb( /* write binary ambient values to stdout */
69 FILE *fp
70 )
71 {
72 FVECT norm;
73 COLOR avcol;
74
75 for ( ; ; ) {
76 if (!dataonly)
77 fscanf(fp, "%*s");
78 if (fscanf(fp, "%f %f %f",
79 &av.pos[0], &av.pos[1], &av.pos[2]) != 3)
80 return;
81 if (!dataonly)
82 fscanf(fp, "%*s");
83 if (fscanf(fp, FVFORMAT, &norm[0], &norm[1], &norm[2]) != 3 ||
84 normalize(norm) == 0)
85 return;
86 av.ndir = encodedir(norm);
87 if (!dataonly)
88 fscanf(fp, "%*s");
89 if (fscanf(fp, FVFORMAT, &norm[0], &norm[1], &norm[2]) != 3 ||
90 normalize(norm) == 0)
91 return;
92 av.udir = encodedir(norm);
93 if (!dataonly)
94 fscanf(fp, "%*s");
95 if (fscanf(fp, "%hd %f %f %f", &av.lvl, &av.weight,
96 &av.rad[0], &av.rad[1]) != 4)
97 return;
98 if (!dataonly)
99 fscanf(fp, "%*s");
100 if (fscanf(fp, "%f %f %f",
101 &avcol[RED], &avcol[GRN], &avcol[BLU]) != 3)
102 return;
103 setscolor(av.val, avcol[RED], avcol[GRN], avcol[BLU]);
104 if (!dataonly)
105 fscanf(fp, "%*s");
106 if (fscanf(fp, "%f %f", &av.gpos[0], &av.gpos[1]) != 2)
107 return;
108 if (!dataonly)
109 fscanf(fp, "%*s");
110 if (fscanf(fp, "%f %f", &av.gdir[0], &av.gdir[1]) != 2)
111 return;
112 if (dataonly) {
113 if (fscanf(fp, "%u", &av.corral) != 1)
114 return;
115 } else if (fscanf(fp, "%*s %X", &av.corral) != 1)
116 return;
117 av.next = NULL;
118 if (writambval(&av, stdout) < 0)
119 exit(1);
120 }
121 }
122
123
124 int
125 main( /* load ambient values from a file */
126 int argc,
127 char *argv[]
128 )
129 {
130 FILE *fp;
131 int i;
132
133 for (i = 1; i < argc; i++)
134 if (argv[i][0] == '-')
135 switch (argv[i][1]) {
136 case 'd':
137 dataonly = 1;
138 break;
139 case 'r':
140 reverse = 1;
141 break;
142 case 'h':
143 header = 0;
144 break;
145 default:
146 fprintf(stderr, "%s: unknown option '%s'\n",
147 argv[0], argv[i]);
148 return(1);
149 }
150 else
151 break;
152
153 if (i >= argc)
154 fp = stdin;
155 else if ((fp = fopen(argv[i], "r")) == NULL) {
156 fprintf(stderr, "%s: file not found\n", argv[i]);
157 return(1);
158 }
159 if (reverse) {
160 SET_FILE_BINARY(stdout);
161 if (header) {
162 if (checkheader(fp, "ascii", stdout) < 0)
163 goto formaterr;
164 } else {
165 newheader("RADIANCE", stdout);
166 printargs(argc, argv, stdout);
167 }
168 fputncomp(3, stdout);
169 fputformat(AMBFMT, stdout);
170 fputc('\n', stdout);
171 putambmagic(stdout);
172 writamb(fp);
173 } else {
174 SET_FILE_BINARY(fp);
175 if (getheader(fp, amb_headline, header ? stdout : (FILE *)NULL) < 0)
176 goto formaterr;
177 if (!hasambmagic(fp))
178 goto formaterr;
179 if (header) {
180 fputformat("ascii", stdout);
181 fputc('\n', stdout);
182 }
183 lookamb(fp);
184 }
185 fclose(fp);
186 return(0);
187 formaterr:
188 fprintf(stderr, "%s: format error on input\n", argv[0]);
189 exit(1);
190 }