ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/holo.h
Revision: 3.30
Committed: Wed Nov 16 00:12:49 2022 UTC (17 months, 1 week ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, HEAD
Changes since 3.29: +2 -2 lines
Log Message:
feat(rhcopy): Added -i* and -o* options for reading and writing rays

File Contents

# Content
1 /* RCSid: $Id: holo.h,v 3.29 2018/10/05 19:46:26 greg Exp $ */
2 /*
3 * Header file for holodeck programs
4 *
5 * 9/29/97 GWLarson
6 */
7 #ifndef _RAD_HOLO_H_
8 #define _RAD_HOLO_H_
9
10 #include "standard.h"
11 #include "color.h"
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 #ifndef HDMAX
18 #define HDMAX 128 /* maximum active holodeck sections */
19 #endif
20
21 #ifndef MAXDIRSE
22 #define MAXDIRSE 32 /* maximum seeks per directory write */
23 #endif
24
25 #define DCINF (unsigned)((1L<<16)-1) /* special value for infinity */
26 #define DCLIN (unsigned)(1L<<11) /* linear depth limit */
27
28 typedef struct {
29 uby8 r[2][2]; /* ray direction index */
30 COLR v; /* color value */
31 uint16 d; /* depth code (from entry wall) */
32 } RAYVAL; /* ray value */
33
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 } GCOORD; /* grid coordinates (two for beam) */
50
51 typedef struct {
52 uint32 nrd; /* number of beam rays bundled on disk */
53 off_t fo; /* position in file */
54 } BEAMI; /* beam index */
55
56 typedef struct {
57 uint32 nrm; /* number of beam rays bundled in memory */
58 uint32 tick; /* clock tick for LRU replacement */
59 } BEAM; /* followed by nrm RAYVAL's */
60
61 #define hdbray(bp) ((RAYVAL *)((bp)+1))
62 #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 int16 grid[3]; /* grid resolution (third) */
68 } 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 int16 grid[3]; /* grid resolution (third) */
74 int fd; /* file descriptor */
75 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 double tlin; /* linear range for depth encoding */
80 FVECT wg[3]; /* wall grid vectors (derived) */
81 int wi[6]; /* wall super-indices (derived) */
82 void *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 typedef struct {
88 HOLO *h; /* pointer to holodeck */
89 int b; /* beam index */
90 } HDBEAMI; /* holodeck beam index */
91
92 #define nbeams(hp) (((hp)->wi[5]-1)<<1)
93 #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 #define hdflush(hp) (hdfreebeam(hp,0), hdsync(hp,0))
99 #define hdclobber(hp) (hdkillbeam(hp,0), hdsync(hp,0))
100
101 #define FF_NEVER 0 /* never free fragments */
102 #define FF_WRITE 01 /* free fragment on write */
103 #define FF_ALLOC 02 /* free fragment on ray alloc */
104 #define FF_READ 04 /* free fragment on read */
105 #define FF_KILL 010 /* free fragment on beam kill */
106
107 extern int hdfragflags; /* tells when to free fragments */
108 extern unsigned hdcachesize; /* target cache size (bytes) */
109 extern unsigned long hdclock; /* holodeck system clock */
110 extern HOLO *hdlist[HDMAX+1]; /* holodeck pointers (NULL term.) */
111
112 extern float hd_depthmap[]; /* depth conversion map */
113
114 extern int hdwg0[6]; /* wall grid 0 index */
115 extern int hdwg1[6]; /* wall grid 1 index */
116
117 #define hddepth(hp,dc) ( (dc) >= DCINF ? FHUGE : \
118 (hp)->tlin * ( (dc) >= DCLIN ? \
119 hd_depthmap[(dc)-DCLIN] : \
120 ((dc)+.5)/DCLIN ) )
121
122 #define HOLOFMT "Holodeck" /* file format identifier */
123 #define HOLOVERS 0 /* file format version number */
124 #define HOLOMAGIC (324+sizeof(BEAMI)+16*HOLOVERS) /* file magic number */
125
126 /*
127 * A holodeck file consists of an information header terminated by a
128 * blank line, with "FORMAT=Holodeck" somewhere in it.
129 * The first integer after the information header is the
130 * above magic number, which includes the file format version number.
131 * The first longword (off_t) after the magic number is a pointer to the
132 * pointer just before the SECOND holodeck section, or 0 if there is only one.
133 * This longword is immediately followed by the first holodeck
134 * section header and directory.
135 * Similarly, every holodeck section in the file is preceeded by
136 * a pointer to the following section, or 0 for the final section.
137 * Since holodeck files consist of directly written C data structures,
138 * they are not generally portable between different machine architectures.
139 * In particular, different floating point formats or bit/byte ordering
140 * will make the data unusable. This is unfortunate, and may be changed
141 * in future versions, but we thought this would be best for paging speed
142 * in our initial implementation.
143 */
144
145 /* clumpbeams.c */
146 extern void clumpbeams(HOLO *hp, int maxcnt, int maxsiz,
147 int (*cf)(HOLO *hp, int *bqueue, int bqlen));
148 /* holo.c */
149 extern void hdcompgrid(HOLO *hp);
150 extern int hdbcoord(GCOORD gc[2], HOLO *hp, int i);
151 extern int hdbindex(HOLO *hp, GCOORD gc[2]);
152 extern void hdcell(FVECT cp[4], HOLO *hp, GCOORD *gc);
153 extern int hdlseg(int lseg[2][3], HOLO *hp, GCOORD gc[2]);
154 extern unsigned int hdcode(HOLO *hp, double d);
155 extern void hdgrid( FVECT gp, HOLO *hp, FVECT wp);
156 extern void hdworld(FVECT wp, HOLO *hp, FVECT gp);
157 extern double hdray(FVECT ro, FVECT rd, HOLO *hp, GCOORD gc[2], uby8 r[2][2]);
158 extern double hdinter(GCOORD gc[2], uby8 r[2][2], double *ed, HOLO *hp,
159 FVECT ro, FVECT rd);
160 /* holofile.c */
161 extern HOLO * hdinit(int fd, HDGRID *hproto);
162 extern void hddone(HOLO *hp);
163 extern int hdsync(HOLO *hp, int all);
164 extern off_t hdfilen(int fd);
165 extern off_t hdfiluse(int fd);
166 extern RAYVAL * hdnewrays(HOLO *hp, int i, int nr);
167 extern BEAM * hdgetbeam(HOLO *hp, int i);
168 extern void hdloadbeams(HDBEAMI *hb, int n, void (*bf)(BEAM *bp, HDBEAMI *hb));
169 extern int hdfreebeam(HOLO *hp, int i);
170 extern int hdfreefrag(HOLO *hp, int i);
171 extern int hdfragOK(int fd, int *listlen, int32 *listsiz);
172 extern int hdkillbeam(HOLO *hp, int i);
173
174
175 #ifdef __cplusplus
176 }
177 #endif
178 #endif /* _RAD_HOLO_H_ */
179