--- ray/src/hd/rhd_ogl.c 1998/12/22 09:40:32 3.7 +++ ray/src/hd/rhd_ogl.c 1998/12/22 12:59:17 3.9 @@ -40,17 +40,6 @@ static char SCCSid[] = "$SunId$ SGI"; #define RAYQLEN 50000 /* max. rays to queue before flush */ #endif -#ifndef PORTALP -#define PORTRED 2 /* portal red color */ -#define PORTGRN -1 /* portal green left alone */ -#define PORTBLU 128 /* portal blue color */ -#define PORTALP -1 /* don't use alpha channel */ -#endif -#define isportal(c) ((PORTRED<0 || (c)[0]==PORTRED) && \ - (PORTGRN<0 || (c)[1]==PORTGRN) && \ - (PORTBLU<0 || (c)[2]==PORTBLU) && \ - (PORTALP<0 || (c)[3]==PORTALP)) - #ifndef FEQ #define FEQ(a,b) ((a)-(b) <= FTINY && (a)-(b) >= -FTINY) #endif @@ -143,23 +132,12 @@ char *id; { extern char *getenv(); static RGBPRIMS myprims = STDPRIMS; -#if (PORTALP<0) static int atlBest[] = {GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE,8, GLX_GREEN_SIZE,8, GLX_BLUE_SIZE,8, GLX_DEPTH_SIZE,15, None}; static int atlOK[] = {GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE,4, GLX_GREEN_SIZE,4, GLX_BLUE_SIZE,4, GLX_DEPTH_SIZE,15, None}; -#else - static int atlBest[] = {GLX_RGBA, GLX_DOUBLEBUFFER, - GLX_RED_SIZE,8, GLX_GREEN_SIZE,8, - GLX_BLUE_SIZE,8, GLX_ALPHA_SIZE,2, - GLX_DEPTH_SIZE,15, None}; - static int atlOK[] = {GLX_RGBA, GLX_DOUBLEBUFFER, - GLX_RED_SIZE,4, GLX_GREEN_SIZE,4, - GLX_BLUE_SIZE,4, GLX_ALPHA_SIZE,2, - GLX_DEPTH_SIZE,15, None}; -#endif char *ev; double gamval = GAMMA; RGBPRIMP dpri = stdprims; @@ -248,7 +226,7 @@ char *id; glXMakeCurrent(ourdisplay, gwind, gctx); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); - glEnable(GL_DITHER); + glClearColor(0, 0, 0, 0); glFrontFace(GL_CCW); glDisable(GL_CULL_FACE); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); @@ -459,8 +437,6 @@ dev_flush() /* flush output as appropriate */ #ifdef DOBJ ndrawn += dobj_render(); #endif - if (ndrawn && gmPortals) - gmDrawPortals(PORTRED,PORTGRN,PORTBLU,PORTALP); checkglerr("rendering right eye"); popright(); /* draw left eye */ #endif @@ -468,8 +444,6 @@ dev_flush() /* flush output as appropriate */ #ifdef DOBJ ndrawn += dobj_render(); #endif - if (ndrawn && gmPortals) - gmDrawPortals(PORTRED,PORTGRN,PORTBLU,PORTALP); glXSwapBuffers(ourdisplay, gwind); checkglerr("rendering base view"); } @@ -515,7 +489,7 @@ static xferdepth() /* load and clear depth buffer */ { register GLfloat *dbp; - register GLubyte *cbuf; + register GLubyte *pbuf; if (depthbuffer == NULL) { /* allocate private depth buffer */ #ifdef STEREO @@ -528,19 +502,22 @@ xferdepth() /* load and clear depth buffer */ } /* allocate alpha buffer for portals */ if (gmPortals) - cbuf = (GLubyte *)malloc(odev.hres*odev.vres * - (4*sizeof(GLubyte))); + pbuf = (GLubyte *)malloc(odev.hres*odev.vres * + (4*sizeof(GLubyte))); else - cbuf = NULL; + pbuf = NULL; #ifdef STEREO setstereobuf(STEREO_BUFFER_RIGHT); glReadPixels(0, 0, odev.hres, odev.vres, GL_DEPTH_COMPONENT, GL_FLOAT, depthright); - if (cbuf != NULL) + if (pbuf != NULL) { + glClear(GL_COLOR_BUFFER_BIT); + gmDrawPortals(0xff, -1, -1, -1); glReadPixels(0, 0, odev.hres, odev.vres, - GL_RGBA, GL_UNSIGNED_BYTE, cbuf); + GL_RGBA, GL_UNSIGNED_BYTE, pbuf); + } for (dbp = depthright + odev.hres*odev.vres; dbp-- > depthright; ) - if (cbuf != NULL && isportal(cbuf+4*(dbp-depthright))) + if (pbuf != NULL && pbuf[4*(dbp-depthright)]&0x40) *dbp = FHUGE; else *dbp = mapdepth(*dbp); @@ -551,18 +528,21 @@ xferdepth() /* load and clear depth buffer */ /* read back depth buffer */ glReadPixels(0, 0, odev.hres, odev.vres, GL_DEPTH_COMPONENT, GL_FLOAT, depthbuffer); - if (cbuf != NULL) + if (pbuf != NULL) { + glClear(GL_COLOR_BUFFER_BIT); /* find portals */ + gmDrawPortals(0xff, -1, -1, -1); glReadPixels(0, 0, odev.hres, odev.vres, - GL_RGBA, GL_UNSIGNED_BYTE, cbuf); + GL_RGBA, GL_UNSIGNED_BYTE, pbuf); + } for (dbp = depthbuffer + odev.hres*odev.vres; dbp-- > depthbuffer; ) - if (cbuf != NULL && isportal(cbuf+4*(dbp-depthbuffer))) + if (pbuf != NULL && pbuf[4*(dbp-depthbuffer)]&0x40) *dbp = FHUGE; else *dbp = mapdepth(*dbp); glClear(GL_DEPTH_BUFFER_BIT); /* clear system depth buffer */ - if (cbuf != NULL) - free((char *)cbuf); /* free our color buffer */ odDepthMap(0, depthbuffer); /* transfer depth data */ + if (pbuf != NULL) + free((char *)pbuf); /* free our portal buffer */ } @@ -588,7 +568,6 @@ int dx, dy; FVECT direc; { GLfloat gldepth; - GLubyte glcolor[4]; double dist; if (dx<0 | dx>=odev.hres | dy<0 | dy>=odev.vres) @@ -598,12 +577,6 @@ FVECT direc; else { glReadPixels(dx,dy, 1,1, GL_DEPTH_COMPONENT, GL_FLOAT, &gldepth); - if (gmPortals) { - glReadPixels(dx,dy, 1,1, GL_RGBA, - GL_UNSIGNED_BYTE, glcolor); - if (isportal(glcolor)) - return(FHUGE); - } dist = mapdepth(gldepth); } if (dist >= .99*FHUGE) @@ -714,7 +687,7 @@ int fore; glPushAttrib(GL_LIGHTING_BIT|GL_ENABLE_BIT); glDisable(GL_LIGHTING); if (fore) - glColor3ub(0, 255, 255); + glColor3ub(4, 250, 250); else glColor3ub(0, 0, 0); glBegin(GL_LINES); /* draw each grid line */ @@ -837,8 +810,6 @@ XButtonPressedEvent *ebut; #ifdef DOBJ ndrawn += dobj_render(); #endif - if (ndrawn && gmPortals) - gmDrawPortals(PORTRED,PORTGRN,PORTBLU,PORTALP); popright(); #endif /* redraw octrees */ @@ -846,8 +817,6 @@ XButtonPressedEvent *ebut; #ifdef DOBJ ndrawn += dobj_render(); /* redraw objects */ #endif - if (ndrawn && gmPortals) - gmDrawPortals(PORTRED, PORTGRN, PORTBLU, PORTALP); glXSwapBuffers(ourdisplay, gwind); if (!ndrawn) sleep(1); /* for reasonable interaction */ @@ -946,6 +915,7 @@ static wipeclean() /* prepare for redraw */ { glDrawBuffer(GL_BACK); /* use double-buffer mode */ + glReadBuffer(GL_BACK); /* clear buffers */ #ifdef STEREO setstereobuf(STEREO_BUFFER_RIGHT);