diff --git a/code/q3_ui/ui_video.c b/code/q3_ui/ui_video.c index d37a8149..2d2ddfdd 100644 --- a/code/q3_ui/ui_video.c +++ b/code/q3_ui/ui_video.c @@ -297,7 +297,7 @@ static graphicsoptions_t s_graphicsoptions; static InitialVideoOptions_s s_ivo_templates[] = { { - 6, qtrue, 3, 0, 2, 2, 1, 0, qtrue + 6, qtrue, 3, 0, 2, 2, 1, 0, qtrue // Note: If r_availableModes is found, mode is changed to -2. }, { 4, qtrue, 2, 0, 2, 1, 1, 0, qtrue // JDC: this was tq 3 @@ -372,6 +372,10 @@ static int GraphicsOptions_FindBuiltinResolution( int mode ) if( !resolutionsDetected ) return mode; + // Display resolution + if( mode == 0 ) + return -2; + if( mode < 0 ) return -1; @@ -396,6 +400,10 @@ static int GraphicsOptions_FindDetectedResolution( int mode ) if( !resolutionsDetected ) return mode; + // Display resolution + if( mode == -2 ) + return 0; + if( mode < 0 ) return -1; @@ -425,11 +433,16 @@ static void GraphicsOptions_GetAspectRatios( void ) char str[ sizeof(ratioBuf[0]) ]; // calculate resolution's aspect ratio - x = strchr( resolutions[r], 'x' ) + 1; - Q_strncpyz( str, resolutions[r], x-resolutions[r] ); - w = atoi( str ); - h = atoi( x ); - Com_sprintf( str, sizeof(str), "%.2f:1", (float)w / (float)h ); + x = strchr( resolutions[r], 'x' ); + if (x) { + x++; + Q_strncpyz( str, resolutions[r], x-resolutions[r] ); + w = atoi( str ); + h = atoi( x ); + Com_sprintf( str, sizeof(str), "%.2f:1", (float)w / (float)h ); + } else { + Q_strncpyz(str, "Unknown", sizeof(str)); + } // rename common ratios ("1.33:1" -> "4:3") for( i = 0; knownRatios[i][0]; i++ ) { @@ -489,6 +502,13 @@ static void GraphicsOptions_GetResolutions( void ) { char* s = resbuf; unsigned int i = 0; + + // Add display resolution video mode + detectedResolutions[i++] = "Display Resolution"; + + // Use display resolution in "Very High Quality" template + s_ivo_templates[0].mode = -2; + while( s && i < ARRAY_LEN(detectedResolutions)-1 ) { detectedResolutions[i++] = s; diff --git a/code/renderer/tr_init.c b/code/renderer/tr_init.c index 2b239d87..3f194009 100644 --- a/code/renderer/tr_init.c +++ b/code/renderer/tr_init.c @@ -292,14 +292,17 @@ qboolean R_GetModeInfo( int *width, int *height, float *windowAspect, int mode ) vidmode_t *vm; float pixelAspect; - if ( mode < -1 ) { + if ( mode < -2 ) { return qfalse; } if ( mode >= s_numVidModes ) { return qfalse; } - if ( mode == -1 ) { + if ( mode == -2 ) { + // Must set width and height to display size before calling this function! + pixelAspect = 1.0f; + } else if ( mode == -1 ) { *width = r_customwidth->integer; *height = r_customheight->integer; pixelAspect = r_customPixelAspect->value; diff --git a/code/sdl/sdl_glimp.c b/code/sdl/sdl_glimp.c index cbdbcefa..bd36c83d 100644 --- a/code/sdl/sdl_glimp.c +++ b/code/sdl/sdl_glimp.c @@ -248,6 +248,16 @@ static int GLimp_SetMode(int mode, qboolean fullscreen, qboolean noborder) } } + if( videoInfo->current_h > 0 ) { + glConfig.vidWidth = videoInfo->current_w; + glConfig.vidHeight = videoInfo->current_h; + } else { + glConfig.vidWidth = 480; + glConfig.vidHeight = 640; + ri.Printf( PRINT_ALL, + "Cannot determine display resolution, assuming 640x480\n" ); + } + ri.Printf (PRINT_ALL, "...setting mode %d:", mode ); if ( !R_GetModeInfo( &glConfig.vidWidth, &glConfig.vidHeight, &glConfig.windowAspect, mode ) )