Introducing... M_GetMapThumbnail and arbitrarily scaled thumbnails

* only supports two sizes
This commit is contained in:
GenericHeroGuy 2025-02-12 01:04:52 +01:00
parent ec5f317f28
commit 6db125c0f3
5 changed files with 57 additions and 81 deletions

View file

@ -99,6 +99,8 @@ static char hu_tick;
patch_t *missingpat;
patch_t *blanklvl;
patch_t *randomlvl;
patch_t *nolvl;
// song credits
static patch_t *songcreditbg;
@ -188,6 +190,8 @@ void HU_LoadGraphics(void)
Font_Load();
HU_UpdatePatch(&blanklvl, "BLANKLVL");
HU_UpdatePatch(&randomlvl, "RANDOMLV");
HU_UpdatePatch(&nolvl, "M_NOLVL");
HU_UpdatePatch(&songcreditbg, "K_SONGCR");

View file

@ -1785,6 +1785,23 @@ INT32 HU_GetHighlightColor(void)
return highlightflags;
}
fixed_t M_GetMapThumbnail(INT16 mapnum, patch_t **out)
{
patch_t *patch = NULL;
if (mapnum == -1)
patch = randomlvl;
else if (mapnum >= 0 && mapnum < nummapheaders && mapheaderinfo[mapnum])
patch = mapheaderinfo[mapnum]->thumbnailPic;
if (!patch)
patch = blanklvl;
*out = patch;
// check width instead of height because haha big winton
return patch->width >= 320 ? FRACUNIT/4 : FRACUNIT/2;
}
// Sky Room
menu_t SR_PandoraDef =
{
@ -5619,19 +5636,18 @@ static void DrawReplayHutReplayInfo(void)
// Draw level stuff
x = 15; y = 15;
// A 160x100 image of the level
//CONS_Printf("%d %s\n", demolist[dir_on[menudepthleft]].map, G_BuildMapName(demolist[dir_on[menudepthleft]].map));
patch = mapheaderinfo[demolist[dir_on[menudepthleft]].map-1]
? mapheaderinfo[demolist[dir_on[menudepthleft]].map-1]->thumbnailPic
: W_CachePatchName("M_NOLVL", PU_CACHE);
fixed_t scale = M_GetMapThumbnail(demolist[dir_on[menudepthleft]].map, &patch);
if (patch == blanklvl)
patch = nolvl;
if (!(demolist[dir_on[menudepthleft]].kartspeed & DF_ENCORE))
V_DrawSmallScaledPatch(x, y, V_SNAPTOTOP, patch);
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, V_SNAPTOTOP, patch, NULL);
else
{
w = SHORT(patch->width);
h = SHORT(patch->height);
V_DrawSmallScaledPatch(x+(w>>1), y, V_SNAPTOTOP|V_FLIP, patch);
w = FixedMul(SHORT(patch->width), scale);
h = FixedMul(SHORT(patch->height), scale);
V_DrawFixedPatch((x+(w>>1))<<FRACBITS, y<<FRACBITS, scale, V_SNAPTOTOP|V_FLIP, patch, NULL);
{
static angle_t rubyfloattime = 0;
@ -8983,19 +8999,10 @@ static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade)
{
patch_t *PictureOfLevel;
INT32 x, y, w, i, oldval, trans, dupadjust = ((vid.width/vid.dupx) - BASEVIDWIDTH)>>1;
fixed_t scale = M_GetMapThumbnail(cv_nextmap.value-1, &PictureOfLevel);
// A 160x100 image of the level
if (cv_nextmap.value)
{
PictureOfLevel = mapheaderinfo[cv_nextmap.value-1]->thumbnailPic;
if (!PictureOfLevel)
PictureOfLevel = blanklvl;
}
else
PictureOfLevel = W_CachePatchName("RANDOMLV", PU_CACHE);
w = SHORT(PictureOfLevel->width)/2;
i = SHORT(PictureOfLevel->height)/2;
w = FixedMul(SHORT(PictureOfLevel->width), scale);
i = FixedMul(SHORT(PictureOfLevel->height), scale);
x = BASEVIDWIDTH/2 - w/2;
y = currentMenu->y + 130 + 8 - i;
@ -9007,14 +9014,14 @@ static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade)
V_DrawFill(x-1, y-1, w+2, i+2, trans); // variable reuse...
if ((cv_kartencore.value != 1) || gamestate == GS_TIMEATTACK || cv_newgametype.value != GT_RACE)
V_DrawSmallScaledPatch(x, y, 0, PictureOfLevel);
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, PictureOfLevel, NULL);
else
{
/*UINT8 *mappingforencore = NULL;
if ((lumpnum = W_CheckNumForName(va("%sE", mapname))) != LUMPERROR)
mappingforencore = W_CachePatchNum(lumpnum, PU_CACHE);*/
V_DrawFixedPatch((x+w)<<FRACBITS, (y)<<FRACBITS, FRACUNIT/2, V_FLIP, PictureOfLevel, 0);
V_DrawFixedPatch((x+w)<<FRACBITS, y<<FRACBITS, scale, V_FLIP, PictureOfLevel, NULL);
{
static angle_t rubyfloattime = 0;
@ -9048,19 +9055,11 @@ static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade)
} while (!M_CanShowLevelInList(i, cv_newgametype.value));
// A 160x100 image of the level as entry MAPxxP
if (i >= 0)
{
PictureOfLevel = mapheaderinfo[i]->thumbnailPic;
if (!PictureOfLevel)
PictureOfLevel = blanklvl;
}
else
PictureOfLevel = W_CachePatchName("RANDOMLV", PU_CACHE);
scale = M_GetMapThumbnail(i, &PictureOfLevel)/2;
x -= horizspac + w/2;
V_DrawTinyScaledPatch(x, y, trans, PictureOfLevel);
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, trans, PictureOfLevel, NULL);
} while (x > horizspac-dupadjust);
x = (BASEVIDWIDTH + w)/2 + horizspac;
@ -9084,17 +9083,9 @@ static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade)
} while (!M_CanShowLevelInList(i, cv_newgametype.value));
// A 160x100 image of the level as entry MAPxxP
if (i >= 0)
{
PictureOfLevel = mapheaderinfo[i]->thumbnailPic;
if (!PictureOfLevel)
PictureOfLevel = blanklvl;
}
else
PictureOfLevel = W_CachePatchName("RANDOMLV", PU_CACHE);
scale = M_GetMapThumbnail(i, &PictureOfLevel)/2;
V_DrawTinyScaledPatch(x, y, trans, PictureOfLevel);
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, trans, PictureOfLevel, NULL);
x += horizspac + w/2;
}

View file

@ -479,6 +479,8 @@ void M_RefreshPauseMenu(void);
INT32 HU_GetHighlightColor(void);
fixed_t M_GetMapThumbnail(INT16 mapnum, patch_t **out);
// Moviemode menu updating
void Moviemode_option_Onchange(void);

View file

@ -906,6 +906,8 @@ struct patch_t
extern patch_t *missingpat;
extern patch_t *blanklvl;
extern patch_t *randomlvl;
extern patch_t *nolvl;
#if defined(_MSC_VER)
#pragma pack(1)

View file

@ -174,7 +174,6 @@ static patch_t *cursor1 = NULL;
static patch_t *cursor2 = NULL;
static patch_t *cursor3 = NULL;
static patch_t *cursor4 = NULL;
static patch_t *randomlvl = NULL;
static patch_t *rubyicon = NULL;
static void Y_UnloadVoteData(void);
@ -1188,6 +1187,9 @@ void Y_VoteDrawer(void)
INT32 i, x, y = 0, height = 0;
UINT8 selected[4];
fixed_t rubyheight = 0;
fixed_t scale;
patch_t *pic;
INT16 mapnum;
if (rendermode == render_none)
return;
@ -1256,29 +1258,19 @@ void Y_VoteDrawer(void)
for (i = 0; i < 4; i++)
{
const char *str;
patch_t *pic;
UINT8 j, color;
if (i == 3)
{
str = "RANDOM";
pic = randomlvl;
mapnum = -1;
}
else
{
str = levelinfo[i].str;
pic = NULL;
if (mapheaderinfo[votelevels[i][0]])
{
pic = mapheaderinfo[votelevels[i][0]]->thumbnailPic;
}
if (!pic)
{
pic = blanklvl;
}
mapnum = votelevels[i][0];
}
scale = M_GetMapThumbnail(mapnum, &pic);
if (selected[i])
{
@ -1342,10 +1334,10 @@ void Y_VoteDrawer(void)
}
if (!levelinfo[i].encore)
V_DrawSmallScaledPatch(BASEVIDWIDTH-100, y, V_SNAPTORIGHT, pic);
V_DrawFixedPatch((BASEVIDWIDTH-100)<<FRACBITS, y<<FRACBITS, scale, V_SNAPTORIGHT, pic, NULL);
else
{
V_DrawFixedPatch((BASEVIDWIDTH-20)<<FRACBITS, (y)<<FRACBITS, FRACUNIT/2, V_FLIP|V_SNAPTORIGHT, pic, 0);
V_DrawFixedPatch((BASEVIDWIDTH-20)<<FRACBITS, y<<FRACBITS, scale, V_FLIP|V_SNAPTORIGHT, pic, NULL);
V_DrawFixedPatch((BASEVIDWIDTH-60)<<FRACBITS, ((y+25)<<FRACBITS) - (rubyheight<<1), FRACUNIT, V_SNAPTORIGHT, rubyicon, NULL);
}
@ -1365,11 +1357,12 @@ void Y_VoteDrawer(void)
}
else
{
scale /= 2;
if (!levelinfo[i].encore)
V_DrawTinyScaledPatch(BASEVIDWIDTH-60, y, V_SNAPTORIGHT, pic);
V_DrawFixedPatch((BASEVIDWIDTH-60)<<FRACBITS, y<<FRACBITS, scale, V_SNAPTORIGHT, pic, NULL);
else
{
V_DrawFixedPatch((BASEVIDWIDTH-20)<<FRACBITS, y<<FRACBITS, FRACUNIT/4, V_FLIP|V_SNAPTORIGHT, pic, 0);
V_DrawFixedPatch((BASEVIDWIDTH-20)<<FRACBITS, y<<FRACBITS, scale, V_FLIP|V_SNAPTORIGHT, pic, NULL);
V_DrawFixedPatch((BASEVIDWIDTH-40)<<FRACBITS, (y<<FRACBITS) + (25<<(FRACBITS-1)) - rubyheight, FRACUNIT/2, V_SNAPTORIGHT, rubyicon, NULL);
}
@ -1394,26 +1387,12 @@ void Y_VoteDrawer(void)
if ((playeringame[i] && !players[i].spectator) && votes[i] != -1)
{
patch_t *pic;
if (votes[i] >= 3 && (i != pickedvote || voteendtic == -1))
{
pic = randomlvl;
}
mapnum = -1; // randomlvl
else
{
pic = NULL;
mapnum = votelevels[votes[i]][0];
if (mapheaderinfo[votelevels[votes[i]][0]])
{
pic = mapheaderinfo[votelevels[votes[i]][0]]->thumbnailPic;
}
if (!pic)
{
pic = blanklvl;
}
}
scale = M_GetMapThumbnail(mapnum, &pic)/2;
if (!timer && i == voteclient.ranim)
{
@ -1425,10 +1404,10 @@ void Y_VoteDrawer(void)
}
if (!levelinfo[votes[i]].encore)
V_DrawTinyScaledPatch(x, y, V_SNAPTOLEFT, pic);
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, V_SNAPTOLEFT, pic, NULL);
else
{
V_DrawFixedPatch((x+40)<<FRACBITS, (y)<<FRACBITS, FRACUNIT/4, V_SNAPTOLEFT|V_FLIP, pic, 0);
V_DrawFixedPatch((x+FixedMul(pic->width, scale))<<FRACBITS, y<<FRACBITS, scale, V_SNAPTOLEFT|V_FLIP, pic, NULL);
V_DrawFixedPatch((x+20)<<FRACBITS, (y<<FRACBITS) + (25<<(FRACBITS-1)) - rubyheight, FRACUNIT/2, V_SNAPTOLEFT, rubyicon, NULL);
}
@ -1760,7 +1739,6 @@ void Y_StartVote(void)
cursor2 = W_CachePatchName("P2CURSOR", PU_STATIC);
cursor3 = W_CachePatchName("P3CURSOR", PU_STATIC);
cursor4 = W_CachePatchName("P4CURSOR", PU_STATIC);
randomlvl = W_CachePatchName("RANDOMLV", PU_STATIC);
rubyicon = W_CachePatchName("RUBYICON", PU_STATIC);
timer = cv_votetime.value*TICRATE;
@ -1860,7 +1838,6 @@ static void Y_UnloadVoteData(void)
UNLOAD(cursor2);
UNLOAD(cursor3);
UNLOAD(cursor4);
UNLOAD(randomlvl);
UNLOAD(rubyicon);
}