ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/dircode.c
Revision: 3.3
Committed: Thu May 14 15:37:31 1998 UTC (27 years, 1 month ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 3.2: +3 -3 lines
Log Message:
minor optimization -- changed float divide to multiply

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