mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-14 16:14:38 +00:00
Merge pull request #478 from Bloodknight/SDL_OpenGL_BPP_Fix
Fixes a resolution switching issue when the game uses **only** OpenGL…
This commit is contained in:
commit
2a2987869b
2 changed files with 29 additions and 6 deletions
|
|
@ -58,7 +58,16 @@ void EnumerateVideoModes(Vector<GFXVideoMode>& outModes)
|
||||||
GFXVideoMode outMode;
|
GFXVideoMode outMode;
|
||||||
outMode.resolution.set( mode.w, mode.h );
|
outMode.resolution.set( mode.w, mode.h );
|
||||||
outMode.refreshRate = mode.refresh_rate;
|
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.wideScreen = (mode.w / mode.h) > (4 / 3);
|
||||||
outMode.fullScreen = true;
|
outMode.fullScreen = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,10 @@ function GuiCanvas::prefsToModeStr(%this)
|
||||||
|
|
||||||
function GuiCanvas::checkCanvasRes(%this, %mode, %deviceId, %deviceMode, %startup)
|
function GuiCanvas::checkCanvasRes(%this, %mode, %deviceId, %deviceMode, %startup)
|
||||||
{
|
{
|
||||||
|
// Toggle for selecting the borderless window allowed sizes. Set true to allow
|
||||||
|
// borderless windows to be less than the device res.
|
||||||
|
%allowSmallBorderless = true;
|
||||||
|
|
||||||
%resX = getWord(%mode, $WORD::RES_X);
|
%resX = getWord(%mode, $WORD::RES_X);
|
||||||
%resY = getWord(%mode, $WORD::RES_Y);
|
%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))
|
if ((%resX > %deviceRect.x) || (%resY > %deviceRect.y))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (!%allowSmallBorderless && ((%resX != %deviceRect.x) || (%resY != %deviceRect.y)))
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -202,7 +209,8 @@ function GuiCanvas::checkCanvasRes(%this, %mode, %deviceId, %deviceMode, %startu
|
||||||
return false;
|
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)
|
function GuiCanvas::getBestCanvasRes(%this, %deviceId, %deviceMode)
|
||||||
{
|
{
|
||||||
if (%deviceMode == $Video::ModeWindowed)
|
if (%deviceMode == $Video::ModeWindowed)
|
||||||
|
|
@ -210,19 +218,25 @@ function GuiCanvas::getBestCanvasRes(%this, %deviceId, %deviceMode)
|
||||||
else
|
else
|
||||||
%deviceRect = getWords(%this.getMonitorRect(%deviceId), 2);
|
%deviceRect = getWords(%this.getMonitorRect(%deviceId), 2);
|
||||||
|
|
||||||
|
%bestRes = "";
|
||||||
%resCount = %this.getModeCount();
|
%resCount = %this.getModeCount();
|
||||||
for (%i = %resCount - 1; %i >= 0; %i--)
|
for (%i = %resCount - 1; %i >= 0; %i--)
|
||||||
{
|
{
|
||||||
%testRes = %this.getMode(%i);
|
%testRes = %this.getMode(%i);
|
||||||
%resX = getWord(%testRes, $WORD::RES_X);
|
%resX = getWord(%testRes, $WORD::RES_X);
|
||||||
%resY = getWord(%testRes, $WORD::RES_Y);
|
%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;
|
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 %bestRes;
|
||||||
return %this.getMonitorMode(%deviceId, 0);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue