ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/dircode.c
Revision: 2.1
Committed: Tue Mar 4 05:49:21 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Moved dircode.c and fixed prototype compiles in hd directory

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2     static const char RCSid[] = "$Id$";
3     #endif
4     /*
5     * Compute 4-byte direction code (assume this fits into int)
6     */
7    
8     #include "standard.h"
9    
10     #define DCSCALE 11585.2 /* (1<<13)*sqrt(2) */
11     #define FXNEG 01
12     #define FYNEG 02
13     #define FZNEG 04
14     #define F1X 010
15     #define F2Z 020
16     #define F1SFT 5
17     #define F2SFT 18
18     #define FMASK 0x1fff
19    
20     int4
21     encodedir(dv) /* encode a normalized direction vector */
22     FVECT dv;
23     {
24     register int4 dc = 0;
25     int cd[3], cm;
26     register int i;
27    
28     for (i = 0; i < 3; i++)
29     if (dv[i] < 0.) {
30     cd[i] = dv[i] * -DCSCALE;
31     dc |= FXNEG<<i;
32     } else
33     cd[i] = dv[i] * DCSCALE;
34     if (cd[0] <= cd[1]) {
35     dc |= F1X | cd[0] << F1SFT;
36     cm = cd[1];
37     } else {
38     dc |= cd[1] << F1SFT;
39     cm = cd[0];
40     }
41     if (cd[2] <= cm)
42     dc |= F2Z | cd[2] << F2SFT;
43     else
44     dc |= cm << F2SFT;
45     return(dc);
46     }
47    
48    
49     void
50     decodedir(dv, dc) /* decode a normalized direction vector */
51     register FVECT dv; /* returned */
52     register int4 dc;
53     {
54     double d1, d2, der;
55    
56     d1 = ((dc>>F1SFT & FMASK)+.5)*(1./DCSCALE);
57     d2 = ((dc>>F2SFT & FMASK)+.5)*(1./DCSCALE);
58     der = sqrt(1. - d1*d1 - d2*d2);
59     if (dc & F1X) {
60     dv[0] = d1;
61     if (dc & F2Z) { dv[1] = der; dv[2] = d2; }
62     else { dv[1] = d2; dv[2] = der; }
63     } else {
64     dv[1] = d1;
65     if (dc & F2Z) { dv[0] = der; dv[2] = d2; }
66     else { dv[0] = d2; dv[2] = der; }
67     }
68     if (dc & FXNEG) dv[0] = -dv[0];
69     if (dc & FYNEG) dv[1] = -dv[1];
70     if (dc & FZNEG) dv[2] = -dv[2];
71     }
72    
73    
74     double
75     dir2diff(dc1, dc2) /* approx. radians^2 between directions */
76     int4 dc1, dc2;
77     {
78     FVECT v1, v2;
79    
80     decodedir(v1, dc1);
81     decodedir(v2, dc2);
82    
83     return(2. - 2.*DOT(v1,v2));
84     }
85    
86    
87     double
88     fdir2diff(dc1, v2) /* approx. radians^2 between directions */
89     int4 dc1;
90     register FVECT v2;
91     {
92     FVECT v1;
93    
94     decodedir(v1, dc1);
95    
96     return(2. - 2.*DOT(v1,v2));
97     }