Implemented GL_NV_texture_rectangle extension.
[mesa.git] / src / mesa / drivers / windows / mesa_extend.c
1 /* File: mesa_extend.c for wmesa-2.3
2 Written by Li Wei (liwei@aiar.xjtu.edu.cn)
3 */
4
5 /*******************************************************************
6 Users can use the following keys to control the view
7
8 The following four key combinations can shift the view correspondingly,
9 function in both stereo and normal mode.
10 Ctrl+left arrow
11 Ctrl+right arrow
12 Ctrl+up arrow
13 Ctrl+down arrow
14
15 F (captital letter) shift the camera far from objects
16 N (captital letter) shift the camera near from objects
17 S (captital letter) toggle between normal and stereo mode
18 I (captital letter) increase the distance between two views
19 D (captital letter) decrease the distance between two views
20
21 if the Key function defined by user maps any key appearing above, it will be
22 masked by the program. Hence, user should either modify his own code or
23 modify function defaultKeyProc at the end of this file
24 *******************************************************************/
25
26 /* Log 6/14, 1997
27 * revision 1.01
28 * struct DisplayOptions defined for tk_ddmesa.c to read the initial file
29 */
30
31 #include "mesa_extend.h"
32 #include "gltk.h"
33 #include <stdio.h>
34 #ifndef NO_STEREO
35 #include "stereo.h"
36 #endif
37 #ifndef NO_PARALLEL
38 // #include "parallel.h"
39 #endif
40
41 GLenum (*userKeyProc) (int, GLenum) = NULL;
42
43 GLfloat viewDistance = 1.0;
44 GLfloat deltaView = 0.1;
45 GLfloat deltaShift = 0.1;
46
47 GLuint viewShift = SHIFT_NONE;
48 GLuint viewTag = 0 ;
49
50 GLenum imageRendered = GL_FALSE;
51
52 GLenum glImageRendered()
53 {
54 return imageRendered;
55 }
56
57 //Code added by Li Wei to enable stereo display
58 GLenum defaultKeyProc(int key, GLenum mask )
59 {
60 GLenum flag = GL_FALSE ;
61 if(mask & TK_CONTROL){
62 flag = GL_TRUE ;
63 switch(key){
64 case TK_LEFT:
65 viewShift = SHIFT_LEFT;
66 break;
67 case TK_RIGHT:
68 viewShift = SHIFT_RIGHT;
69 break;
70 case TK_UP:
71 viewShift = SHIFT_UP;
72 break;
73 case TK_DOWN:
74 viewShift = SHIFT_DOWN;
75 break;
76 default:
77 flag = GL_FALSE ;
78 }
79 }
80 if(flag == GL_FALSE){
81 flag = GL_TRUE ;
82 switch(key){
83 case TK_F:
84 viewShift = SHIFT_FAR;
85 break;
86 case TK_N:
87 viewShift = SHIFT_NEAR;
88 break;
89
90 #if !defined(NO_STEREO)
91 case TK_D:
92 viewDistance-= deltaView;
93 break;
94 case TK_I:
95 viewDistance+= deltaView;
96 break;
97 case TK_S:
98 toggleStereoMode();
99 break;
100 #endif
101
102 #if !defined(NO_PARALLEL)
103 case TK_P:
104 if(machineType == MASTER)
105 toggleParallelMode();
106 break;
107 #endif
108 default:
109 flag = GL_FALSE;
110 }
111 }
112
113 if(userKeyProc)
114 flag=flag||(*userKeyProc)(key, mask);
115
116 #if !defined(NO_PARALLEL)
117 if(parallelFlag&&key!=TK_P&&machineType == MASTER){
118 PRKeyDown(key,mask);
119 }
120 #endif
121
122 return flag;
123 }
124
125 /* The following function implemented key board control of the display,
126 availabe even in normal mode so long the driver is linked into exe file.
127 */
128 void shiftView()
129 {
130 GLfloat cm[16];
131 if(viewShift != SHIFT_NONE){
132 /* glGetFloatv(GL_MODELVIEW_MATRIX,cm);
133 glMatrixMode(GL_MODELVIEW);
134 */
135 GLint matrix_mode;
136 glGetIntegerv(GL_MATRIX_MODE,&matrix_mode);
137 /* if(matrix_mode!=GL_PROJECTION)
138 glMatrixMode(GL_PROJECTION);
139 glGetFloatv(GL_PROJECTION_MATRIX,cm);
140 glLoadIdentity();
141 switch(viewShift){
142 case SHIFT_LEFT:
143 glTranslatef(-deltaShift,0,0);
144 break;
145 case SHIFT_RIGHT:
146 glTranslatef(deltaShift,0,0);
147 break;
148 case SHIFT_UP:
149 glTranslatef(0,deltaShift,0);
150 break;
151 case SHIFT_DOWN:
152 glTranslatef(0,-deltaShift,0);
153 break;
154 case SHIFT_FAR:
155 glTranslatef(0,0,-deltaShift);
156 break;
157 case SHIFT_NEAR:
158 glTranslatef(0,0,deltaShift);
159 break;
160 }
161
162 viewShift = SHIFT_NONE;
163 glMultMatrixf( cm );
164 if(matrix_mode!=GL_PROJECTION)
165 glMatrixMode(matrix_mode);
166
167 }
168 */
169 if(matrix_mode!=GL_MODELVIEW)
170 glMatrixMode(GL_MODELVIEW);
171 glGetFloatv(GL_MODELVIEW_MATRIX,cm);
172 glLoadIdentity();
173 switch(viewShift){
174 case SHIFT_LEFT:
175 glTranslatef(-deltaShift,0,0);
176 break;
177 case SHIFT_RIGHT:
178 glTranslatef(deltaShift,0,0);
179 break;
180 case SHIFT_UP:
181 glTranslatef(0,deltaShift,0);
182 break;
183 case SHIFT_DOWN:
184 glTranslatef(0,-deltaShift,0);
185 break;
186 case SHIFT_FAR:
187 glTranslatef(0,0,-deltaShift);
188 break;
189 case SHIFT_NEAR:
190 glTranslatef(0,0,deltaShift);
191 break;
192 }
193
194 viewShift = SHIFT_NONE;
195 glMultMatrixf( cm );
196 if(matrix_mode!=GL_MODELVIEW)
197 glMatrixMode(matrix_mode);
198
199 }
200 }
201
202
203 void getDisplayOptions( void)
204 {
205 displayOptions.stereo = GetPrivateProfileInt("DISPLAY", "STEREO",1,"ddmesa.ini" );
206 displayOptions.fullScreen = GetPrivateProfileInt("DISPLAY", "FULLSCREEN",0,"ddmesa.ini" );
207 displayOptions.mode = GetPrivateProfileInt("DISPLAY", "MODE",1, "ddmesa.ini");
208 displayOptions.bpp = GetPrivateProfileInt("DISPLAY", "BPP", 32, "ddmesa.ini");
209
210 }
211 //end modification