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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: dircode.c,v 3.4 2003/02/22 02:07:24 greg Exp $";
3 #endif
4 /*
5 * Compute 4-byte direction code (assume this fits into int)
6 */
7
8 #include <math.h>
9 #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 dc |= FXNEG<<i;
37 } 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 d1 = ((dc>>F1SFT & FMASK)+.5)*(1./DCSCALE);
61 d2 = ((dc>>F2SFT & FMASK)+.5)*(1./DCSCALE);
62 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 }