]> git.jsancho.org Git - lugaru.git/blob - Source/Stereo.cpp
69013bf4f58509caf29dc27f5ac62ca1bf88416b
[lugaru.git] / Source / Stereo.cpp
1
2 #include "Game.h"
3 #include "Stereo.h"
4
5
6 extern int kContextWidth;
7 extern int kContextHeight;
8
9 bool CanInitStereo(StereoMode mode)
10 {
11     GLint stencilbits = 0;
12
13     switch (mode) {
14     case stereoNone:
15         return true;
16         break;
17     case stereoAnaglyph:
18         return true;
19         break;
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");
25             return false;
26         } else {
27             fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
28         }
29         return true;
30         break;
31     default:
32         return false;
33     }
34
35 }
36
37 void InitStereo(StereoMode mode)
38 {
39     switch (mode) {
40     case stereoNone:
41         glDisable( GL_STENCIL_TEST);
42         return;
43     case stereoAnaglyph:
44         glDisable( GL_STENCIL_TEST);
45         return;
46     case stereoHorizontalInterlaced:
47     case stereoVerticalInterlaced:
48
49         fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
50
51         // Setup stencil buffer
52         glDisable( GL_DEPTH_TEST);
53         glDisable(GL_CULL_FACE);
54         glDisable(GL_LIGHTING);
55         glDisable(GL_TEXTURE_2D);
56
57         glEnable( GL_STENCIL_TEST);
58         glClearStencil(0);
59         glClear(  GL_STENCIL_BUFFER_BIT );
60         glStencilFunc(GL_ALWAYS, 0x1, 0x1);
61         glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
62
63         // Setup viewport
64         glViewport(0, 0, kContextWidth, kContextHeight);
65         glMatrixMode(GL_PROJECTION);
66         glPushMatrix();
67         glLoadIdentity();
68         glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
69         glMatrixMode(GL_MODELVIEW);
70         glPushMatrix();
71         glLoadIdentity();
72         glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
73         glDisable(GL_LINE_SMOOTH);
74
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) {
79                 glBegin(GL_LINES);
80                 glVertex3f(0.5, y + 0.5, 0);
81                 glVertex3f(kContextWidth + 0.5, y + 0.5, 0);
82                 glEnd();
83             }
84         } else {
85             for (int x = 0; x < kContextWidth; x += 2) {
86                 glBegin(GL_LINES);
87                 glVertex3f(x + 0.5, 0.5, 0);
88                 glVertex3f(x + 0.5, kContextHeight + 0.5, 0);
89                 glEnd();
90             }
91         }
92
93         glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
94
95         glPopMatrix();
96         glMatrixMode(GL_PROJECTION);
97         glPopMatrix();
98
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);
105
106     }
107
108 }
109
110 const char* StereoModeName(StereoMode mode)
111 {
112     switch (mode) {
113     case stereoNone:
114         return "None";
115         break;
116     case stereoAnaglyph:
117         return "Anaglyph";
118         break;
119     case stereoHorizontalInterlaced:
120         return "Horizontal interlacing";
121         break;
122     case stereoVerticalInterlaced:
123         return "Vertical interlacing";
124         break;
125     case stereoHorizontalSplit:
126         return "Horizontal split";
127         break;
128     case stereoVerticalSplit:
129         return "Vertical split";
130         break;
131     case stereoOpenGL:
132         return "OpenGL";
133         break;
134     default:
135         return "(error)";
136         break;
137     }
138 }