ソースを参照

Fixes a resolution switching issue when the game uses **only** OpenGL as the renderer
Canvas.tscript fixes provided by @OTHG_Mars

Marc 4 年 前
コミット
3d2f3bda64

+ 10 - 1
Engine/source/gfx/gl/sdl/gfxGLDevice.sdl.cpp

@@ -58,7 +58,16 @@ void EnumerateVideoModes(Vector<GFXVideoMode>& outModes)
       GFXVideoMode outMode;
       outMode.resolution.set( mode.w, mode.h );
       outMode.refreshRate = mode.refresh_rate;
-      outMode.bitDepth = SDL_BYTESPERPIXEL( mode.format );
+
+      // BBP = 32 for some reason the engine knows it should be 32, but then we
+      // add some extra code to break what the engine knows.
+      //outMode.bitDepth = SDL_BYTESPERPIXEL( mode.format );     // sets bitdepths to 4
+      //outMode.bitDepth = SDL_BITSPERPIXEL(mode.format);        // sets bitdepth to 24
+      
+      // hardcoded magic numbers ftw
+      // This value is hardcoded in DX, probably to avoid the shenanigans going on here
+      outMode.bitDepth = 32;                                   
+
       outMode.wideScreen = (mode.w / mode.h) > (4 / 3);
       outMode.fullScreen = true;
       

+ 19 - 5
Templates/BaseGame/game/core/gui/scripts/canvas.tscript

@@ -155,6 +155,10 @@ function GuiCanvas::prefsToModeStr(%this)
 
 function GuiCanvas::checkCanvasRes(%this, %mode, %deviceId, %deviceMode, %startup)
 {
+   // Toggle for selecting the borderless window allowed sizes. Set true to allow
+   // boderless windows to be less than the device res.
+   %allowSmallBorderless = true;
+
    %resX = getWord(%mode, $WORD::RES_X);
    %resY = getWord(%mode, $WORD::RES_Y);
 
@@ -175,6 +179,9 @@ function GuiCanvas::checkCanvasRes(%this, %mode, %deviceId, %deviceMode, %startu
       if ((%resX > %deviceRect.x) || (%resY > %deviceRect.y))
          return false;
 
+      if (!%allowSmallBorderless && ((%resX != %deviceRect.x) || (%resY != %deviceRect.y)))
+         return false;
+
       return true;
    }
 
@@ -202,7 +209,8 @@ function GuiCanvas::checkCanvasRes(%this, %mode, %deviceId, %deviceMode, %startu
    return false;
 }
 
-// Find the best video mode setting for the device and display mode
+// Find the best video mode setting for the device and display mode.
+// "Best" is the largest resolution that will fit at highest refresh rate.
 function GuiCanvas::getBestCanvasRes(%this, %deviceId, %deviceMode)
 {
    if (%deviceMode == $Video::ModeWindowed)
@@ -210,19 +218,25 @@ function GuiCanvas::getBestCanvasRes(%this, %deviceId, %deviceMode)
    else
       %deviceRect = getWords(%this.getMonitorRect(%deviceId), 2);
 
+   %bestRes = "";
    %resCount = %this.getModeCount();
    for (%i = %resCount - 1; %i >= 0; %i--)
    {
       %testRes = %this.getMode(%i);
       %resX = getWord(%testRes, $WORD::RES_X);
       %resY = getWord(%testRes, $WORD::RES_Y);
+      %rate = getWord(%testRes, $WORD::REFRESH);
 
-      if ((%resX > %deviceRect.x) || (%resY > %deviceRect.y))
+      if ((%resX > %deviceRect.x) || (%resY > %deviceRect.y) ||
+         (%resX < $Video::minimumXResolution) || (%resY < $Video::minimumYResolution))
          continue;
 
-      return %testRes;
+      if (((%bestRes $= "") || (%resX > getWord(%bestRes, $WORD::RES_X)) ||
+            (%resY > getWord(%bestRes, $WORD::RES_Y))) ||
+         ((%resX == getWord(%bestRes, $WORD::RES_X)) && (%resY == getWord(%bestRes, $WORD::RES_Y)) &&
+            (%rate > getWord(%bestRes, $WORD::REFRESH))))
+         %bestRes = %testRes;
    }
 
-   // Nothing found? return first mode
-   return %this.getMonitorMode(%deviceId, 0);
+   return %bestRes;
 }