ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/dircode.c
Revision: 3.5
Committed: Tue Mar 4 05:49:21 2003 UTC (21 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 3.4: +1 -1 lines
State: FILE REMOVED
Log Message:
Moved dircode.c and fixed prototype compiles in hd directory

File Contents

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