6 extern int kContextWidth;
7 extern int kContextHeight;
9 bool CanInitStereo(StereoMode mode)
11 GLint stencilbits = 0;
20 case stereoHorizontalInterlaced:
21 case stereoVerticalInterlaced:
22 glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
23 if ( stencilbits < 1 ) {
24 fprintf(stderr, "Failed to get a stencil buffer, interlaced stereo not available.\n");
27 fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
37 void InitStereo(StereoMode mode)
41 glDisable( GL_STENCIL_TEST);
44 glDisable( GL_STENCIL_TEST);
46 case stereoHorizontalInterlaced:
47 case stereoVerticalInterlaced:
49 fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
51 // Setup stencil buffer
52 glDisable( GL_DEPTH_TEST);
53 glDisable(GL_CULL_FACE);
54 glDisable(GL_LIGHTING);
55 glDisable(GL_TEXTURE_2D);
57 glEnable( GL_STENCIL_TEST);
59 glClear( GL_STENCIL_BUFFER_BIT );
60 glStencilFunc(GL_ALWAYS, 0x1, 0x1);
61 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
64 glViewport(0, 0, kContextWidth, kContextHeight);
65 glMatrixMode(GL_PROJECTION);
68 glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
69 glMatrixMode(GL_MODELVIEW);
72 glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
73 glDisable(GL_LINE_SMOOTH);
75 // Add 0.5 to the coordinates, because OpenGL considers a pixel should be
76 // turned on when a line passes through the center of it.
77 if ( mode == stereoHorizontalInterlaced ) {
78 for (int y = 0; y < kContextHeight; y += 2) {
80 glVertex3f(0.5, y + 0.5, 0);
81 glVertex3f(kContextWidth + 0.5, y + 0.5, 0);
85 for (int x = 0; x < kContextWidth; x += 2) {
87 glVertex3f(x + 0.5, 0.5, 0);
88 glVertex3f(x + 0.5, kContextHeight + 0.5, 0);
93 glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
96 glMatrixMode(GL_PROJECTION);
99 glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
100 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
101 glEnable( GL_DEPTH_TEST);
102 glEnable(GL_CULL_FACE);
103 glEnable(GL_LIGHTING);
104 glEnable(GL_TEXTURE_2D);
110 const char* StereoModeName(StereoMode mode)
119 case stereoHorizontalInterlaced:
120 return "Horizontal interlacing";
122 case stereoVerticalInterlaced:
123 return "Vertical interlacing";
125 case stereoHorizontalSplit:
126 return "Horizontal split";
128 case stereoVerticalSplit:
129 return "Vertical split";