6 extern int kContextWidth;
7 extern int kContextHeight;
9 bool CanInitStereo(StereoMode mode) {
10 GLint stencilbits = 0;
19 case stereoHorizontalInterlaced:
20 case stereoVerticalInterlaced:
21 glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
22 if ( stencilbits < 1 ) {
23 fprintf(stderr, "Failed to get a stencil buffer, interlaced stereo not available.\n");
26 fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
36 void InitStereo(StereoMode mode) {
39 glDisable( GL_STENCIL_TEST);
42 glDisable( GL_STENCIL_TEST);
44 case stereoHorizontalInterlaced:
45 case stereoVerticalInterlaced:
47 fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
49 // Setup stencil buffer
50 glDisable( GL_DEPTH_TEST);
51 glDisable(GL_CULL_FACE);
52 glDisable(GL_LIGHTING);
53 glDisable(GL_TEXTURE_2D);
55 glEnable( GL_STENCIL_TEST);
57 glClear( GL_STENCIL_BUFFER_BIT );
58 glStencilFunc(GL_ALWAYS, 0x1, 0x1);
59 glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
62 glViewport(0,0, kContextWidth, kContextHeight);
63 glMatrixMode(GL_PROJECTION);
66 glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
67 glMatrixMode(GL_MODELVIEW);
70 glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
71 glDisable(GL_LINE_SMOOTH);
73 // Add 0.5 to the coordinates, because OpenGL considers a pixel should be
74 // turned on when a line passes through the center of it.
75 if ( mode == stereoHorizontalInterlaced ) {
76 for(int y=0;y<kContextHeight;y+=2) {
78 glVertex3f(0.5, y+0.5, 0);
79 glVertex3f(kContextWidth+0.5, y+0.5, 0);
83 for(int x=0;x<kContextWidth;x+=2) {
85 glVertex3f(x+0.5, 0.5, 0);
86 glVertex3f(x+0.5, kContextHeight+0.5, 0);
91 glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
94 glMatrixMode(GL_PROJECTION);
97 glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
98 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
99 glEnable( GL_DEPTH_TEST);
100 glEnable(GL_CULL_FACE);
101 glEnable(GL_LIGHTING);
102 glEnable(GL_TEXTURE_2D);
108 const char* StereoModeName(StereoMode mode) {
110 case stereoNone: return "None"; break;
111 case stereoAnaglyph: return "Anaglyph"; break;
112 case stereoHorizontalInterlaced: return "Horizontal interlacing"; break;
113 case stereoVerticalInterlaced: return "Vertical interlacing"; break;
114 case stereoHorizontalSplit: return "Horizontal split"; break;
115 case stereoVerticalSplit: return "Vertical split"; break;
116 case stereoOpenGL: return "OpenGL"; break;
117 default: return "(error)"; break;