ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/dircode.c
Revision: 3.1
Committed: Tue Dec 23 09:20:11 1997 UTC (27 years, 6 months ago) by gregl
Content type: text/plain
Branch: MAIN
Log Message:
Initial revision

File Contents

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