# Conflicts: # src/r_things.cpp # src/v_draw.cpp
This commit is contained in:
commit
59f32d497d
45 changed files with 703 additions and 293 deletions
233
src/v_draw.cpp
233
src/v_draw.cpp
|
|
@ -91,6 +91,17 @@ CVAR (Bool, hud_scale, true, CVAR_ARCHIVE);
|
|||
static int LastPal = -1;
|
||||
static uint32 LastRGB;
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Screen, GetWidth)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
ACTION_RETURN_INT(screen->GetWidth());
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Screen, GetHeight)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
ACTION_RETURN_INT(screen->GetHeight());
|
||||
}
|
||||
|
||||
static int PalFromRGB(uint32 rgb)
|
||||
{
|
||||
|
|
@ -115,6 +126,7 @@ static int PalFromRGB(uint32 rgb)
|
|||
return LastPal;
|
||||
}
|
||||
|
||||
|
||||
void DCanvas::DrawTexture (FTexture *img, double x, double y, int tags_first, ...)
|
||||
{
|
||||
va_list tags;
|
||||
|
|
@ -130,6 +142,31 @@ void DCanvas::DrawTexture (FTexture *img, double x, double y, int tags_first, ..
|
|||
DrawTextureParms(img, parms);
|
||||
}
|
||||
|
||||
static int ListGetInt(VMVa_List &tags);
|
||||
|
||||
void DCanvas::DrawTexture(FTexture *img, double x, double y, VMVa_List &args)
|
||||
{
|
||||
DrawParms parms;
|
||||
uint32_t tag = ListGetInt(args);
|
||||
bool res = ParseDrawTextureTags(img, x, y, tag, args, &parms, false);
|
||||
if (!res) return;
|
||||
DrawTextureParms(img, parms);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Screen, DrawTexture)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_INT(texid);
|
||||
PARAM_BOOL(animate);
|
||||
PARAM_FLOAT(x);
|
||||
PARAM_FLOAT(y);
|
||||
|
||||
FTexture *tex = animate ? TexMan(FSetTextureID(texid)) : TexMan[FSetTextureID(texid)];
|
||||
VMVa_List args = { param + 4, 0, numparam - 4 };
|
||||
screen->DrawTexture(tex, x, y, args);
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Screen, DrawHUDTexture)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
|
|
@ -167,7 +204,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
|
|||
{
|
||||
parms.colorOverlay = PalEntry(parms.colorOverlay).InverseColor();
|
||||
}
|
||||
// Note that this overrides DTA_Translation in software, but not in hardware.
|
||||
// Note that this overrides the translation in software, but not in hardware.
|
||||
if (!viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
FDynamicColormap *colormap = GetSpecialLights(MAKERGB(255, 255, 255),
|
||||
|
|
@ -390,7 +427,70 @@ bool DCanvas::SetTextureParms(DrawParms *parms, FTexture *img, double xx, double
|
|||
return false;
|
||||
}
|
||||
|
||||
bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag, va_list tags, DrawParms *parms, bool fortext) const
|
||||
static void ListEnd(va_list &tags)
|
||||
{
|
||||
va_end(tags);
|
||||
}
|
||||
|
||||
static int ListGetInt(va_list &tags)
|
||||
{
|
||||
return va_arg(tags, int);
|
||||
}
|
||||
|
||||
static inline double ListGetDouble(va_list &tags)
|
||||
{
|
||||
return va_arg(tags, double);
|
||||
}
|
||||
|
||||
// These two options are only being used by the D3D version of the HUD weapon drawer, they serve no purpose anywhere else.
|
||||
static inline FSpecialColormap * ListGetSpecialColormap(va_list &tags)
|
||||
{
|
||||
return va_arg(tags, FSpecialColormap *);
|
||||
}
|
||||
|
||||
static inline FColormapStyle * ListGetColormapStyle(va_list &tags)
|
||||
{
|
||||
return va_arg(tags, FColormapStyle *);
|
||||
}
|
||||
|
||||
static void ListEnd(VMVa_List &tags)
|
||||
{
|
||||
}
|
||||
|
||||
static int ListGetInt(VMVa_List &tags)
|
||||
{
|
||||
if (tags.curindex < tags.numargs && tags.args[tags.curindex].Type == REGT_INT)
|
||||
{
|
||||
return tags.args[tags.curindex++].i;
|
||||
}
|
||||
ThrowAbortException(X_OTHER, "Invalid parameter in draw function, int expected");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline double ListGetDouble(VMVa_List &tags)
|
||||
{
|
||||
if (tags.curindex < tags.numargs && tags.args[tags.curindex].Type == REGT_FLOAT)
|
||||
{
|
||||
return tags.args[tags.curindex++].f;
|
||||
}
|
||||
ThrowAbortException(X_OTHER, "Invalid parameter in draw function, float expected");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline FSpecialColormap * ListGetSpecialColormap(VMVa_List &tags)
|
||||
{
|
||||
ThrowAbortException(X_OTHER, "Invalid tag in draw function");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static inline FColormapStyle * ListGetColormapStyle(VMVa_List &tags)
|
||||
{
|
||||
ThrowAbortException(X_OTHER, "Invalid tag in draw function");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
bool DCanvas::ParseDrawTextureTags(FTexture *img, double x, double y, DWORD tag, T& tags, DrawParms *parms, bool fortext) const
|
||||
{
|
||||
INTBOOL boolval;
|
||||
int intval;
|
||||
|
|
@ -401,7 +501,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
{
|
||||
if (img == NULL || img->UseType == FTexture::TEX_Null)
|
||||
{
|
||||
va_end(tags);
|
||||
ListEnd(tags);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -409,7 +509,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
// Do some sanity checks on the coordinates.
|
||||
if (x < -16383 || x > 16383 || y < -16383 || y > 16383)
|
||||
{
|
||||
va_end(tags);
|
||||
ListEnd(tags);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -451,44 +551,42 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
// doubles when passed as function arguments.)
|
||||
while (tag != TAG_DONE)
|
||||
{
|
||||
DWORD data;
|
||||
|
||||
switch (tag)
|
||||
{
|
||||
default:
|
||||
data = va_arg(tags, DWORD);
|
||||
ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_DestWidth:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->destwidth = va_arg(tags, int);
|
||||
parms->destwidth = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_DestWidthF:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->destwidth = va_arg(tags, double);
|
||||
parms->destwidth = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
case DTA_DestHeight:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->destheight = va_arg(tags, int);
|
||||
parms->destheight = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_DestHeightF:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->destheight = va_arg(tags, double);
|
||||
parms->destheight = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
case DTA_Clean:
|
||||
boolval = va_arg(tags, INTBOOL);
|
||||
boolval = ListGetInt(tags);
|
||||
if (boolval)
|
||||
{
|
||||
parms->scalex = 1;
|
||||
|
|
@ -498,7 +596,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_CleanNoMove:
|
||||
boolval = va_arg(tags, INTBOOL);
|
||||
boolval = ListGetInt(tags);
|
||||
if (boolval)
|
||||
{
|
||||
parms->scalex = CleanXfac;
|
||||
|
|
@ -508,7 +606,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_CleanNoMove_1:
|
||||
boolval = va_arg(tags, INTBOOL);
|
||||
boolval = ListGetInt(tags);
|
||||
if (boolval)
|
||||
{
|
||||
parms->scalex = CleanXfac_1;
|
||||
|
|
@ -518,7 +616,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_320x200:
|
||||
boolval = va_arg(tags, INTBOOL);
|
||||
boolval = ListGetInt(tags);
|
||||
if (boolval)
|
||||
{
|
||||
parms->cleanmode = DTA_Base;
|
||||
|
|
@ -530,7 +628,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_Bottom320x200:
|
||||
boolval = va_arg(tags, INTBOOL);
|
||||
boolval = ListGetInt(tags);
|
||||
if (boolval)
|
||||
{
|
||||
parms->cleanmode = DTA_Base;
|
||||
|
|
@ -543,32 +641,32 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_HUDRules:
|
||||
intval = va_arg(tags, int);
|
||||
intval = ListGetInt(tags);
|
||||
parms->cleanmode = intval == HUD_HorizCenter ? DTA_HUDRulesC : DTA_HUDRules;
|
||||
break;
|
||||
|
||||
case DTA_VirtualWidth:
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->virtWidth = va_arg(tags, int);
|
||||
parms->virtWidth = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_VirtualWidthF:
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->virtWidth = va_arg(tags, double);
|
||||
parms->virtWidth = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
|
||||
case DTA_VirtualHeight:
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->virtHeight = va_arg(tags, int);
|
||||
parms->virtHeight = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_VirtualHeightF:
|
||||
parms->cleanmode = DTA_Base;
|
||||
parms->virtHeight = va_arg(tags, double);
|
||||
parms->virtHeight = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
case DTA_Fullscreen:
|
||||
boolval = va_arg(tags, INTBOOL);
|
||||
boolval = ListGetInt(tags);
|
||||
if (boolval)
|
||||
{
|
||||
assert(fortext == false);
|
||||
|
|
@ -580,66 +678,58 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_Alpha:
|
||||
parms->Alpha = FIXED2FLOAT(MIN<fixed_t>(OPAQUE, va_arg (tags, fixed_t)));
|
||||
break;
|
||||
|
||||
case DTA_AlphaF:
|
||||
parms->Alpha = (float)(MIN<double>(1., va_arg(tags, double)));
|
||||
parms->Alpha = (float)(MIN<double>(1., ListGetDouble(tags)));
|
||||
break;
|
||||
|
||||
case DTA_AlphaChannel:
|
||||
parms->alphaChannel = va_arg(tags, INTBOOL);
|
||||
parms->alphaChannel = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_FillColor:
|
||||
parms->fillcolor = va_arg(tags, uint32);
|
||||
parms->fillcolor = ListGetInt(tags);
|
||||
fillcolorset = true;
|
||||
break;
|
||||
|
||||
case DTA_Translation:
|
||||
parms->remap = va_arg(tags, FRemapTable *);
|
||||
if (parms->remap != NULL && parms->remap->Inactive)
|
||||
{ // If it's inactive, pretend we were passed NULL instead.
|
||||
parms->remap = NULL;
|
||||
}
|
||||
case DTA_TranslationIndex:
|
||||
parms->remap = TranslationToTable(ListGetInt(tags));
|
||||
break;
|
||||
|
||||
case DTA_ColorOverlay:
|
||||
parms->colorOverlay = va_arg(tags, DWORD);
|
||||
parms->colorOverlay = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_FlipX:
|
||||
parms->flipX = va_arg(tags, INTBOOL);
|
||||
parms->flipX = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_TopOffset:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->top = va_arg(tags, int);
|
||||
parms->top = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_TopOffsetF:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->top = va_arg(tags, double);
|
||||
parms->top = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
case DTA_LeftOffset:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->left = va_arg(tags, int);
|
||||
parms->left = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_LeftOffsetF:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->left = va_arg(tags, double);
|
||||
parms->left = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
case DTA_CenterOffset:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
if (va_arg(tags, int))
|
||||
if (ListGetInt(tags))
|
||||
{
|
||||
parms->left = img->GetScaledWidthDouble() * 0.5;
|
||||
parms->top = img->GetScaledHeightDouble() * 0.5;
|
||||
|
|
@ -649,7 +739,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
case DTA_CenterBottomOffset:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
if (va_arg(tags, int))
|
||||
if (ListGetInt(tags))
|
||||
{
|
||||
parms->left = img->GetScaledWidthDouble() * 0.5;
|
||||
parms->top = img->GetScaledHeightDouble();
|
||||
|
|
@ -659,29 +749,29 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
case DTA_WindowLeft:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->windowleft = va_arg(tags, int);
|
||||
parms->windowleft = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_WindowLeftF:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->windowleft = va_arg(tags, double);
|
||||
parms->windowleft = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
case DTA_WindowRight:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->windowright = va_arg(tags, int);
|
||||
parms->windowright = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_WindowRightF:
|
||||
assert(fortext == false);
|
||||
if (fortext) return false;
|
||||
parms->windowright = va_arg(tags, double);
|
||||
parms->windowright = ListGetDouble(tags);
|
||||
break;
|
||||
|
||||
case DTA_ClipTop:
|
||||
parms->uclip = va_arg(tags, int);
|
||||
parms->uclip = ListGetInt(tags);
|
||||
if (parms->uclip < 0)
|
||||
{
|
||||
parms->uclip = 0;
|
||||
|
|
@ -689,7 +779,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_ClipBottom:
|
||||
parms->dclip = va_arg(tags, int);
|
||||
parms->dclip = ListGetInt(tags);
|
||||
if (parms->dclip > this->GetHeight())
|
||||
{
|
||||
parms->dclip = this->GetHeight();
|
||||
|
|
@ -697,7 +787,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_ClipLeft:
|
||||
parms->lclip = va_arg(tags, int);
|
||||
parms->lclip = ListGetInt(tags);
|
||||
if (parms->lclip < 0)
|
||||
{
|
||||
parms->lclip = 0;
|
||||
|
|
@ -705,7 +795,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_ClipRight:
|
||||
parms->rclip = va_arg(tags, int);
|
||||
parms->rclip = ListGetInt(tags);
|
||||
if (parms->rclip > this->GetWidth())
|
||||
{
|
||||
parms->rclip = this->GetWidth();
|
||||
|
|
@ -713,18 +803,18 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_ShadowAlpha:
|
||||
parms->shadowAlpha = MIN<fixed_t>(OPAQUE, va_arg (tags, fixed_t));
|
||||
parms->shadowAlpha = (float)MIN(1., ListGetDouble(tags));
|
||||
break;
|
||||
|
||||
case DTA_ShadowColor:
|
||||
parms->shadowColor = va_arg(tags, int);
|
||||
parms->shadowColor = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_Shadow:
|
||||
boolval = va_arg(tags, INTBOOL);
|
||||
boolval = ListGetInt(tags);
|
||||
if (boolval)
|
||||
{
|
||||
parms->shadowAlpha = FRACUNIT/2;
|
||||
parms->shadowAlpha = 0.5;
|
||||
parms->shadowColor = 0;
|
||||
}
|
||||
else
|
||||
|
|
@ -734,47 +824,52 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
break;
|
||||
|
||||
case DTA_Masked:
|
||||
parms->masked = va_arg(tags, INTBOOL);
|
||||
parms->masked = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_BilinearFilter:
|
||||
parms->bilinear = va_arg(tags, INTBOOL);
|
||||
parms->bilinear = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_KeepRatio:
|
||||
// I think this is a terribly misleading name, since it actually turns
|
||||
// *off* aspect ratio correction.
|
||||
parms->keepratio = va_arg(tags, INTBOOL);
|
||||
parms->keepratio = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_RenderStyle:
|
||||
parms->style.AsDWORD = va_arg(tags, DWORD);
|
||||
parms->style.AsDWORD = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_SpecialColormap:
|
||||
parms->specialcolormap = va_arg(tags, FSpecialColormap *);
|
||||
parms->specialcolormap = ListGetSpecialColormap(tags);
|
||||
break;
|
||||
|
||||
case DTA_ColormapStyle:
|
||||
parms->colormapstyle = va_arg(tags, FColormapStyle *);
|
||||
parms->colormapstyle = ListGetColormapStyle(tags);
|
||||
break;
|
||||
|
||||
case DTA_TextLen:
|
||||
parms->maxstrlen = va_arg(tags, int);
|
||||
parms->maxstrlen = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_CellX:
|
||||
parms->cellx = va_arg(tags, int);
|
||||
parms->cellx = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
case DTA_CellY:
|
||||
parms->celly = va_arg(tags, int);
|
||||
parms->celly = ListGetInt(tags);
|
||||
break;
|
||||
|
||||
}
|
||||
tag = va_arg(tags, DWORD);
|
||||
tag = ListGetInt(tags);
|
||||
}
|
||||
ListEnd(tags);
|
||||
|
||||
if (parms->remap != nullptr && parms->remap->Inactive)
|
||||
{ // If it's inactive, pretend we were passed NULL instead.
|
||||
parms->remap = nullptr;
|
||||
}
|
||||
va_end (tags);
|
||||
|
||||
if (parms->uclip >= parms->dclip || parms->lclip >= parms->rclip)
|
||||
{
|
||||
|
|
@ -819,6 +914,10 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
|
|||
}
|
||||
return true;
|
||||
}
|
||||
// explicitly instantiate both versions for v_text.cpp.
|
||||
|
||||
template bool DCanvas::ParseDrawTextureTags<va_list>(FTexture *img, double x, double y, DWORD tag, va_list& tags, DrawParms *parms, bool fortext) const;
|
||||
template bool DCanvas::ParseDrawTextureTags<VMVa_List>(FTexture *img, double x, double y, DWORD tag, VMVa_List& tags, DrawParms *parms, bool fortext) const;
|
||||
|
||||
void DCanvas::VirtualToRealCoords(double &x, double &y, double &w, double &h,
|
||||
double vwidth, double vheight, bool vbottom, bool handleaspect) const
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue