74 |
|
|
75 |
|
struct driver odev; /* global device driver structure */ |
76 |
|
|
77 |
+ |
#ifdef STEREO |
78 |
|
static VIEW vwright; /* right eye view */ |
79 |
+ |
#endif |
80 |
|
|
81 |
|
static int rayqleft = 0; /* rays left to queue before flush */ |
82 |
|
|
218 |
|
pheight *= 2.; |
219 |
|
setstereobuf(STEREO_BUFFER_LEFT); |
220 |
|
#endif |
221 |
+ |
checkglerr("setting rendering parameters"); |
222 |
|
copystruct(&odev.v, &stdview); |
223 |
|
odev.v.type = VT_PER; |
224 |
|
/* map the window */ |
393 |
|
if (mapped) { |
394 |
|
#ifdef STEREO |
395 |
|
pushright(); /* update right eye */ |
393 |
– |
glClear(GL_DEPTH_BUFFER_BIT); |
396 |
|
smUpdate(&vwright, 100); |
397 |
|
#ifdef DOBJ |
398 |
|
dobj_render(); /* usually in foreground */ |
399 |
|
#endif |
400 |
|
popright(); /* update left eye */ |
399 |
– |
glClear(GL_DEPTH_BUFFER_BIT); |
401 |
|
#endif |
402 |
|
smUpdate(&odev.v, 100); |
403 |
|
checkglerr("rendering mesh"); |
436 |
|
glPushMatrix(); |
437 |
|
d = -eyesepdist / sqrt(odev.v.hn2); |
438 |
|
glTranslated(d*odev.v.hvec[0], d*odev.v.hvec[1], d*odev.v.hvec[2]); |
439 |
+ |
checkglerr("setting right view"); |
440 |
|
} |
441 |
|
|
442 |
|
|
508 |
|
draw_grids(fore) /* draw holodeck section grids */ |
509 |
|
int fore; |
510 |
|
{ |
509 |
– |
if (!mapped) |
510 |
– |
return; |
511 |
|
if (fore) |
512 |
|
glColor4ub(0, 255, 255, 0); |
513 |
|
else |
515 |
|
glBegin(GL_LINES); /* draw each grid line */ |
516 |
|
gridlines(draw3dline); |
517 |
|
glEnd(); |
518 |
+ |
checkglerr("drawing grid lines"); |
519 |
|
} |
520 |
|
|
521 |
|
|
594 |
|
int rootx, rooty, wx, wy; |
595 |
|
unsigned int statemask; |
596 |
|
|
597 |
< |
XNoOp(ourdisplay); |
597 |
> |
XNoOp(ourdisplay); /* makes sure we're not idle */ |
598 |
|
|
599 |
|
lasttime = time(0); nframes = 0; |
600 |
|
while (!XCheckMaskEvent(ourdisplay, |
601 |
|
ButtonReleaseMask, levptr(XEvent))) { |
602 |
< |
|
602 |
> |
/* get cursor position */ |
603 |
|
if (!XQueryPointer(ourdisplay, gwind, &rootw, &childw, |
604 |
|
&rootx, &rooty, &wx, &wy, &statemask)) |
605 |
|
break; /* on another screen */ |
606 |
|
|
607 |
|
draw_grids(0); /* clear old grid lines */ |
608 |
+ |
#ifdef STEREO |
609 |
+ |
pushright(); draw_grids(0); popright(); |
610 |
+ |
#endif |
611 |
+ |
/* compute view motion */ |
612 |
|
if (!moveview(wx, odev.vres-1-wy, movdir, movorb)) { |
613 |
|
sleep(1); |
614 |
|
lasttime++; |
615 |
< |
continue; |
615 |
> |
continue; /* cursor in bad place */ |
616 |
|
} |
617 |
+ |
draw_grids(1); /* redraw grid */ |
618 |
|
#ifdef STEREO |
619 |
|
pushright(); |
620 |
|
draw_grids(1); |
624 |
|
#endif |
625 |
|
popright(); |
626 |
|
#endif |
627 |
< |
draw_grids(1); |
627 |
> |
/* redraw mesh */ |
628 |
|
smUpdate(&odev.v, qlevel); |
629 |
|
#ifdef DOBJ |
630 |
< |
dobj_render(); |
630 |
> |
dobj_render(); /* redraw object */ |
631 |
|
#endif |
632 |
|
glFlush(); |
633 |
< |
checkglerr("moving view"); |
628 |
< |
nframes++; |
633 |
> |
nframes++; /* figure out good quality level */ |
634 |
|
thistime = time(0); |
635 |
|
if (thistime - lasttime >= 3 || |
636 |
|
nframes > (int)(3*3*TARGETFPS)) { |
695 |
|
odev.v.vp[1] + odev.v.vdir[1], |
696 |
|
odev.v.vp[2] + odev.v.vdir[2], |
697 |
|
odev.v.vup[0], odev.v.vup[1], odev.v.vup[2]); |
698 |
+ |
checkglerr("setting perspective view"); |
699 |
|
} |
700 |
|
|
701 |
|
|
750 |
|
case CTRL('L'): /* refresh from server */ |
751 |
|
if (inpresflags & DFL(DC_REDRAW)) |
752 |
|
return; |
753 |
+ |
setglpersp(&odev.v); /* reset clipping planes */ |
754 |
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
755 |
< |
glDisable(GL_DEPTH_TEST); |
755 |
> |
glDisable(GL_DEPTH_TEST); /* so grids will clear */ |
756 |
|
draw_grids(1); |
757 |
|
#ifdef STEREO |
758 |
|
pushright(); |
764 |
|
glFlush(); |
765 |
|
smInit(rsL.max_samp); /* get rid of old values */ |
766 |
|
inpresflags |= DFL(DC_REDRAW); /* resend values from server */ |
760 |
– |
setglpersp(&odev.v); /* reset clipping planes */ |
767 |
|
rayqleft = 0; /* hold off update */ |
768 |
|
return; |
769 |
|
case 'K': /* kill rtrace process(es) */ |