ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/ambio.c
Revision: 2.14
Committed: Thu Nov 12 21:25:20 2020 UTC (3 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4
Changes since 2.13: +4 -3 lines
Log Message:
fix: minor improvement to ambient value checks

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.14 static const char RCSid[] = "$Id: ambio.c,v 2.13 2019/05/14 17:39:10 greg Exp $";
3 greg 2.1 #endif
4     /*
5     * Read and write portable ambient values
6 greg 2.4 *
7     * Declarations of external symbols in ambient.h
8 greg 2.1 */
9    
10 greg 2.5 #include "copyright.h"
11 greg 2.1
12 greg 2.4 #include "ray.h"
13 greg 2.1 #include "ambient.h"
14    
15    
16 greg 2.12 #define badflt(x) (((x) < -FHUGE) | ((x) > FHUGE))
17 greg 2.1
18 greg 2.6 #define badvec(v) (badflt((v)[0]) | badflt((v)[1]) | badflt((v)[2]))
19 greg 2.3
20 greg 2.1
21 greg 2.4 void
22 greg 2.2 putambmagic(fp) /* write out ambient value magic number */
23     FILE *fp;
24     {
25 greg 2.6 putint(AMBMAGIC, 2, fp);
26 greg 2.2 }
27    
28    
29 greg 2.4 int
30 greg 2.2 hasambmagic(fp) /* read in and check validity of magic # */
31     FILE *fp;
32     {
33 greg 2.6 int magic;
34 greg 2.2
35     magic = getint(2, fp);
36     if (feof(fp))
37     return(0);
38     return(magic == AMBMAGIC);
39     }
40    
41    
42 greg 2.6 #define putpos(v,fp) putflt((v)[0],fp);putflt((v)[1],fp);putflt((v)[2],fp)
43    
44     #define getpos(v,fp) (v)[0]=getflt(fp);(v)[1]=getflt(fp);(v)[2]=getflt(fp)
45    
46     #define putv2(v2,fp) putflt((v2)[0],fp);putflt((v2)[1],fp)
47    
48     #define getv2(v2,fp) (v2)[0]=getflt(fp);(v2)[1]=getflt(fp)
49    
50     int
51     writambval( /* write ambient value to stream */
52     AMBVAL *av,
53     FILE *fp
54     )
55     {
56 greg 2.10 COLR clr;
57 greg 2.6
58     putint(av->lvl, 1, fp);
59     putflt(av->weight, fp);
60     putpos(av->pos, fp);
61     putint(av->ndir, sizeof(av->ndir), fp);
62     putint(av->udir, sizeof(av->udir), fp);
63 greg 2.10 setcolr(clr, colval(av->val,RED),
64 greg 2.6 colval(av->val,GRN), colval(av->val,BLU));
65 greg 2.11 putbinary((char *)clr, sizeof(clr), 1, fp);
66 greg 2.6 putv2(av->rad, fp);
67     putv2(av->gpos, fp);
68     putv2(av->gdir, fp);
69 greg 2.8 putint(av->corral, sizeof(av->corral), fp);
70 greg 2.6 return(ferror(fp) ? -1 : 0);
71     }
72    
73    
74     int
75     ambvalOK( /* check consistency of ambient value */
76     AMBVAL *av
77     )
78     {
79     double d;
80    
81     if (badvec(av->pos)) return(0);
82     if (!av->ndir | !av->udir) return(0);
83 greg 2.7 if ((av->weight <= 0.) | (av->weight > 1.)) return(0);
84 greg 2.6 if ((av->rad[0] <= 0.) | (av->rad[0] >= FHUGE)) return(0);
85     if ((av->rad[1] <= 0.) | (av->rad[1] >= FHUGE)) return(0);
86 greg 2.14 if (av->rad[0] > av->rad[1]+FTINY) return(0);
87 greg 2.7 if ((colval(av->val,RED) < 0.) |
88 greg 2.10 (colval(av->val,RED) >= FHUGE) |
89 greg 2.7 (colval(av->val,GRN) < 0.) |
90 greg 2.10 (colval(av->val,GRN) >= FHUGE) |
91 greg 2.7 (colval(av->val,BLU) < 0.) |
92 greg 2.10 (colval(av->val,BLU) >= FHUGE)) return(0);
93 greg 2.14 if (badflt(av->gpos[0]) | badflt(av->gpos[1])) return(0);
94     if (badflt(av->gdir[0]) | badflt(av->gdir[1])) return(0);
95 greg 2.6 return(1);
96     }
97    
98    
99     int
100     readambval( /* read ambient value from stream */
101     AMBVAL *av,
102     FILE *fp
103     )
104     {
105 greg 2.10 COLR clr;
106 greg 2.6
107 greg 2.10 av->lvl = getint(1, fp) & 0xff;
108 greg 2.6 if (feof(fp))
109     return(0);
110     av->weight = getflt(fp);
111     getpos(av->pos, fp);
112     av->ndir = getint(sizeof(av->ndir), fp);
113     av->udir = getint(sizeof(av->udir), fp);
114 greg 2.11 if (getbinary((char *)clr, sizeof(clr), 1, fp) != 1)
115 greg 2.6 return(0);
116 greg 2.10 colr_color(av->val, clr);
117 greg 2.6 getv2(av->rad, fp);
118     getv2(av->gpos, fp);
119     getv2(av->gdir, fp);
120 greg 2.8 av->corral = (uint32)getint(sizeof(av->corral), fp);
121 greg 2.6 return(feof(fp) ? 0 : ambvalOK(av));
122     }