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, 4 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

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.19 static const char RCSid[] = "$Id: lookamb.c,v 2.18 2023/11/15 18:02:52 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * lookamb.c - program to examine ambient components.
6 greg 2.7 */
7    
8 greg 2.8 #include "copyright.h"
9 greg 1.1
10 schorsch 2.9 #include "platform.h"
11 greg 2.7 #include "ray.h"
12 greg 1.4 #include "ambient.h"
13 greg 1.1
14    
15     int dataonly = 0;
16 greg 2.3 int header = 1;
17 greg 1.1 int reverse = 0;
18    
19     AMBVAL av;
20    
21 greg 2.11
22     static void
23     lookamb( /* load & convert ambient values from a file */
24     FILE *fp
25 schorsch 2.10 )
26 greg 1.1 {
27 greg 2.11 FVECT norm, uvec;
28 greg 2.18 COLOR avcol;
29 greg 1.1
30 greg 2.11 while (readambval(&av, fp)) {
31     decodedir(norm, av.ndir);
32     decodedir(uvec, av.udir);
33 greg 2.18 scolor2rgb(avcol, av.val, AMB_CNDX[3], AMB_WLPART);
34 greg 2.11 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 greg 2.18 printf("%e\t%e\t%e\t", colval(avcol,RED),
41     colval(avcol,GRN),
42     colval(avcol,BLU));
43 greg 2.11 printf("%f\t%f\t", av.gpos[0], av.gpos[1]);
44 greg 2.13 printf("%f\t%f\t", av.gdir[0], av.gdir[1]);
45     printf("%u\n", av.corral);
46 greg 2.6 } else {
47 greg 2.14 printf("Position:\t%f\t%f\t%f\n", av.pos[0],
48 greg 2.11 av.pos[1], av.pos[2]);
49 greg 2.12 printf("Normal:\t\t%f\t%f\t%f\n",
50 greg 2.11 norm[0], norm[1], norm[2]);
51     printf("Uvector:\t%f\t%f\t%f\n",
52     uvec[0], uvec[1], uvec[2]);
53 greg 2.12 printf("Lvl,Wt,UVrad:\t%d\t\t%f\t%f\t%f\n", av.lvl,
54 greg 2.11 av.weight, av.rad[0], av.rad[1]);
55 greg 2.18 printf("Value:\t\t%e\t%e\t%e\n", colval(avcol,RED),
56     colval(avcol,GRN), colval(avcol,BLU));
57 greg 2.11 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 greg 2.14 printf("Corral:\t\t%8X\n\n", av.corral);
60 greg 2.6 }
61 greg 2.11 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 greg 2.18 COLOR avcol;
74 greg 2.11
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 greg 2.19 if (fscanf(fp, FVFORMAT, &norm[0], &norm[1], &norm[2]) != 3 ||
84     normalize(norm) == 0)
85 greg 2.11 return;
86     av.ndir = encodedir(norm);
87     if (!dataonly)
88     fscanf(fp, "%*s");
89 greg 2.19 if (fscanf(fp, FVFORMAT, &norm[0], &norm[1], &norm[2]) != 3 ||
90     normalize(norm) == 0)
91 greg 2.11 return;
92     av.udir = encodedir(norm);
93     if (!dataonly)
94     fscanf(fp, "%*s");
95 greg 2.16 if (fscanf(fp, "%hd %f %f %f", &av.lvl, &av.weight,
96 greg 2.11 &av.rad[0], &av.rad[1]) != 4)
97     return;
98     if (!dataonly)
99     fscanf(fp, "%*s");
100     if (fscanf(fp, "%f %f %f",
101 greg 2.18 &avcol[RED], &avcol[GRN], &avcol[BLU]) != 3)
102 greg 2.11 return;
103 greg 2.18 setscolor(av.val, avcol[RED], avcol[GRN], avcol[BLU]);
104 greg 2.11 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 greg 2.13 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 greg 2.11 av.next = NULL;
118 greg 2.18 if (writambval(&av, stdout) < 0)
119 greg 2.11 exit(1);
120 greg 2.3 }
121 greg 1.1 }
122    
123    
124 greg 2.11 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 greg 2.18 SET_FILE_BINARY(stdout);
161 greg 2.11 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 greg 2.18 fputncomp(3, stdout);
169 greg 2.11 fputformat(AMBFMT, stdout);
170 greg 2.18 fputc('\n', stdout);
171 greg 2.11 putambmagic(stdout);
172     writamb(fp);
173     } else {
174     SET_FILE_BINARY(fp);
175 greg 2.18 if (getheader(fp, amb_headline, header ? stdout : (FILE *)NULL) < 0)
176 greg 2.11 goto formaterr;
177     if (!hasambmagic(fp))
178     goto formaterr;
179     if (header) {
180     fputformat("ascii", stdout);
181 greg 2.18 fputc('\n', stdout);
182 greg 2.11 }
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     }