| 1 | gregl | 3.1 | /* Copyright (c) 1997 Silicon Graphics, Inc. */ | 
| 2 |  |  |  | 
| 3 |  |  | /* SCCSid "$SunId$ SGI" */ | 
| 4 |  |  |  | 
| 5 |  |  | /* | 
| 6 |  |  | * Header file for holodeck programs | 
| 7 |  |  | * | 
| 8 |  |  | *      9/29/97 GWLarson | 
| 9 |  |  | */ | 
| 10 |  |  |  | 
| 11 |  |  | #include "standard.h" | 
| 12 |  |  | #include "color.h" | 
| 13 |  |  |  | 
| 14 |  |  | #ifndef HDMAX | 
| 15 |  |  | #define HDMAX           128     /* maximum active holodeck sections */ | 
| 16 |  |  | #endif | 
| 17 |  |  | #ifndef int2 | 
| 18 |  |  | #define int2    short | 
| 19 |  |  | #endif | 
| 20 |  |  | #ifndef int4 | 
| 21 |  |  | #define int4    long | 
| 22 |  |  | #endif | 
| 23 |  |  |  | 
| 24 |  |  | #define DCINF   (unsigned)((1L<<16)-1)  /* special value for infinity */ | 
| 25 |  |  | #define DCLIN   (unsigned)(1L<<11)      /* linear depth limit */ | 
| 26 |  |  |  | 
| 27 |  |  | typedef struct { | 
| 28 |  |  | BYTE    r[2][2];        /* ray direction index */ | 
| 29 |  |  | COLR    v;              /* value */ | 
| 30 |  |  | unsigned int2   d;      /* depth code */ | 
| 31 |  |  | } RAYVAL;               /* ray value (from second wall) */ | 
| 32 |  |  |  | 
| 33 |  |  | /* | 
| 34 |  |  | * Walls are ordered:           X0      X1      X2      WN | 
| 35 |  |  | *                              0       ?       ?       0 | 
| 36 |  |  | *                              1       ?       ?       1 | 
| 37 |  |  | *                              ?       0       ?       2 | 
| 38 |  |  | *                              ?       1       ?       3 | 
| 39 |  |  | *                              ?       ?       0       4 | 
| 40 |  |  | *                              ?       ?       1       5 | 
| 41 |  |  | * | 
| 42 |  |  | * Grid on wall WN corresponds to X(WN/2+1)%3 and X(WN/2+2)%3, resp. | 
| 43 |  |  | */ | 
| 44 |  |  |  | 
| 45 |  |  | typedef struct { | 
| 46 |  |  | short   w;              /* wall number */ | 
| 47 |  |  | short   i[2];           /* index on wall grid */ | 
| 48 |  |  | } BCOORD[2];            /* beam grid coordinates */ | 
| 49 |  |  |  | 
| 50 |  |  | typedef struct { | 
| 51 |  |  | unsigned int4   nrd;    /* number of beam rays bundled on disk */ | 
| 52 |  |  | long    fo;             /* position in file */ | 
| 53 |  |  | } BEAMI;                /* beam index */ | 
| 54 |  |  |  | 
| 55 |  |  | typedef struct { | 
| 56 |  |  | unsigned int4   nrm;    /* number of beam rays bundled in memory */ | 
| 57 |  |  | unsigned long   tick;   /* clock tick for LRU replacement */ | 
| 58 |  |  | } BEAM;                 /* followed by nrm RAYVAL's */ | 
| 59 |  |  |  | 
| 60 |  |  | #define hdbray(bp)      (RAYVAL *)((bp)+1) | 
| 61 |  |  | #define hdbsiz(nr)      (sizeof(BEAM)+(nr)*sizeof(RAYVAL)) | 
| 62 |  |  |  | 
| 63 |  |  | typedef struct { | 
| 64 |  |  | FVECT   orig;           /* prism origin (first) */ | 
| 65 |  |  | FVECT   xv[3];          /* side vectors (second) */ | 
| 66 |  |  | int2    grid[3];        /* grid resolution (third) */ | 
| 67 |  |  | } HDGRID;               /* holodeck section grid (must match HOLO struct) */ | 
| 68 |  |  |  | 
| 69 |  |  | typedef struct holo { | 
| 70 |  |  | FVECT   orig;           /* prism origin (first) */ | 
| 71 |  |  | FVECT   xv[3];          /* side vectors (second) */ | 
| 72 |  |  | int2    grid[3];        /* grid resolution (third) */ | 
| 73 |  |  | int     fd;             /* file descriptor */ | 
| 74 |  |  | short   dirty;          /* beam index needs update to file */ | 
| 75 |  |  | double  tlin;           /* linear range for depth encoding */ | 
| 76 |  |  | FVECT   wn[3];          /* wall normals (derived) */ | 
| 77 |  |  | double  wo[6];          /* wall offsets (derived) */ | 
| 78 |  |  | FVECT   gv[3][2];       /* grid coordinate vectors (derived) */ | 
| 79 |  |  | int     wi[6];          /* wall super-indices (derived) */ | 
| 80 |  |  | char    *priv;          /* pointer to private client data */ | 
| 81 |  |  | BEAM    **bl;           /* beam pointers (memory cache) */ | 
| 82 |  |  | BEAMI   bi[1];          /* beam index (extends struct) */ | 
| 83 |  |  | } HOLO;                 /* holodeck section */ | 
| 84 |  |  |  | 
| 85 |  |  | #define nbeams(hp)      (2*((hp)->wi[5]-1)) | 
| 86 |  |  | #define biglob(hp)      ((hp)->bi) | 
| 87 |  |  | #define blglob(hp)      (*(hp)->bl) | 
| 88 |  |  |  | 
| 89 |  |  | #define bnrays(hp,i)    ((hp)->bl[i]!=NULL ? (hp)->bl[i]->nrm : (hp)->bi[i].nrd) | 
| 90 |  |  |  | 
| 91 |  |  | #define hdflush(hp)     (hdfreebeam(hp,0) && hdsync(hp)) | 
| 92 |  |  |  | 
| 93 |  |  | extern HOLO     *hdinit(); | 
| 94 |  |  | extern BEAM     *hdgetbeam(); | 
| 95 |  |  | extern RAYVAL   *hdnewrays(); | 
| 96 |  |  | extern long     hdmemuse(), hdfiluse(); | 
| 97 |  |  | extern double   hdray(), hdinter(); | 
| 98 |  |  | extern unsigned hdcode(); | 
| 99 |  |  |  | 
| 100 |  |  | extern int      hdcachesize;            /* target cache size (bytes) */ | 
| 101 |  |  | extern unsigned long    hdclock;        /* holodeck system clock */ | 
| 102 |  |  | extern HOLO     *hdlist[HDMAX+1];       /* holodeck pointers (NULL term.) */ | 
| 103 |  |  |  | 
| 104 |  |  | extern float    hd_depthmap[];          /* depth conversion map */ | 
| 105 |  |  |  | 
| 106 |  |  | #define hddepth(hp,dc)  ( (dc) >= DCINF ? FHUGE : \ | 
| 107 |  |  | (hp)->tlin * ( (dc) >= DCLIN ? \ | 
| 108 |  |  | hd_depthmap[(dc)-DCLIN] : \ | 
| 109 |  |  | ((dc)+.5)/DCLIN ) ) | 
| 110 |  |  |  | 
| 111 |  |  | #define HOLOFMT         "Holodeck"      /* file format identifier */ | 
| 112 |  |  | #define HOLOVERS        0               /* file format version number */ | 
| 113 |  |  | #define HOLOMAGIC       (327+HOLOVERS)  /* file magic number */ | 
| 114 |  |  |  | 
| 115 |  |  | /* | 
| 116 |  |  | * A holodeck file consists of an information header terminated by a | 
| 117 |  |  | * blank line, with "FORMAT=Holodeck" somewhere in it. | 
| 118 |  |  | * The first integer after the information header is the | 
| 119 |  |  | * above magic number, which includes the file format version number. | 
| 120 |  |  | * The first longword after the magic number is the position | 
| 121 |  |  | * of the SECOND holodeck section, or 0 if there is only one. | 
| 122 |  |  | * This longword is immediately followed by the first holodeck | 
| 123 |  |  | * section header and directory. | 
| 124 |  |  | * Similarly, every holodeck section in the file is preceeded by | 
| 125 |  |  | * a pointer to the following section, or 0 for the final section. | 
| 126 |  |  | * Since holodeck files consist of directly written C data structures, | 
| 127 |  |  | * they are not generally portable between different machine architectures. | 
| 128 |  |  | * In particular, different floating point formats or bit/byte ordering | 
| 129 |  |  | * will make the data unusable.  This is unfortunate, and may be changed | 
| 130 |  |  | * in future versions, but we thought this would be best for paging speed | 
| 131 |  |  | * in our initial implementation. | 
| 132 |  |  | */ |