ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/holo.h
Revision: 3.25
Committed: Thu Sep 9 01:06:19 2004 UTC (19 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad4R0, rad3R6, rad3R6P1, rad3R8, rad3R9
Changes since 3.24: +2 -2 lines
Log Message:
Got rid of silly cost-cutting (and corner-cutting) in hdfiluse()

File Contents

# User Rev Content
1 greg 3.25 /* RCSid: $Id: holo.h,v 3.24 2004/01/01 11:21:55 schorsch Exp $ */
2 gregl 3.1 /*
3     * Header file for holodeck programs
4     *
5     * 9/29/97 GWLarson
6     */
7 schorsch 3.23 #ifndef _RAD_HOLO_H_
8     #define _RAD_HOLO_H_
9 gregl 3.1
10     #include "standard.h"
11     #include "color.h"
12    
13 schorsch 3.23 #ifdef __cplusplus
14     extern "C" {
15     #endif
16    
17 gregl 3.1 #ifndef HDMAX
18     #define HDMAX 128 /* maximum active holodeck sections */
19     #endif
20    
21 gwlarson 3.17 #ifndef MAXDIRSE
22     #define MAXDIRSE 32 /* maximum seeks per directory write */
23     #endif
24    
25 gregl 3.1 #define DCINF (unsigned)((1L<<16)-1) /* special value for infinity */
26     #define DCLIN (unsigned)(1L<<11) /* linear depth limit */
27    
28     typedef struct {
29     BYTE r[2][2]; /* ray direction index */
30 gwlarson 3.15 COLR v; /* color value */
31 greg 3.22 uint16 d; /* depth code (from entry wall) */
32 gwlarson 3.15 } RAYVAL; /* ray value */
33 gregl 3.1
34     /*
35     * Walls are ordered: X0 X1 X2 WN
36     * 0 ? ? 0
37     * 1 ? ? 1
38     * ? 0 ? 2
39     * ? 1 ? 3
40     * ? ? 0 4
41     * ? ? 1 5
42     *
43     * Grid on wall WN corresponds to X(WN/2+1)%3 and X(WN/2+2)%3, resp.
44     */
45    
46     typedef struct {
47     short w; /* wall number */
48     short i[2]; /* index on wall grid */
49 gregl 3.2 } GCOORD; /* grid coordinates (two for beam) */
50 gregl 3.1
51     typedef struct {
52 greg 3.22 uint32 nrd; /* number of beam rays bundled on disk */
53 greg 3.21 off_t fo; /* position in file */
54 gregl 3.1 } BEAMI; /* beam index */
55    
56     typedef struct {
57 greg 3.22 uint32 nrm; /* number of beam rays bundled in memory */
58 gregl 3.1 unsigned long tick; /* clock tick for LRU replacement */
59     } BEAM; /* followed by nrm RAYVAL's */
60    
61 gregl 3.3 #define hdbray(bp) ((RAYVAL *)((bp)+1))
62 gregl 3.1 #define hdbsiz(nr) (sizeof(BEAM)+(nr)*sizeof(RAYVAL))
63    
64     typedef struct {
65     FVECT orig; /* prism origin (first) */
66     FVECT xv[3]; /* side vectors (second) */
67 greg 3.22 int16 grid[3]; /* grid resolution (third) */
68 gregl 3.1 } HDGRID; /* holodeck section grid (must match HOLO struct) */
69    
70     typedef struct holo {
71     FVECT orig; /* prism origin (first) */
72     FVECT xv[3]; /* side vectors (second) */
73 greg 3.22 int16 grid[3]; /* grid resolution (third) */
74 gregl 3.1 int fd; /* file descriptor */
75 gwlarson 3.17 struct {
76     int s, n; /* dirty section start, length */
77     } dirseg[MAXDIRSE+1]; /* dirty beam index segments */
78     short dirty; /* number of dirty segments */
79 gregl 3.1 double tlin; /* linear range for depth encoding */
80 gregl 3.13 FVECT wg[3]; /* wall grid vectors (derived) */
81 gregl 3.1 int wi[6]; /* wall super-indices (derived) */
82     char *priv; /* pointer to private client data */
83     BEAM **bl; /* beam pointers (memory cache) */
84     BEAMI bi[1]; /* beam index (extends struct) */
85     } HOLO; /* holodeck section */
86    
87 gregl 3.9 typedef struct {
88     HOLO *h; /* pointer to holodeck */
89     int b; /* beam index */
90     } HDBEAMI; /* holodeck beam index */
91    
92 gregl 3.14 #define nbeams(hp) (((hp)->wi[5]-1)<<1)
93 gregl 3.1 #define biglob(hp) ((hp)->bi)
94     #define blglob(hp) (*(hp)->bl)
95    
96     #define bnrays(hp,i) ((hp)->bl[i]!=NULL ? (hp)->bl[i]->nrm : (hp)->bi[i].nrd)
97    
98 gwlarson 3.16 #define hdflush(hp) (hdfreebeam(hp,0), hdsync(hp,0))
99     #define hdclobber(hp) (hdkillbeam(hp,0), hdsync(hp,0))
100 gregl 3.1
101 schorsch 3.24 /*
102 gregl 3.4 extern HOLO *hdinit(), *hdalloc();
103 gregl 3.1 extern BEAM *hdgetbeam();
104     extern RAYVAL *hdnewrays();
105 gregl 3.9 extern unsigned hdmemuse();
106 greg 3.21 extern off_t hdfiluse(), hdfilen(), hdallocfrag();
107 gregl 3.1 extern double hdray(), hdinter();
108     extern unsigned hdcode();
109 gregl 3.14 extern int hdfilord();
110 schorsch 3.24 */
111 gregl 3.1
112 gwlarson 3.19 #define FF_NEVER 0 /* never free fragments */
113     #define FF_WRITE 01 /* free fragment on write */
114     #define FF_ALLOC 02 /* free fragment on ray alloc */
115     #define FF_READ 04 /* free fragment on read */
116     #define FF_KILL 010 /* free fragment on beam kill */
117    
118     extern int hdfragflags; /* tells when to free fragments */
119 gregl 3.9 extern unsigned hdcachesize; /* target cache size (bytes) */
120 gregl 3.1 extern unsigned long hdclock; /* holodeck system clock */
121     extern HOLO *hdlist[HDMAX+1]; /* holodeck pointers (NULL term.) */
122    
123     extern float hd_depthmap[]; /* depth conversion map */
124 gregl 3.13
125     extern int hdwg0[6]; /* wall grid 0 index */
126     extern int hdwg1[6]; /* wall grid 1 index */
127 gregl 3.1
128     #define hddepth(hp,dc) ( (dc) >= DCINF ? FHUGE : \
129     (hp)->tlin * ( (dc) >= DCLIN ? \
130     hd_depthmap[(dc)-DCLIN] : \
131     ((dc)+.5)/DCLIN ) )
132    
133     #define HOLOFMT "Holodeck" /* file format identifier */
134     #define HOLOVERS 0 /* file format version number */
135 greg 3.21 #define HOLOMAGIC (323+sizeof(off_t)+8*HOLOVERS) /* file magic number */
136 gregl 3.1
137     /*
138     * A holodeck file consists of an information header terminated by a
139     * blank line, with "FORMAT=Holodeck" somewhere in it.
140     * The first integer after the information header is the
141     * above magic number, which includes the file format version number.
142 gregl 3.6 * The first longword after the magic number is a pointer to the pointer
143     * just before the SECOND holodeck section, or 0 if there is only one.
144 gregl 3.1 * This longword is immediately followed by the first holodeck
145     * section header and directory.
146     * Similarly, every holodeck section in the file is preceeded by
147     * a pointer to the following section, or 0 for the final section.
148     * Since holodeck files consist of directly written C data structures,
149     * they are not generally portable between different machine architectures.
150     * In particular, different floating point formats or bit/byte ordering
151     * will make the data unusable. This is unfortunate, and may be changed
152     * in future versions, but we thought this would be best for paging speed
153     * in our initial implementation.
154     */
155 schorsch 3.24
156     /* clumpbeams.c */
157     extern void clumpbeams(HOLO *hp, int maxcnt, int maxsiz,
158     int (*cf)(HOLO *hp, int *bqueue, int bqlen));
159     /* holo.c */
160     extern void hdcompgrid(HOLO *hp);
161     extern int hdbcoord(GCOORD gc[2], HOLO *hp, int i);
162     extern int hdbindex(HOLO *hp, GCOORD gc[2]);
163     extern void hdcell(FVECT cp[4], HOLO *hp, GCOORD *gc);
164     extern int hdlseg(int lseg[2][3], HOLO *hp, GCOORD gc[2]);
165     extern unsigned int hdcode(HOLO *hp, double d);
166     extern void hdgrid( FVECT gp, HOLO *hp, FVECT wp);
167     extern void hdworld(FVECT wp, HOLO *hp, FVECT gp);
168     extern double hdray(FVECT ro, FVECT rd, HOLO *hp, GCOORD gc[2], BYTE r[2][2]);
169     extern double hdinter(GCOORD gc[2], BYTE r[2][2], double *ed, HOLO *hp,
170     FVECT ro, FVECT rd);
171     /* holofile.c */
172     extern HOLO * hdinit(int fd, HDGRID *hproto);
173     extern void hddone(HOLO *hp);
174     extern int hdsync(HOLO *hp, int all);
175     extern off_t hdfilen(int fd);
176 greg 3.25 extern off_t hdfiluse(int fd);
177 schorsch 3.24 extern RAYVAL * hdnewrays(HOLO *hp, int i, int nr);
178     extern BEAM * hdgetbeam(HOLO *hp, int i);
179     extern void hdloadbeams(HDBEAMI *hb, int n, void (*bf)(BEAM *bp, HDBEAMI *hb));
180     extern int hdfreebeam(HOLO *hp, int i);
181     extern int hdfreefrag(HOLO *hp, int i);
182     extern int hdfragOK(int fd, int *listlen, int32 *listsiz);
183     extern int hdkillbeam(HOLO *hp, int i);
184 schorsch 3.23
185    
186     #ifdef __cplusplus
187     }
188     #endif
189     #endif /* _RAD_HOLO_H_ */
190