ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/rhd_geom.c
Revision: 3.7
Committed: Fri Jan 29 15:04:03 1999 UTC (25 years, 3 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 3.6: +4 -2 lines
Log Message:
addes savestr() call to gmAddGeom() for safety

File Contents

# User Rev Content
1 gwlarson 3.5 /* Copyright (c) 1999 Silicon Graphics, Inc. */
2 gwlarson 3.1
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ SGI";
5     #endif
6    
7     /*
8 gwlarson 3.2 * Geometry drawing operations for OpenGL driver.
9 gwlarson 3.1 */
10    
11     #include "radogl.h"
12 gwlarson 3.2 #include "rhdriver.h"
13 gwlarson 3.1
14 gwlarson 3.2 #ifndef MAXGEO
15     #define MAXGEO 8 /* maximum geometry list length */
16 gwlarson 3.1 #endif
17 gwlarson 3.2 #ifndef MAXPORT
18     #define MAXPORT (MAXGEO*4) /* maximum number of portal files */
19     #endif
20 gwlarson 3.1
21 gwlarson 3.2 int gmPortals = 0; /* current portal GL list id */
22     static char *curportlist[MAXPORT]; /* current portal list */
23     static char *newportlist[MAXPORT]; /* new portal file list */
24    
25     static struct gmEntry {
26     char *gfile; /* geometry file name */
27 gwlarson 3.1 FVECT cent; /* centroid */
28     FLOAT rad; /* radius */
29     int listid; /* display list identifier */
30 gwlarson 3.2 } gmCurrent[MAXGEO], gmNext[MAXGEO]; /* current and next list */
31 gwlarson 3.1
32 gwlarson 3.2 #define FORALLGEOM(ot,i) for (i=0;i<MAXGEO&&ot[i].gfile!=NULL;i++)
33 gwlarson 3.1
34 gwlarson 3.2 #define FORALLPORT(pl,i) for (i=0;i<MAXPORT&&pl[i]!=NULL;i++)
35 gwlarson 3.1
36 gwlarson 3.6 extern char *nextword();
37 gwlarson 3.2
38    
39     gmNewGeom(file) /* add new geometry to next list */
40     char *file;
41 gwlarson 3.1 {
42     register int i, j;
43     /* check if already in next list */
44 gwlarson 3.2 FORALLGEOM(gmNext, i)
45     if (!strcmp(file, gmNext[i].gfile))
46 gwlarson 3.1 return;
47 gwlarson 3.2 if (i >= MAXGEO) {
48 gwlarson 3.1 error(WARNING, "too many section octrees -- ignoring extra");
49     return;
50     }
51     /* check if copy in current list */
52 gwlarson 3.2 FORALLGEOM(gmCurrent, j)
53     if (!strcmp(file, gmCurrent[j].gfile)) {
54     copystruct(&gmNext[i], &gmCurrent[j]);
55 gwlarson 3.1 return;
56     }
57     /* else load new octree */
58 gwlarson 3.7 gmNext[i].gfile = savestr(file);
59 gwlarson 3.1 dolights = 0;
60 gwlarson 3.2 domats = 1;
61     gmNext[i].listid = rgl_octlist(file, gmNext[i].cent, &gmNext[i].rad);
62 gwlarson 3.5 gmNext[i].rad *= 1.732; /* go to corners */
63 gwlarson 3.1 #ifdef DEBUG
64     fprintf(stderr, "Loaded octree \"%s\" into listID %d with radius %f\n",
65 gwlarson 3.2 file, gmNext[i].listid, gmNext[i].rad);
66 gwlarson 3.1 #endif
67     }
68    
69    
70 gwlarson 3.2 gmEndGeom() /* make next list current */
71 gwlarson 3.1 {
72     register int i, j;
73    
74 gwlarson 3.2 FORALLGEOM(gmCurrent, i) {
75     FORALLGEOM(gmNext, j)
76     if (gmNext[j].listid == gmCurrent[i].listid)
77 gwlarson 3.1 break;
78 gwlarson 3.7 if (j >= MAXGEO || gmNext[j].gfile == NULL) {
79 gwlarson 3.2 glDeleteLists(gmCurrent[i].listid, 1); /* not found */
80 gwlarson 3.7 freestr(gmCurrent[i].gfile);
81     }
82 gwlarson 3.1 }
83 gwlarson 3.2 bcopy((char *)gmNext, (char *)gmCurrent, sizeof(gmNext));
84     bzero((char *)gmNext, sizeof(gmNext));
85 gwlarson 3.1 }
86    
87    
88     int
89 gwlarson 3.6 gmDrawGeom() /* draw current list of octrees */
90 gwlarson 3.1 {
91 gwlarson 3.2 register int n;
92 gwlarson 3.1
93 gwlarson 3.2 FORALLGEOM(gmCurrent, n)
94     glCallList(gmCurrent[n].listid);
95 gwlarson 3.3 return(n);
96     }
97    
98    
99     gmDrawPortals(r, g, b, a) /* draw portals with specific RGBA value */
100     int r, g, b, a;
101     {
102     if (!gmPortals || r<0 & g<0 & b<0 & a<0)
103     return;
104     glPushAttrib(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT|
105     GL_POLYGON_BIT|GL_LIGHTING_BIT);
106     glDisable(GL_LIGHTING);
107     glDisable(GL_DITHER);
108 gwlarson 3.4 glShadeModel(GL_FLAT);
109 gwlarson 3.3 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
110     /* don't actually write depth */
111 gwlarson 3.2 glDepthMask(GL_FALSE);
112 gwlarson 3.3 /* draw only selected channels */
113     glColorMask(r>=0, g>=0, b>=0, a>=0);
114     glColor4ub(r&0xff, g&0xff, b&0xff, a&0xff);
115 gwlarson 3.2 glCallList(gmPortals); /* draw them portals */
116     glPopAttrib();
117 gwlarson 3.1 }
118    
119    
120 gwlarson 3.2 gmDepthLimit(dl, vorg, vdir) /* compute approximate depth limits for view */
121 gwlarson 3.1 double dl[2];
122     FVECT vorg, vdir;
123     {
124     FVECT v;
125     double dcent;
126     register int i;
127    
128     dl[0] = FHUGE; dl[1] = 0.;
129 gwlarson 3.2 FORALLGEOM(gmCurrent, i) {
130     VSUB(v, gmCurrent[i].cent, vorg);
131 gwlarson 3.1 dcent = DOT(v, vdir);
132 gwlarson 3.2 if (dl[0] > dcent-gmCurrent[i].rad)
133     dl[0] = dcent-gmCurrent[i].rad;
134     if (dl[1] < dcent+gmCurrent[i].rad)
135     dl[1] = dcent+gmCurrent[i].rad;
136 gwlarson 3.1 }
137     if (dl[0] < 0.)
138     dl[0] = 0.;
139 gwlarson 3.2 }
140    
141    
142     gmNewPortal(pflist) /* add portal file(s) to our new list */
143     char *pflist;
144     {
145     register int i, j;
146     char newfile[128];
147    
148     if (pflist == NULL)
149     return;
150 gwlarson 3.6 while ((pflist = nextword(newfile, sizeof(newfile), pflist)) != NULL) {
151 gwlarson 3.2 FORALLPORT(newportlist,i)
152     if (!strcmp(newportlist[i], newfile))
153     goto endloop; /* in list already */
154     if (i >= MAXPORT) {
155     error(WARNING, "too many portals -- ignoring extra");
156     return;
157     }
158     newportlist[i] = savestr(newfile);
159     endloop:;
160     }
161     }
162    
163    
164     static int
165     sstrcmp(ss0, ss1)
166     char **ss0, **ss1;
167     {
168     return(strcmp(*ss0, *ss1));
169     }
170    
171    
172     int
173     gmEndPortal() /* close portal list and return GL list */
174     {
175     register int n;
176    
177     FORALLPORT(newportlist, n);
178     if (!n) { /* free old GL list */
179     if (gmPortals)
180     glDeleteLists(gmPortals, 1);
181     gmPortals = 0;
182     } else
183     qsort(newportlist, n, sizeof(char *), sstrcmp);
184     FORALLPORT(newportlist, n) /* compare sorted lists */
185     if (curportlist[n] == NULL ||
186     strcmp(curportlist[n],newportlist[n])) {
187     /* load new list */
188     if (gmPortals)
189     glDeleteLists(gmPortals, 1);
190     FORALLPORT(newportlist, n);
191     dolights = 0;
192     domats = 0;
193     gmPortals = rgl_filelist(n, newportlist);
194     break;
195     }
196     FORALLPORT(curportlist, n) /* free old file list */
197     freestr(curportlist[n]);
198     bcopy((char *)newportlist, (char *)curportlist, sizeof(newportlist));
199     bzero((char *)newportlist, sizeof(newportlist));
200     return(gmPortals); /* return GL list id */
201 gwlarson 3.1 }