1 //**************************************************************************
5 //**************************************************************************
17 #include "p_local.h" // for P_AproxDistance
25 int screenWidth = SCREENWIDTH*2;
26 int screenHeight = SCREENHEIGHT*2;
28 int ratioLimit = 0; // Zero if none.
31 int DisplayTicker = 0;
35 extern void OGL_InitData();
36 extern void OGL_InitRenderer();
37 extern void OGL_ResetData();
38 extern void OGL_ResetLumpTexData();
40 void I_StartupNet (void);
41 void I_ShutdownNet (void);
42 void I_ReadExternDriver(void);
43 void GrabScreen (void);
45 extern int usemouse, usejoystick;
47 extern void **lumpcache;
50 externdata_t *i_ExternData;
51 boolean useexterndriver;
57 boolean novideo; // if true, stay in text mode for debugging
66 //--------------------------------------------------------------------------
70 //--------------------------------------------------------------------------
72 void I_WaitVBL(int vbls)
80 SDL_Delay( 16667/1000 );
84 //--------------------------------------------------------------------------
88 // Palette source must use 8 bit RGB elements.
90 //--------------------------------------------------------------------------
92 void I_SetPalette(byte *palette)
97 SDL_Color cmap[ 256 ];
107 for( ; c != cend; c++ )
109 //_outbyte(PEL_DATA, (gammatable[usegamma][*palette++])>>2);
111 c->r = gammatable[usegamma][*palette++];
112 c->g = gammatable[usegamma][*palette++];
113 c->b = gammatable[usegamma][*palette++];
115 SDL_SetColors( sdl_screen, cmap, 0, 256 );
120 ============================================================================
124 ============================================================================
127 byte *pcscreen, *destscreen, *destview;
138 extern int screenblocks;
142 if(UpdateState == I_NOUPDATE)
145 SDL_GL_SwapBuffers();
146 UpdateState = I_NOUPDATE;
149 //--------------------------------------------------------------------------
151 // PROC I_InitGraphics
153 //--------------------------------------------------------------------------
155 void I_InitGraphics(void)
159 Uint32 flags = SDL_OPENGL;
166 if (M_CheckParm("-f") || M_CheckParm("--fullscreen")) {
167 flags |= SDL_FULLSCREEN;
168 setenv ("MESA_GLX_FX","fullscreen", 1);
170 setenv ("MESA_GLX_FX","disable",1);
172 p = M_CheckParm ("-height");
173 if (p && p < myargc - 1)
175 screenHeight = atoi (myargv[p+1]);
177 p = M_CheckParm ("-width");
178 if (p && p < myargc - 1) {
179 screenWidth = atoi(myargv[p+1]);
181 ST_Message("Screen size: %dx%d\n",screenWidth, screenHeight);
183 if(SDL_SetVideoMode(screenWidth, screenHeight, 8, flags) == NULL)
185 fprintf( stderr, "Couldn't set video mode %dx%d: %s\n",
186 screenWidth, screenHeight, SDL_GetError() );
192 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
194 // Print some OpenGL information.
195 ST_Message( "I_InitGraphics: OpenGL information:\n" );
196 ST_Message( " Vendor: %s\n", glGetString(GL_VENDOR) );
197 ST_Message( " Renderer: %s\n", glGetString(GL_RENDERER) );
198 ST_Message( " Version: %s\n", glGetString(GL_VERSION) );
199 ST_Message( " GLU Version: %s\n", gluGetString((GLenum)GLU_VERSION) );
201 // Check the maximum texture size.
202 glGetIntegerv( GL_MAX_TEXTURE_SIZE, &maxTexSize );
203 ST_Message(" Maximum texture size: %d\n", maxTexSize);
204 if( maxTexSize == 256 )
206 //ST_Message(" Is this Voodoo? Using size ratio limit.\n");
210 if( M_CheckParm("-3dfxtest") )
213 ST_Message(" 3dfx test mode.\n");
216 // Only grab if we want to
217 if (!M_CheckParm ("--nograb") && !M_CheckParm ("-g")) {
218 SDL_WM_GrabInput (SDL_GRAB_ON);
222 snprintf (text, 20, "HHexen v%s", HHEXEN_VERSION);
223 SDL_WM_SetCaption( text, "HHEXEN" );
226 //I_SetPalette( W_CacheLumpName("PLAYPAL", PU_CACHE) );
229 //--------------------------------------------------------------------------
231 // PROC I_ShutdownGraphics
233 //--------------------------------------------------------------------------
235 void I_ShutdownGraphics(void)
238 OGL_ResetLumpTexData ();
242 //===========================================================================
245 // Translates the key
248 int xlatekey(SDL_keysym *key)
255 case SDLK_LEFT: rc = KEY_LEFTARROW; break;
256 case SDLK_RIGHT: rc = KEY_RIGHTARROW; break;
257 case SDLK_DOWN: rc = KEY_DOWNARROW; break;
258 case SDLK_UP: rc = KEY_UPARROW; break;
259 case SDLK_ESCAPE: rc = KEY_ESCAPE; break;
262 case SDLK_RETURN: rc = KEY_ENTER; break;
264 case SDLK_F1: rc = KEY_F1; break;
265 case SDLK_F2: rc = KEY_F2; break;
266 case SDLK_F3: rc = KEY_F3; break;
267 case SDLK_F4: rc = KEY_F4; break;
268 case SDLK_F5: rc = KEY_F5; break;
269 case SDLK_F6: rc = KEY_F6; break;
270 case SDLK_F7: rc = KEY_F7; break;
271 case SDLK_F8: rc = KEY_F8; break;
272 case SDLK_F9: rc = KEY_F9; break;
273 case SDLK_F10: rc = KEY_F10; break;
274 case SDLK_F11: rc = KEY_F11; break;
275 case SDLK_F12: rc = KEY_F12; break;
277 case SDLK_INSERT: rc = KEY_INS; break;
278 case SDLK_DELETE: rc = KEY_DEL; break;
279 case SDLK_PAGEUP: rc = KEY_PGUP; break;
280 case SDLK_PAGEDOWN: rc = KEY_PGDN; break;
281 case SDLK_HOME: rc = KEY_HOME; break;
282 case SDLK_END: rc = KEY_END; break;
284 case SDLK_BACKSPACE: rc = KEY_BACKSPACE; break;
286 case SDLK_PAUSE: rc = KEY_PAUSE; break;
288 case SDLK_EQUALS: rc = KEY_EQUALS; break;
291 case SDLK_MINUS: rc = KEY_MINUS; break;
320 /* This processes SDL events */
321 void I_GetEvent(SDL_Event *Event)
330 mod = SDL_GetModState ();
331 if (mod & KMOD_RCTRL || mod & KMOD_LCTRL) {
332 if (Event->key.keysym.sym == 'g') {
333 if (SDL_WM_GrabInput (SDL_GRAB_QUERY) == SDL_GRAB_OFF)
334 SDL_WM_GrabInput (SDL_GRAB_ON);
336 SDL_WM_GrabInput (SDL_GRAB_OFF);
339 } else if (mod & KMOD_RALT || mod & KMOD_LALT) {
340 if (Event->key.keysym.sym == SDLK_RETURN) {
341 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
345 event.type = ev_keydown;
346 event.data1 = xlatekey(&Event->key.keysym);
347 H2_PostEvent(&event);
351 event.type = ev_keyup;
352 event.data1 = xlatekey(&Event->key.keysym);
353 H2_PostEvent(&event);
356 case SDL_MOUSEBUTTONDOWN:
357 case SDL_MOUSEBUTTONUP:
358 buttonstate = SDL_GetMouseState(NULL, NULL);
359 event.type = ev_mouse;
361 | (buttonstate & SDL_BUTTON(1) ? 1 : 0)
362 | (buttonstate & SDL_BUTTON(2) ? 2 : 0)
363 | (buttonstate & SDL_BUTTON(3) ? 4 : 0);
364 event.data2 = event.data3 = 0;
365 H2_PostEvent(&event);
368 case SDL_MOUSEMOTION:
369 /* Ignore mouse warp events */
370 if ( (Event->motion.x != SCREENWIDTH/2) ||
371 (Event->motion.y != SCREENHEIGHT/2) )
373 /* Warp the mouse back to the center */
374 event.type = ev_mouse;
376 | (Event->motion.state & SDL_BUTTON(1) ? 1 : 0)
377 | (Event->motion.state & SDL_BUTTON(2) ? 2 : 0)
378 | (Event->motion.state & SDL_BUTTON(3) ? 4 : 0);
379 event.data2 = Event->motion.xrel << 3;
380 event.data3 = -Event->motion.yrel << 3;
381 H2_PostEvent(&event);
394 void I_StartTic (void)
398 while ( SDL_PollEvent(&Event) )
404 ============================================================================
408 ============================================================================
420 int I_TimerISR (void)
427 ============================================================================
431 ============================================================================
442 void I_StartupMouse (void)
447 static int makeUniqueFilename( char* filename )
451 for( i = 0; i < 100; i++ )
453 sprintf( filename, "hexen%02d.bmp", i );
455 if( access( filename, F_OK ) == -1 )
457 // It does not exist.
472 if (makeUniqueFilename(filename)) {
473 image = SDL_CreateRGBSurface(SDL_SWSURFACE, screenWidth, screenHeight,
474 24, 0x0000FF, 0x00FF00, 0xFF0000,0xFFFFFF);
475 temp = SDL_CreateRGBSurface(SDL_SWSURFACE, screenWidth, screenHeight,
476 24, 0x0000FF, 0x00FF00, 0xFF0000, 0xFFFFFF);
478 glReadPixels(0, 0, screenWidth, screenHeight, GL_RGB,
479 GL_UNSIGNED_BYTE, image->pixels);
480 for (idx = 0; idx < screenHeight; idx++)
482 memcpy(temp->pixels + 3 * screenWidth * idx,
483 (char *)image->pixels + 3
484 * screenWidth*(screenHeight - idx),
487 memcpy(image->pixels,temp->pixels,screenWidth * screenHeight * 3);
488 SDL_SaveBMP(image, filename);
489 SDL_FreeSurface(image);