Make CstDoom3 anchored GUIs work with dhewm3's menu scale fix

In idWindow::Redraw(), I had to make sure the menu scale fix (which,
if enabled for a window, renders that in 4:3 with empty or black bars
on the side if needed for widescreen etc, instead of stretching it)
is disabled if a window uses CST anchors, because the CST anchor code
also adjusts for the display aspect ratio and if we do both, things get
distorted in the other way.

The biggest change is that idDeviceContext::DrawStretchPic(Rotated) now
has code to adjust the coordinates for both CST and the menu scale fix,
so idDeviceContext::AdjustCoords() is mostly obsolete - it's only still
used by idRenderWindow.
Unlike DstDoom3 now that extra adjustCoords argument to those Draw
functions indicates that any coordinate adjustment should be done, so
if it's set by a caller, it's set to true.

I removed idDeviceContext::AdjustCursorCoords() because it was only used
in one place anyway
This commit is contained in:
Daniel Gibson 2025-01-18 02:27:03 +01:00
parent 46cb46630d
commit 565d3e3fc1
3 changed files with 62 additions and 61 deletions

View file

@ -291,17 +291,20 @@ void idDeviceContext::SetMenuScaleFix(bool enable) {
}
}
// FIXME: CSTD3 comments this out
// DG: Note: not sure if AdjustCoords() works entirely as it should, but it seems
// good enough for the idRenderWindow with the mars globe in the main menu
void idDeviceContext::AdjustCoords(float *x, float *y, float *w, float *h) {
// TODO: not sure about cst_*Offset
if (x) {
*x *= xScale;
*x += cst_xOffset; // DG: for CstDoom3 anchored windows
*x *= fixScaleForMenu.x; // DG: for "render menus as 4:3" hack
*x += fixOffsetForMenu.x;
}
if (y) {
*y *= yScale;
*y += cst_yOffset; // DG: for CstDoom3 anchored windows
*y *= fixScaleForMenu.y; // DG: for "render menus as 4:3" hack
*y += fixOffsetForMenu.y;
@ -318,24 +321,10 @@ void idDeviceContext::AdjustCoords(float *x, float *y, float *w, float *h) {
}
}
// DG: same as AdjustCoords, but ignore fixupMenus because for the cursor that must be handled seperately
void idDeviceContext::AdjustCursorCoords(float *x, float *y, float *w, float *h) {
if (x) {
*x *= xScale;
}
if (y) {
*y *= yScale;
}
if (w) {
*w *= xScale;
}
if (h) {
*h *= yScale;
}
}
// fva's cst: added _cstAdjustCoords arg
void idDeviceContext::DrawStretchPic(float x, float y, float w, float h, float s1, float t1, float s2, float t2, const idMaterial *shader, bool _cstAdjustCoords) {
// fva/DG: added adjustCoords argument for CstDoom3 anchored GUIs and our old
// scale-menus-to-4:3-fix, it basically replaces calling AdjustCoords(&x, &y, &w, &h)
// before calling this
void idDeviceContext::DrawStretchPic(float x, float y, float w, float h, float s1, float t1, float s2, float t2, const idMaterial *shader, bool adjustCoords) {
idDrawVert verts[4];
glIndex_t indexes[6];
indexes[0] = 3;
@ -418,15 +407,14 @@ void idDeviceContext::DrawStretchPic(float x, float y, float w, float h, float s
}
//#modified-fva; BEGIN
if (_cstAdjustCoords) {
verts[0].xyz[0] = verts[0].xyz[0] * xScale + cst_xOffset;
verts[0].xyz[1] = verts[0].xyz[1] * yScale + cst_yOffset;
verts[1].xyz[0] = verts[1].xyz[0] * xScale + cst_xOffset;
verts[1].xyz[1] = verts[1].xyz[1] * yScale + cst_yOffset;
verts[2].xyz[0] = verts[2].xyz[0] * xScale + cst_xOffset;
verts[2].xyz[1] = verts[2].xyz[1] * yScale + cst_yOffset;
verts[3].xyz[0] = verts[3].xyz[0] * xScale + cst_xOffset;
verts[3].xyz[1] = verts[3].xyz[1] * yScale + cst_yOffset;
if (adjustCoords) {
for( int i=0; i<4; ++i) {
// Note: if cstAdjustCoords == false; cst_*Offset is 0, so that doesn't require special handling
float x = verts[i].xyz[0] * xScale + cst_xOffset;
float y = verts[i].xyz[1] * yScale + cst_yOffset;
verts[i].xyz[0] = x * fixScaleForMenu.x + fixOffsetForMenu.x;
verts[i].xyz[1] = y * fixScaleForMenu.y + fixOffsetForMenu.y;
}
}
//#modified-fva; END
@ -483,7 +471,7 @@ void idDeviceContext::DrawMaterial(float x, float y, float w, float h, const idM
DrawStretchPic( x, y, w, h, s0, t0, s1, t1, mat);
*/
DrawStretchPic(x, y, w, h, s0, t0, s1, t1, mat, cstAdjustCoords);
DrawStretchPic(x, y, w, h, s0, t0, s1, t1, mat, true);
//#modified-fva; END
}
@ -535,12 +523,14 @@ void idDeviceContext::DrawMaterialRotated(float x, float y, float w, float h, co
DrawStretchPicRotated( x, y, w, h, s0, t0, s1, t1, mat, angle);
*/
DrawStretchPicRotated(x, y, w, h, s0, t0, s1, t1, mat, angle, cstAdjustCoords);
DrawStretchPicRotated(x, y, w, h, s0, t0, s1, t1, mat, angle, true);
//#modified-fva; END
}
// fva's cst: added _cstAdjustCoords arg
void idDeviceContext::DrawStretchPicRotated(float x, float y, float w, float h, float s1, float t1, float s2, float t2, const idMaterial *shader, float angle, bool _cstAdjustCoords) {
// fva/DG: added adjustCoords argument for CstDoom3 anchored GUIs and our old
// scale-menus-to-4:3-fix, it basically replaces calling AdjustCoords(&x, &y, &w, &h)
// before calling this
void idDeviceContext::DrawStretchPicRotated(float x, float y, float w, float h, float s1, float t1, float s2, float t2, const idMaterial *shader, float angle, bool adjustCoords) {
idDrawVert verts[4];
glIndex_t indexes[6];
@ -651,15 +641,14 @@ void idDeviceContext::DrawStretchPicRotated(float x, float y, float w, float h,
}
//#modified-fva; BEGIN
if (_cstAdjustCoords) {
verts[0].xyz[0] = verts[0].xyz[0] * xScale + cst_xOffset;
verts[0].xyz[1] = verts[0].xyz[1] * yScale + cst_yOffset;
verts[1].xyz[0] = verts[1].xyz[0] * xScale + cst_xOffset;
verts[1].xyz[1] = verts[1].xyz[1] * yScale + cst_yOffset;
verts[2].xyz[0] = verts[2].xyz[0] * xScale + cst_xOffset;
verts[2].xyz[1] = verts[2].xyz[1] * yScale + cst_yOffset;
verts[3].xyz[0] = verts[3].xyz[0] * xScale + cst_xOffset;
verts[3].xyz[1] = verts[3].xyz[1] * yScale + cst_yOffset;
if (adjustCoords) {
for( int i=0; i<4; ++i) {
// Note: if cstAdjustCoords == false; cst_*Offset is 0, so that doesn't require special handling
float x = verts[i].xyz[0] * xScale + cst_xOffset;
float y = verts[i].xyz[1] * yScale + cst_yOffset;
verts[i].xyz[0] = x * fixScaleForMenu.x + fixOffsetForMenu.x;
verts[i].xyz[1] = y * fixScaleForMenu.y + fixOffsetForMenu.y;
}
}
//#modified-fva; END
@ -683,7 +672,7 @@ void idDeviceContext::DrawFilledRect( float x, float y, float w, float h, const
AdjustCoords(&x, &y, &w, &h);
DrawStretchPic( x, y, w, h, 0, 0, 0, 0, whiteImage);
*/
DrawStretchPic(x, y, w, h, 0, 0, 0, 0, whiteImage, cstAdjustCoords);
DrawStretchPic(x, y, w, h, 0, 0, 0, 0, whiteImage, true);
//#modified-fva; END
}
@ -708,10 +697,10 @@ void idDeviceContext::DrawRect( float x, float y, float w, float h, float size,
DrawStretchPic( x, y, w, size, 0, 0, 0, 0, whiteImage );
DrawStretchPic( x, y + h - size, w, size, 0, 0, 0, 0, whiteImage );
*/
DrawStretchPic(x, y + size, size, h - 2.0f * size, 0, 0, 0, 0, whiteImage, cstAdjustCoords);
DrawStretchPic(x + w - size, y + size, size, h - 2.0f * size, 0, 0, 0, 0, whiteImage, cstAdjustCoords);
DrawStretchPic(x, y, w, size, 0, 0, 0, 0, whiteImage, cstAdjustCoords);
DrawStretchPic(x, y + h - size, w, size, 0, 0, 0, 0, whiteImage, cstAdjustCoords);
DrawStretchPic(x, y + size, size, h - 2.0f * size, 0, 0, 0, 0, whiteImage, true);
DrawStretchPic(x + w - size, y + size, size, h - 2.0f * size, 0, 0, 0, 0, whiteImage, true);
DrawStretchPic(x, y, w, size, 0, 0, 0, 0, whiteImage, true);
DrawStretchPic(x, y + h - size, w, size, 0, 0, 0, 0, whiteImage, true);
//#modified-fva; END
}
@ -752,17 +741,26 @@ void idDeviceContext::DrawCursor(float *x, float *y, float size) {
renderSystem->SetColor(colorWhite);
// DG: I use this instead of plain AdjustCursorCoords and the following lines
// to scale menus and other fullscreen GUIs to 4:3 aspect ratio
// FIXME: how could this ever work with xScale = 0 or yScale = 0 ?!
//AdjustCursorCoords(x, y, &size, &size);
// DG: originally, this just called AdjustCoords() and then DrawStretchPic().
// It had to be adjusted to scale menus and other fullscreen GUIs to 4:3 aspect ratio
// and for the CstDoom3 anchored GUIs, so all that is now done here
// the following block used to be Adjust(Cursor)Coords()
// (no point in keeping that function when it's only used here)
*x *= xScale;
*y *= yScale;
size *= xScale;
// TODO: not sure if scaling it by both is the right thing to do..
// but OTOH, probably one of them is always 1, at least when not using an anchor
// (and why would a cursor use an anchor)
size *= yScale;
// the *actual* sizes used (but not set to *x and *y) need to apply the menu fixes
float sizeW = size * fixScaleForMenu.x;
float sizeH = size * fixScaleForMenu.y;
float fixedX = *x * fixScaleForMenu.x + fixOffsetForMenu.x;
float fixedY = *y * fixScaleForMenu.y + fixOffsetForMenu.y;
// FIXME: CSTD3 just comments the AdjustCoords() call out and uses *x and *y instead of fixedX/Y
DrawStretchPic(fixedX, fixedY, sizeW, sizeH, 0, 0, 1, 1, cursorImages[cursor]);
}
/*
@ -784,7 +782,7 @@ void idDeviceContext::PaintChar(float x,float y,float width,float height,float s
AdjustCoords(&x, &y, &w, &h);
DrawStretchPic(x, y, w, h, s, t, s2, t2, hShader);
*/
DrawStretchPic(x, y, w, h, s, t, s2, t2, hShader, cstAdjustCoords);
DrawStretchPic(x, y, w, h, s, t, s2, t2, hShader, true);
//#modified-fva; END
}

View file

@ -58,12 +58,12 @@ public:
void DrawFilledRect(float x, float y, float width, float height, const idVec4 &color);
int DrawText(const char *text, float textScale, int textAlign, idVec4 color, idRectangle rectDraw, bool wrap, int cursor = -1, bool calcOnly = false, idList<int> *breaks = NULL, int limit = 0 );
void DrawMaterialRect( float x, float y, float w, float h, float size, const idMaterial *mat, const idVec4 &color);
// fva's cst: added _cstAdjustCoords arg
void DrawStretchPic(float x, float y, float w, float h, float s0, float t0, float s1, float t1, const idMaterial *mat, bool _cstAdjustCoords = false);
// fva/DG: added adjustCoords argument for CstDoom3 anchored GUIs and our old scale-menus-to-4:3-fix
void DrawStretchPic(float x, float y, float w, float h, float s0, float t0, float s1, float t1, const idMaterial *mat, bool adjustCoords = false);
void DrawMaterialRotated(float x, float y, float w, float h, const idMaterial *mat, const idVec4 &color, float scalex = 1.0, float scaley = 1.0, float angle = 0.0f);
// fva's cst: added _cstAdjustCoords arg
void DrawStretchPicRotated(float x, float y, float w, float h, float s0, float t0, float s1, float t1, const idMaterial *mat, float angle = 0.0f, bool _cstAdjustCoords = false);
// fva/DG: added adjustCoords argument for CstDoom3 anchored GUIs and our old scale-menus-to-4:3-fix
void DrawStretchPicRotated(float x, float y, float w, float h, float s0, float t0, float s1, float t1, const idMaterial *mat, float angle = 0.0f, bool adjustCoords = false);
int CharWidth( const char c, float scale );
int TextWidth(const char *text, float scale, int limit);
@ -86,10 +86,9 @@ public:
void DrawCursor(float *x, float *y, float size);
void SetCursor(int n);
// FIXME: CSTD3 comments AdjustCoords out, what does that mean for AdjustCursorCoords?
// DG: Note: not sure if AdjustCoords() works entirely as it should, but it seems
// good enough for the idRenderWindow with the mars globe in the main menu
void AdjustCoords(float *x, float *y, float *w, float *h);
void AdjustCursorCoords(float *x, float *y, float *w, float *h); // DG: added for "render menus as 4:3" hack
bool ClippedCoords(float *x, float *y, float *w, float *h);
bool ClippedCoords(float *x, float *y, float *w, float *h, float *s1, float *t1, float *s2, float *t2);

View file

@ -1282,6 +1282,10 @@ void idWindow::Redraw(float x, float y) {
if (!cst_hudAdjustAspect.GetBool() || cstAnchor == idDeviceContext::CST_ANCHOR_NONE) {
dc->SetSize(forceAspectWidth, forceAspectHeight);
} else {
// DG: if this Window uses anchors, it already is aspect-ratio-aware
// so a potentially active menuscalefix must be disabled
// (else it's "fixed" twice => wrong ratio in other direction)
dc->SetMenuScaleFix(false);
dc->CstSetSize(cstAnchor, cstAnchorTo, cstAnchorFactor);
}
//#modified-fva; END