mirror of
				https://github.com/KartKrewDev/RingRacers.git
				synced 2025-10-30 08:01:28 +00:00 
			
		
		
		
	sdl2: support all windowed mode resolutions
This commit is contained in:
		
							parent
							
								
									5273989dcd
								
							
						
					
					
						commit
						715a12ff08
					
				
					 1 changed files with 175 additions and 44 deletions
				
			
		|  | @ -111,7 +111,7 @@ boolean allow_fullscreen = false; | |||
| static SDL_bool disable_fullscreen = SDL_FALSE; | ||||
| #define USE_FULLSCREEN (disable_fullscreen||!allow_fullscreen)?0:cv_fullscreen.value | ||||
| static SDL_bool disable_mouse = SDL_FALSE; | ||||
| #define USE_MOUSEINPUT (!disable_mouse && cv_usemouse.value && SDL_GetAppState() & SDL_APPACTIVE) | ||||
| #define USE_MOUSEINPUT (!disable_mouse && cv_usemouse.value && havefocus) | ||||
| #define MOUSE_MENU false //(!disable_mouse && cv_usemouse.value && menuactive && !USE_FULLSCREEN)
 | ||||
| #define MOUSEBUTTONS_MAX MOUSEBUTTONS | ||||
| 
 | ||||
|  | @ -132,7 +132,7 @@ static       Uint16      realheight = BASEVIDHEIGHT; | |||
| static const Uint32      surfaceFlagsW = 0/*|SDL_RESIZABLE*/; | ||||
| static const Uint32      surfaceFlagsF = 0; | ||||
| static       SDL_bool    mousegrabok = SDL_TRUE; | ||||
| #define HalfWarpMouse(x,y) SDL_WarpMouse((Uint16)(x/2),(Uint16)(y/2)) | ||||
| #define HalfWarpMouse(x,y) SDL_WarpMouseInWindow(window, (Uint16)(x/2),(Uint16)(y/2)) | ||||
| static       SDL_bool    videoblitok = SDL_FALSE; | ||||
| static       SDL_bool    exposevideo = SDL_FALSE; | ||||
| 
 | ||||
|  | @ -140,6 +140,7 @@ static       SDL_bool    exposevideo = SDL_FALSE; | |||
| static SDL_Window   *window; | ||||
| static SDL_Renderer *renderer; | ||||
| static SDL_Texture  *texture; | ||||
| static SDL_bool      havefocus = SDL_TRUE; | ||||
| 
 | ||||
| // windowed video modes from which to choose from.
 | ||||
| static INT32 windowedModes[MAXWINMODES][2] = | ||||
|  | @ -173,6 +174,9 @@ static INT32 windowedModes[MAXWINMODES][2] = | |||
| 	{ 320, 200}, // 1.60,1.00
 | ||||
| }; | ||||
| 
 | ||||
| static void Impl_VideoSetupSDLBuffer(void); | ||||
| static void Impl_VideoSetupBuffer(void); | ||||
| 
 | ||||
| static void SDLSetMode(INT32 width, INT32 height, INT32 bpp, Uint32 flags) | ||||
| { | ||||
| #if 0 | ||||
|  | @ -214,7 +218,7 @@ static void SDLSetMode(INT32 width, INT32 height, INT32 bpp, Uint32 flags) | |||
| 	gmask = 0x00FF0000; | ||||
| 	bmask = 0x0000FF00; | ||||
| 	amask = 0x000000FF; | ||||
| #else | ||||
| #else // HEAD HEADS UP THE ASSIGNMENT ORDER IS FLIPPED, I WAS LAZY --Fury
 | ||||
| 	amask = 0xFF000000; | ||||
| 	bmask = 0x00FF0000; | ||||
| 	gmask = 0x0000FF00; | ||||
|  | @ -224,8 +228,6 @@ static void SDLSetMode(INT32 width, INT32 height, INT32 bpp, Uint32 flags) | |||
| 	 | ||||
| 	SDL_SetWindowSize(window, width, height); | ||||
| 	SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); | ||||
| 
 | ||||
| 	SDL2STUB(); | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
|  | @ -447,15 +449,8 @@ static INT32 SDLatekey(SDL_Keycode sym) | |||
| 
 | ||||
| static void SDLdoUngrabMouse(void) | ||||
| { | ||||
| 	// TODO SDL2 overhaul
 | ||||
| 	SDL_SetWindowGrab(window, SDL_FALSE); | ||||
| 	SDL2STUB(); | ||||
| #if 0 | ||||
| 	if (SDL_GRAB_ON == SDL_WM_GrabInput(SDL_GRAB_QUERY)) | ||||
| 	{ | ||||
| 		SDL_WM_GrabInput(SDL_GRAB_OFF); | ||||
| 	} | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void SDLforceUngrabMouse(void) | ||||
|  | @ -464,11 +459,6 @@ void SDLforceUngrabMouse(void) | |||
| 	{ | ||||
| 		SDL_SetWindowGrab(window, SDL_FALSE); | ||||
| 	} | ||||
| 	SDL2STUB(); | ||||
| #if 0 | ||||
| 	if (SDL_WasInit(SDL_INIT_VIDEO)==SDL_INIT_VIDEO) | ||||
| 		SDL_WM_GrabInput(SDL_GRAB_OFF); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| static void VID_Command_NumModes_f (void) | ||||
|  | @ -719,11 +709,41 @@ static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which) | |||
| 
 | ||||
| static void Impl_HandleWindowEvent(SDL_WindowEvent evt) | ||||
| { | ||||
| 	static SDL_bool firsttimeonmouse = SDL_TRUE; | ||||
| 	switch (evt.type) | ||||
| 	{ | ||||
| 		case SDL_WINDOWEVENT_FOCUS_GAINED: | ||||
| 			if (!firsttimeonmouse) | ||||
| 			{ | ||||
| 				if (cv_usemouse.value) I_StartupMouse(); | ||||
| 			} | ||||
| 			else firsttimeonmouse = SDL_FALSE; | ||||
| 			if (gamestate == GS_LEVEL) | ||||
| 			{ | ||||
| 				if (!paused) I_ResumeSong(0); //resume it
 | ||||
| 			} | ||||
| 			break; | ||||
| 		case SDL_WINDOWEVENT_FOCUS_LOST: | ||||
| 			if (!disable_mouse) | ||||
| 			{ | ||||
| 				SDLforceUngrabMouse(); | ||||
| 			} | ||||
| 			if (!netgame && gamestate == GS_LEVEL) | ||||
| 			{ | ||||
| 				paused = true; | ||||
| 			} | ||||
| 			memset(gamekeydown, 0, NUMKEYS); // TODO this is a scary memset
 | ||||
| 			if (gamestate == GS_LEVEL) | ||||
| 			{ | ||||
| 				I_PauseSong(0); | ||||
| 			} | ||||
| 
 | ||||
| 			if (MOUSE_MENU) | ||||
| 			{ | ||||
| 				SDLdoUngrabMouse(); | ||||
| 				return; | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 		case SDL_WINDOWEVENT_MAXIMIZED: | ||||
| 			break; | ||||
|  | @ -751,13 +771,47 @@ static void Impl_HandleKeyboardEvent(SDL_KeyboardEvent evt, Uint32 type) | |||
| 
 | ||||
| static void Impl_HandleMouseMotionEvent(SDL_MouseMotionEvent evt) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| static void Impl_HandleMouseButtonEvent(SDL_MouseButtonEvent evt, Uint32 type) | ||||
| { | ||||
| 	event_t event; | ||||
| 	/// \todo inputEvent.button.which
 | ||||
| 	if (USE_MOUSEINPUT) | ||||
| 	{ | ||||
| 		if (type == SDL_MOUSEBUTTONUP) | ||||
| 			event.type = ev_keyup; | ||||
| 		else if (type == SDL_MOUSEBUTTONDOWN) | ||||
| 			event.type = ev_keydown; | ||||
| 		else return; | ||||
| #if 0 | ||||
| 		if (evt.which == SDL_BUTTON_WHEELUP || evt.which == SDL_BUTTON_WHEELDOWN) | ||||
| 		{ | ||||
| 			if (type == SDL_MOUSEBUTTONUP) | ||||
| 				event.data1 = 0; //Alam: dumb! this could be a real button with some mice
 | ||||
| 			else | ||||
| 				event.data1 = KEY_MOUSEWHEELUP + evt.which - SDL_BUTTON_WHEELUP; | ||||
| 		} | ||||
| #endif | ||||
| 		if (evt.which == SDL_BUTTON_MIDDLE) | ||||
| 			event.data1 = KEY_MOUSE1+2; | ||||
| 		else if (evt.which == SDL_BUTTON_RIGHT) | ||||
| 			event.data1 = KEY_MOUSE1+1; | ||||
| 		else if (evt.which <= MOUSEBUTTONS) | ||||
| 			event.data1 = KEY_MOUSE1 + evt.which - SDL_BUTTON_LEFT; | ||||
| 		if (event.data1) D_PostEvent(&event); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void I_GetEvent(void) | ||||
| { | ||||
| 	SDL_Event evt; | ||||
| 
 | ||||
| 	if (!graphics_started) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	while (SDL_PollEvent(&evt)) | ||||
| 	{ | ||||
| 		if (evt.type == SDL_WINDOWEVENT) | ||||
|  | @ -775,6 +829,11 @@ void I_GetEvent(void) | |||
| 			Impl_HandleMouseMotionEvent(evt.motion); | ||||
| 		} | ||||
| 
 | ||||
| 		if (evt.type == SDL_MOUSEBUTTONUP || evt.type == SDL_MOUSEBUTTONDOWN) | ||||
| 		{ | ||||
| 			Impl_HandleMouseButtonEvent(evt.button, evt.type); | ||||
| 		} | ||||
| 
 | ||||
| 		if (evt.type == SDL_QUIT) | ||||
| 		{ | ||||
| 			I_Quit(); | ||||
|  | @ -997,8 +1056,6 @@ void I_GetEvent(void) | |||
| 
 | ||||
| void I_StartupMouse(void) | ||||
| { | ||||
| 	SDL2STUB(); | ||||
| #if 0 | ||||
| 	static SDL_bool firsttimeonmouse = SDL_TRUE; | ||||
| 
 | ||||
| 	if (disable_mouse) | ||||
|  | @ -1012,7 +1069,6 @@ void I_StartupMouse(void) | |||
| 		return; | ||||
| 	else | ||||
| 		SDLdoUngrabMouse(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
|  | @ -1113,28 +1169,21 @@ void I_FinishUpdate(void) | |||
| 
 | ||||
| 	if (render_soft == rendermode && screens[0]) | ||||
| 	{ | ||||
| 		SDL_Rect *dstrect = NULL; | ||||
| 		SDL_Rect rect = {0, 0, 0, 0}; | ||||
| 		SDL_Rect rect; | ||||
| 		SDL_PixelFormat *vidformat = vidSurface->format; | ||||
| 		int lockedsf = 0, blited = 0; | ||||
| 
 | ||||
| 		rect.w = (Sint16)vid.width; | ||||
| 		rect.h = (Sint16)vid.height; | ||||
| 		rect.x = 0; | ||||
| 		rect.y = 0; | ||||
| 		rect.w = vid.width; | ||||
| 		rect.h = vid.height; | ||||
| 
 | ||||
| 		if (vidSurface->h > vid.height) | ||||
| 			rect.y = (Sint16)((vidSurface->h-vid.height)/2); | ||||
| 
 | ||||
| 		dstrect = ▭ | ||||
| 
 | ||||
| 
 | ||||
| 		if (!bufSurface && !vid.direct) //Double-Check
 | ||||
| 		if (!bufSurface) //Double-Check
 | ||||
| 		{ | ||||
| 			if (vid.bpp == 1) bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,8, | ||||
| 				(int)vid.rowbytes,0x00000000,0x00000000,0x00000000,0x00000000); // 256 mode
 | ||||
| 			else if (vid.bpp == 2) bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,15, | ||||
| 				(int)vid.rowbytes,0x00007C00,0x000003E0,0x0000001F,0x00000000); // 555 mode
 | ||||
| 			if (bufSurface) SDL_SetPaletteColors(bufSurface->format->palette, localPalette, 0, 256); | ||||
| 			else I_OutputMsg("No system memory for SDL buffer surface\n"); | ||||
| 			Impl_VideoSetupSDLBuffer(); | ||||
| 		} | ||||
| #if 0 | ||||
| 		if (SDLmatchVideoformat() && !vid.direct)//Alam: DOS Way
 | ||||
|  | @ -1163,7 +1212,7 @@ void I_FinishUpdate(void) | |||
| #endif | ||||
| 		if (bufSurface) //Alam: New Way to send video data
 | ||||
| 		{ | ||||
| 			blited = SDL_BlitSurface(bufSurface,NULL,vidSurface,dstrect); | ||||
| 			blited = SDL_BlitSurface(bufSurface, NULL, vidSurface, &rect); | ||||
| 			SDL_UpdateTexture(texture, NULL, vidSurface->pixels, realwidth * 4); | ||||
| 		} | ||||
| #if 0 | ||||
|  | @ -1300,7 +1349,8 @@ void I_SetPalette(RGBA_t *palette) | |||
| 		localPalette[i].g = palette[i].s.green; | ||||
| 		localPalette[i].b = palette[i].s.blue; | ||||
| 	} | ||||
| 	if (vidSurface) SDL_SetPaletteColors(vidSurface->format->palette, localPalette, 0, 256); | ||||
| 	//if (vidSurface) SDL_SetPaletteColors(vidSurface->format->palette, localPalette, 0, 256);
 | ||||
| 	// Fury -- SDL2 vidSurface is a 32-bit surface buffer copied to the texture. It's not palletized, like bufSurface.
 | ||||
| 	if (bufSurface) SDL_SetPaletteColors(bufSurface->format->palette, localPalette, 0, 256); | ||||
| } | ||||
| 
 | ||||
|  | @ -1315,6 +1365,7 @@ INT32 VID_NumModes(void) | |||
| 
 | ||||
| const char *VID_GetModeName(INT32 modeNum) | ||||
| { | ||||
| #if 0 | ||||
| 	if (USE_FULLSCREEN && numVidModes != -1) // fullscreen modes
 | ||||
| 	{ | ||||
| 		modeNum += firstEntry; | ||||
|  | @ -1327,18 +1378,29 @@ const char *VID_GetModeName(INT32 modeNum) | |||
| 	} | ||||
| 	else // windowed modes
 | ||||
| 	{ | ||||
| #endif | ||||
| 		if (modeNum > MAXWINMODES) | ||||
| 			return NULL; | ||||
| 
 | ||||
| 		sprintf(&vidModeName[modeNum][0], "%dx%d", | ||||
| 			windowedModes[modeNum][0], | ||||
| 			windowedModes[modeNum][1]); | ||||
| 	} | ||||
| 	//}
 | ||||
| 	return &vidModeName[modeNum][0]; | ||||
| } | ||||
| 
 | ||||
| INT32 VID_GetModeForSize(INT32 w, INT32 h) | ||||
| { | ||||
| 	int i; | ||||
| 	for (i = 0; i < MAXWINMODES; i++) | ||||
| 	{ | ||||
| 		if (windowedModes[i][0] == w && windowedModes[i][1] == h) | ||||
| 		{ | ||||
| 			return i; | ||||
| 		} | ||||
| 	} | ||||
| 	return -1; | ||||
| #if 0 | ||||
| 	INT32 matchMode = -1, i; | ||||
| 	if (USE_FULLSCREEN && numVidModes != -1) | ||||
| 	{ | ||||
|  | @ -1398,10 +1460,13 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h) | |||
| 		} | ||||
| 	} | ||||
| 	return matchMode; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void VID_PrepareModeList(void) | ||||
| { | ||||
| 	// Under SDL2, we just use the windowed modes list, and scale in windowed fullscreen.
 | ||||
| #if 0 | ||||
| 	INT32 i; | ||||
| 
 | ||||
| 	firstEntry = 0; | ||||
|  | @ -1421,6 +1486,7 @@ void VID_PrepareModeList(void) | |||
| 		} | ||||
| 	} | ||||
| 	allow_fullscreen = true; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| static inline void SDLESSet(void) | ||||
|  | @ -1459,8 +1525,27 @@ static void* SDLGetDirect(void) | |||
| 
 | ||||
| INT32 VID_SetMode(INT32 modeNum) | ||||
| { | ||||
| 	SDL2STUB(); | ||||
| 	SDLSetMode(320, 200, 16, 0); | ||||
| 	SDLdoUngrabMouse(); | ||||
| 
 | ||||
| 	vid.width = windowedModes[modeNum][0]; | ||||
| 	vid.height = windowedModes[modeNum][1]; | ||||
| 	vid.bpp = 1; | ||||
| 
 | ||||
| 	vid.modenum = modeNum; //VID_GetModeForSize(vidSurface->w,vidSurface->h);
 | ||||
| 
 | ||||
| 	SDLSetMode(windowedModes[modeNum][0], windowedModes[modeNum][1], 16, 0); | ||||
| 
 | ||||
| 	if (render_soft == rendermode) | ||||
| 	{ | ||||
| 		if (bufSurface) | ||||
| 		{ | ||||
| 			SDL_FreeSurface(bufSurface); | ||||
| 			bufSurface = NULL; | ||||
| 		} | ||||
| 
 | ||||
| 		Impl_VideoSetupBuffer(); | ||||
| 	} | ||||
| 
 | ||||
| 	return SDL_TRUE; | ||||
| #if 0 | ||||
| 	SDLdoUngrabMouse(); | ||||
|  | @ -1600,6 +1685,53 @@ static void Impl_SetWindowIcon() | |||
| 	SDL_SetWindowIcon(window, icoSurface); | ||||
| } | ||||
| 
 | ||||
| static void Impl_VideoSetupSDLBuffer() | ||||
| { | ||||
| 	if (bufSurface != NULL) | ||||
| 	{ | ||||
| 		SDL_FreeSurface(bufSurface); | ||||
| 		bufSurface = NULL; | ||||
| 	} | ||||
| 	// Set up the SDL palletized buffer (copied to vidbuffer before being rendered to texture)
 | ||||
| 	if (vid.bpp == 1) | ||||
| 	{ | ||||
| 		bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,8, | ||||
| 			(int)vid.rowbytes,0x00000000,0x00000000,0x00000000,0x00000000); // 256 mode
 | ||||
| 	} | ||||
| 	else if (vid.bpp == 2) // Fury -- don't think this is used at all anymore
 | ||||
| 	{ | ||||
| 		bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,15, | ||||
| 			(int)vid.rowbytes,0x00007C00,0x000003E0,0x0000001F,0x00000000); // 555 mode
 | ||||
| 	} | ||||
| 	if (bufSurface) | ||||
| 	{ | ||||
| 		SDL_SetPaletteColors(bufSurface->format->palette, localPalette, 0, 256); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		I_Error("%s", M_GetText("No system memory for SDL buffer surface\n")); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void Impl_VideoSetupBuffer() | ||||
| { | ||||
| 	// Set up game's software render buffer
 | ||||
| 	if (rendermode == render_soft) | ||||
| 	{ | ||||
| 		vid.rowbytes = vid.width * vid.bpp; | ||||
| 		vid.direct = NULL; | ||||
| 		vid.buffer = malloc(vid.rowbytes*vid.height*NUMSCREENS); | ||||
| 		if (vid.buffer) | ||||
| 		{ | ||||
| 			memset(vid.buffer,0x00,vid.rowbytes*vid.height*NUMSCREENS); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			I_Error("%s", M_GetText("Not enough memory for video buffer\n")); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void I_StartupGraphics(void) | ||||
| { | ||||
| 	static char SDLNOMOUSE[] = "SDL_NOMOUSE=1"; | ||||
|  | @ -1738,6 +1870,8 @@ void I_StartupGraphics(void) | |||
| #endif | ||||
| 	if (render_soft == rendermode) | ||||
| 	{ | ||||
| 		VID_SetMode(VID_GetModeForSize(BASEVIDWIDTH, BASEVIDHEIGHT)); | ||||
| #if 0 | ||||
| 		vid.width = BASEVIDWIDTH; | ||||
| 		vid.height = BASEVIDHEIGHT; | ||||
| 		SDLSetMode(vid.width, vid.height, BitsPerPixel, surfaceFlagsW); | ||||
|  | @ -1748,11 +1882,8 @@ void I_StartupGraphics(void) | |||
| 			graphics_started = true; | ||||
| 			return; | ||||
| 		} | ||||
| 		vid.rowbytes = vid.width * vid.bpp; | ||||
| 		vid.direct = SDLGetDirect(); | ||||
| 		vid.buffer = malloc(vid.rowbytes*vid.height*NUMSCREENS); | ||||
| 		if (vid.buffer) memset(vid.buffer,0x00,vid.rowbytes*vid.height*NUMSCREENS); | ||||
| 		else CONS_Printf("%s", M_GetText("Not enough memory for video buffer\n")); | ||||
| 		Impl_VideoSetupBuffer(); | ||||
| #endif | ||||
| 	} | ||||
| 	if (M_CheckParm("-nomousegrab")) | ||||
| 		mousegrabok = SDL_FALSE; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Ronald Kinard
						Ronald Kinard