- Fixed: FBarShader::PrepareShader() set a member variable to point at a

local variable just before returning. Then I made some more changes so that
  it can be a properly functioning texture. After doing that, I decided to
  rewrite the texture generation to be easier for me to read and hopefully
  faster, since this thing is getting generated every frame. (Please don't
  hurt me if I got it wrong. I'm basing this on the description in the wiki,
  since I couldn't wrap my head around what the code was doing by looking
  at it.) Then I realized that there's really no reason to have more than four
  of these ever, and they can be statically generated, so I simplified it some
  more.
- Added Blzut3's latest SBARINFO patch:
 * Fixed a massive memory leak in SBARINFO. The leak also lead to progressive
   CPU usage.
 * Fixed: Playerclass didn't work in SBARINFO.
 * Fixed: Artiflash was improperly initialized causing it not to display the
   first time.
 * Changed the variable SBarInfoScript to be a pointer to prevent more memory
   leaks.


SVN r665 (trunk)
This commit is contained in:
Randy Heit 2008-01-05 04:23:34 +00:00
parent aa90336765
commit 3017f7646d
4 changed files with 130 additions and 105 deletions

View file

@ -1,3 +1,23 @@
January 4, 2008
- Fixed: FBarShader::PrepareShader() set a member variable to point at a
local variable just before returning. Then I made some more changes so that
it can be a properly functioning texture. After doing that, I decided to
rewrite the texture generation to be easier for me to read and hopefully
faster, since this thing is getting generated every frame. (Please don't
hurt me if I got it wrong. I'm basing this on the description in the wiki,
since I couldn't wrap my head around what the code was doing by looking
at it.) Then I realized that there's really no reason to have more than four
of these ever, and they can be statically generated, so I simplified it some
more.
- Added Blzut3's latest SBARINFO patch:
* Fixed a massive memory leak in SBARINFO. The leak also lead to progressive
CPU usage.
* Fixed: Playerclass didn't work in SBARINFO.
* Fixed: Artiflash was improperly initialized causing it not to display the
first time.
* Changed the variable SBarInfoScript to be a pointer to prevent more memory
leaks.
January 4, 2008 (Changes by Graf Zahl) January 4, 2008 (Changes by Graf Zahl)
- Removed the patches for the Doom/Heretic E1 intermission screens from - Removed the patches for the Doom/Heretic E1 intermission screens from
R_InitPatches. This isn't needed anymore because all these are loaded through R_InitPatches. This isn't needed anymore because all these are loaded through

View file

@ -1541,7 +1541,12 @@ void G_InitNew (const char *mapname, bool bTitleLevel)
int stbar = gameinfo.gametype; int stbar = gameinfo.gametype;
if(Wads.CheckNumForName("SBARINFO") != -1) if(Wads.CheckNumForName("SBARINFO") != -1)
{ {
stbar = SBarInfoScript.ParseSBarInfo(Wads.GetNumForName("SBARINFO")); //load last SBARINFO lump to avoid clashes if(SBarInfoScript != NULL)
{
delete SBarInfoScript;
}
SBarInfoScript = new SBarInfo();
stbar = SBarInfoScript->ParseSBarInfo(Wads.GetNumForName("SBARINFO")); //load last SBARINFO lump to avoid clashes
} }
//end most of the SBarInfo stuff //end most of the SBarInfo stuff
if (StatusBar != NULL) if (StatusBar != NULL)

View file

@ -30,7 +30,7 @@ static FRandom pr_chainwiggle; //use the same method of chain wiggling as hereti
EXTERN_CVAR(Int, fraglimit) EXTERN_CVAR(Int, fraglimit)
SBarInfo SBarInfoScript; SBarInfo *SBarInfoScript;
enum //gametype flags enum //gametype flags
{ {
@ -337,7 +337,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height); //the position should be absolute on the screen. cmd.y = sc_Number - (200 - SBarInfoScript->height); //the position should be absolute on the screen.
if(SC_CheckToken(',')) if(SC_CheckToken(','))
{ {
SC_MustGetToken(TK_Identifier); SC_MustGetToken(TK_Identifier);
@ -418,7 +418,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript->height);
if(SC_CheckToken(',')) if(SC_CheckToken(','))
{ {
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
@ -442,7 +442,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript->height);
SC_MustGetToken(';'); SC_MustGetToken(';');
break; break;
case SBARINFO_DRAWSELECTEDINVENTORY: case SBARINFO_DRAWSELECTEDINVENTORY:
@ -474,7 +474,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript->height);
cmd.special2 = cmd.x + 30; cmd.special2 = cmd.x + 30;
cmd.special3 = cmd.y + 24; cmd.special3 = cmd.y + 24;
cmd.translation = CR_GOLD; cmd.translation = CR_GOLD;
@ -484,7 +484,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.special2 = sc_Number; cmd.special2 = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.special3 = sc_Number - (200 - SBarInfoScript.height); cmd.special3 = sc_Number - (200 - SBarInfoScript->height);
if(SC_CheckToken(',')) if(SC_CheckToken(','))
{ {
SC_MustGetToken(TK_Identifier); SC_MustGetToken(TK_Identifier);
@ -549,7 +549,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetNumber(); SC_MustGetNumber();
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript->height);
cmd.special2 = cmd.x + 26; cmd.special2 = cmd.x + 26;
cmd.special3 = cmd.y + 22; cmd.special3 = cmd.y + 22;
cmd.translation = CR_GOLD; cmd.translation = CR_GOLD;
@ -559,7 +559,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.special2 = sc_Number; cmd.special2 = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.special3 = sc_Number - (200 - SBarInfoScript.height); cmd.special3 = sc_Number - (200 - SBarInfoScript->height);
if(SC_CheckToken(',')) if(SC_CheckToken(','))
{ {
SC_MustGetToken(TK_Identifier); SC_MustGetToken(TK_Identifier);
@ -658,7 +658,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript->height);
SC_MustGetToken(';'); SC_MustGetToken(';');
break; break;
case SBARINFO_DRAWGEM: case SBARINFO_DRAWGEM:
@ -697,7 +697,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript->height);
SC_MustGetToken(';'); SC_MustGetToken(';');
break; break;
case SBARINFO_DRAWSHADER: case SBARINFO_DRAWSHADER:
@ -730,7 +730,7 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.x = sc_Number; cmd.x = sc_Number;
SC_MustGetToken(','); SC_MustGetToken(',');
SC_MustGetToken(TK_IntConst); SC_MustGetToken(TK_IntConst);
cmd.y = sc_Number - (200 - SBarInfoScript.height); cmd.y = sc_Number - (200 - SBarInfoScript->height);
SC_MustGetToken(';'); SC_MustGetToken(';');
break; break;
case SBARINFO_GAMEMODE: case SBARINFO_GAMEMODE:
@ -756,22 +756,28 @@ void SBarInfo::ParseSBarInfoBlock(SBarInfoBlock &block)
cmd.special = cmd.special2 = cmd.special3 = -1; cmd.special = cmd.special2 = cmd.special3 = -1;
for(int i = 0;i < 3 && SC_CheckToken(TK_Identifier);i++) //up to 3 classes for(int i = 0;i < 3 && SC_CheckToken(TK_Identifier);i++) //up to 3 classes
{ {
bool foundClass = false;
for(unsigned int c = 0;c < PlayerClasses.Size();c++) for(unsigned int c = 0;c < PlayerClasses.Size();c++)
{ {
if(stricmp(sc_String, PlayerClasses[c].Type->Meta.GetMetaString(APMETA_DisplayName)) == 0) if(stricmp(sc_String, PlayerClasses[c].Type->Meta.GetMetaString(APMETA_DisplayName)) == 0)
{ {
foundClass = true;
if(i == 0) if(i == 0)
cmd.special = c; cmd.special = c;
else if(i == 1) else if(i == 1)
cmd.special2 = c; cmd.special2 = c;
else //should be 2 else //should be 2
cmd.special3 = c; cmd.special3 = c;
if(SC_CheckToken('{') || i == 2) break;
break;
SC_MustGetToken(',');
} }
} }
if(!foundClass)
SC_ScriptError("Unkown PlayerClass '%s'.", sc_String);
if(SC_CheckToken('{') || i == 2)
goto FinishPlayerClass;
SC_MustGetToken(',');
} }
FinishPlayerClass:
this->ParseSBarInfoBlock(cmd.subBlock); this->ParseSBarInfoBlock(cmd.subBlock);
break; break;
} }
@ -982,24 +988,57 @@ protected:
FTexture* image; FTexture* image;
}; };
//Used for shadeing //Used for shading
class FBarShader : public FTexture class FBarShader : public FTexture
{ {
public: public:
FBarShader() FBarShader(bool vertical, bool reverse) //make an alpha map
{ {
WidthBits = 4; int i;
HeightBits = 4;
WidthMask = 15; Width = vertical ? 1 : 256;
Height = vertical ? 256 : 1;
CalcBitSize();
// Fill the column/row with shading values.
// Vertical shaders have have minimum alpha at the top
// and maximum alpha at the bottom, unless flipped by
// setting reverse to true. Horizontal shaders are just
// the opposite.
if ((!reverse && vertical) || (reverse && !vertical))
{
for (i = 0; i < 256; ++i)
{
Pixels[i] = i;
}
}
else
{
for (i = 0; i < 256; ++i)
{
Pixels[i] = 255 - i;
}
}
DummySpan[0].TopOffset = 0;
DummySpan[0].Length = vertical ? 256 : 1;
DummySpan[1].TopOffset = 0;
DummySpan[1].Length = 0;
} }
const BYTE *GetColumn(unsigned int column, const Span **spans_out) const BYTE *GetColumn(unsigned int column, const Span **spans_out)
{ {
if(spans_out != NULL) if (spans_out != NULL)
{ {
*spans_out = DummySpan; *spans_out = DummySpan;
} }
return Pixels + 10*(column & (Width-1)); if (Width == 1)
{
return Pixels;
}
else
{
return Pixels + (column & 255);
}
} }
const BYTE *GetPixels() const BYTE *GetPixels()
@ -1011,63 +1050,16 @@ public:
{ {
} }
void PrepareShader(int width, int height, bool vertical, bool reverse) //make an alpha map
{
Width = width;
Height = height;
Pixels = new BYTE[width*height];
int value = vertical ? 256/height : 256/width;
int currentValue = value;
if(vertical)
{
for(int i = !reverse ? 0 : (width*height)-1;(!reverse && i < width*height) || (reverse && i >= 0);i += !reverse ? 1 : -1)
{
Pixels[i] = currentValue;
if(currentValue >= (value*height)) //time to reset
{
currentValue = value;
continue;
}
currentValue += value;
if(currentValue > 254)
{
currentValue = 254;
}
}
}
else
{
for(int i = reverse ? 0 : (width*height)-1;(reverse && i < width*height) || (!reverse && i >= 0);i += reverse ? 1 : -1)
{
Pixels[i] = currentValue;
if(i%height == 0)
{
if(currentValue >= (value*width)) //time to reset
{
currentValue = value;
continue;
}
currentValue += value;
if(currentValue > 254)
{
currentValue = 254;
}
}
}
}
Span Dummy[2] = {{0, height}, {0, 0}};
DummySpan = Dummy;
}
private: private:
BYTE* Pixels; BYTE Pixels[256];
Span* DummySpan; Span DummySpan[2];
}; };
//SBarInfo Display //SBarInfo Display
class FSBarInfo : public FBaseStatusBar class FSBarInfo : public FBaseStatusBar
{ {
public: public:
FSBarInfo () : FBaseStatusBar (SBarInfoScript.height) FSBarInfo () : FBaseStatusBar (SBarInfoScript->height)
{ {
static const char *InventoryBarLumps[] = static const char *InventoryBarLumps[] =
{ {
@ -1076,22 +1068,22 @@ public:
"USEARTIA", "USEARTIB", "USEARTIC", "USEARTID", "USEARTIA", "USEARTIB", "USEARTIC", "USEARTID",
}; };
TArray<const char *> patchnames; TArray<const char *> patchnames;
patchnames.Resize(SBarInfoScript.Images.Size()+10); patchnames.Resize(SBarInfoScript->Images.Size()+10);
unsigned int i = 0; unsigned int i = 0;
for(i = 0;i < SBarInfoScript.Images.Size();i++) for(i = 0;i < SBarInfoScript->Images.Size();i++)
{ {
patchnames[i] = SBarInfoScript.Images[i]; patchnames[i] = SBarInfoScript->Images[i];
} }
for(i = 0;i < 10;i++) for(i = 0;i < 10;i++)
{ {
patchnames[i+SBarInfoScript.Images.Size()] = InventoryBarLumps[i]; patchnames[i+SBarInfoScript->Images.Size()] = InventoryBarLumps[i];
} }
invBarOffset = SBarInfoScript.Images.Size(); invBarOffset = SBarInfoScript->Images.Size();
Images.Init(&patchnames[0], patchnames.Size()); Images.Init(&patchnames[0], patchnames.Size());
drawingFont = V_GetFont("ConFont"); drawingFont = V_GetFont("ConFont");
faceTimer = ST_FACETIME; faceTimer = ST_FACETIME;
faceIndex = 0; faceIndex = 0;
if(SBarInfoScript.interpolateHealth) if(SBarInfoScript->interpolateHealth)
{ {
oldHealth = 0; oldHealth = 0;
} }
@ -1099,7 +1091,7 @@ public:
lastPrefix = ""; lastPrefix = "";
weaponGrin = false; weaponGrin = false;
chainWiggle = 0; chainWiggle = 0;
artiflash = 0; artiflash = 4;
} }
~FSBarInfo () ~FSBarInfo ()
@ -1114,7 +1106,7 @@ public:
int hud = 2; int hud = 2;
if(state == HUD_StatusBar) if(state == HUD_StatusBar)
{ {
if(SBarInfoScript.automapbar && automapactive) if(SBarInfoScript->automapbar && automapactive)
{ {
hud = 3; hud = 3;
} }
@ -1131,13 +1123,13 @@ public:
{ {
hud = 0; hud = 0;
} }
doCommands(SBarInfoScript.huds[hud]); doCommands(SBarInfoScript->huds[hud]);
if(CPlayer->inventorytics > 0 && !(level.flags & LEVEL_NOINVENTORYBAR)) if(CPlayer->inventorytics > 0 && !(level.flags & LEVEL_NOINVENTORYBAR))
{ {
if(state == HUD_StatusBar) if(state == HUD_StatusBar)
doCommands(SBarInfoScript.huds[4]); doCommands(SBarInfoScript->huds[4]);
else if(state == HUD_Fullscreen) else if(state == HUD_Fullscreen)
doCommands(SBarInfoScript.huds[5]); doCommands(SBarInfoScript->huds[5]);
} }
} }
@ -1165,7 +1157,7 @@ public:
if(level.time & 1) if(level.time & 1)
chainWiggle = pr_chainwiggle() & 1; chainWiggle = pr_chainwiggle() & 1;
getNewFace(M_Random()); getNewFace(M_Random());
if(!SBarInfoScript.interpolateHealth) if(!SBarInfoScript->interpolateHealth)
{ {
oldHealth = CPlayer->health; oldHealth = CPlayer->health;
} }
@ -1273,7 +1265,7 @@ private:
int ammocount1, ammocount2; int ammocount1, ammocount2;
GetCurrentAmmo(ammo1, ammo2, ammocount1, ammocount2); GetCurrentAmmo(ammo1, ammo2, ammocount1, ammocount2);
int health = CPlayer->mo->health; int health = CPlayer->mo->health;
if(SBarInfoScript.interpolateHealth) if(SBarInfoScript->interpolateHealth)
{ {
health = oldHealth; health = oldHealth;
} }
@ -1285,7 +1277,7 @@ private:
case SBARINFO_DRAWSWITCHABLEIMAGE: //draw the alt image if we don't have the item else this is like a normal drawimage case SBARINFO_DRAWSWITCHABLEIMAGE: //draw the alt image if we don't have the item else this is like a normal drawimage
{ {
int drawAlt = 0; int drawAlt = 0;
if((cmd.flags & DRAWIMAGE_WEAPONSLOT) == DRAWIMAGE_WEAPONSLOT) //weaponslots if((cmd.flags & DRAWIMAGE_WEAPONSLOT)) //weaponslots
{ {
drawAlt = 1; //draw off state until we know we have something. drawAlt = 1; //draw off state until we know we have something.
for (int i = 0; i < MAX_WEAPONS_PER_SLOT; i++) for (int i = 0; i < MAX_WEAPONS_PER_SLOT; i++)
@ -1302,7 +1294,7 @@ private:
} }
} }
} }
else if((cmd.flags & DRAWIMAGE_INVULNERABILITY) == DRAWIMAGE_INVULNERABILITY) else if((cmd.flags & DRAWIMAGE_INVULNERABILITY))
{ {
if(CPlayer->cheats&CF_GODMODE) if(CPlayer->cheats&CF_GODMODE)
{ {
@ -1314,7 +1306,7 @@ private:
AInventory* item = CPlayer->mo->FindInventory(PClass::FindClass(cmd.string[0])); AInventory* item = CPlayer->mo->FindInventory(PClass::FindClass(cmd.string[0]));
if(item == NULL) if(item == NULL)
drawAlt = 1; drawAlt = 1;
if((cmd.flags & DRAWIMAGE_SWITCHABLE_AND) == DRAWIMAGE_SWITCHABLE_AND) if((cmd.flags & DRAWIMAGE_SWITCHABLE_AND))
{ {
item = CPlayer->mo->FindInventory(PClass::FindClass(cmd.string[1])); item = CPlayer->mo->FindInventory(PClass::FindClass(cmd.string[1]));
if(item != NULL && drawAlt == 0) //both if(item != NULL && drawAlt == 0) //both
@ -1343,19 +1335,19 @@ private:
} }
} }
case SBARINFO_DRAWIMAGE: case SBARINFO_DRAWIMAGE:
if((cmd.flags & DRAWIMAGE_PLAYERICON) == DRAWIMAGE_PLAYERICON) if((cmd.flags & DRAWIMAGE_PLAYERICON))
DrawGraphic(TexMan[CPlayer->mo->ScoreIcon], cmd.x, cmd.y, cmd.flags); DrawGraphic(TexMan[CPlayer->mo->ScoreIcon], cmd.x, cmd.y, cmd.flags);
else if((cmd.flags & DRAWIMAGE_AMMO1) == DRAWIMAGE_AMMO1) else if((cmd.flags & DRAWIMAGE_AMMO1))
{ {
if(ammo1 != NULL) if(ammo1 != NULL)
DrawGraphic(TexMan[ammo1->Icon], cmd.x, cmd.y, cmd.flags); DrawGraphic(TexMan[ammo1->Icon], cmd.x, cmd.y, cmd.flags);
} }
else if((cmd.flags & DRAWIMAGE_AMMO2) == DRAWIMAGE_AMMO2) else if((cmd.flags & DRAWIMAGE_AMMO2))
{ {
if(ammo2 != NULL) if(ammo2 != NULL)
DrawGraphic(TexMan[ammo2->Icon], cmd.x, cmd.y, cmd.flags); DrawGraphic(TexMan[ammo2->Icon], cmd.x, cmd.y, cmd.flags);
} }
else if((cmd.flags & DRAWIMAGE_INVENTORYICON) == DRAWIMAGE_INVENTORYICON) else if((cmd.flags & DRAWIMAGE_INVENTORYICON))
{ {
DrawGraphic(TexMan[cmd.sprite], cmd.x, cmd.y, cmd.flags); DrawGraphic(TexMan[cmd.sprite], cmd.x, cmd.y, cmd.flags);
} }
@ -1618,7 +1610,7 @@ private:
int value = health; int value = health;
int max = 100; int max = 100;
bool wiggle = false; bool wiggle = false;
bool translate = (cmd.flags & DRAWGEM_TRANSLATABLE) == DRAWGEM_TRANSLATABLE; bool translate = !!(cmd.flags & DRAWGEM_TRANSLATABLE);
if(max != 0 || value < 0) if(max != 0 || value < 0)
{ {
value = (value*100)/max; value = (value*100)/max;
@ -1631,30 +1623,38 @@ private:
} }
if(health != CPlayer->health) if(health != CPlayer->health)
{ {
wiggle = (cmd.flags & DRAWGEM_WIGGLE) == DRAWGEM_WIGGLE; wiggle = !!(cmd.flags & DRAWGEM_WIGGLE);
} }
DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, cmd.special2, cmd.special3, cmd.special4+1, wiggle, translate); DrawGem(Images[cmd.special], Images[cmd.sprite], value, cmd.x, cmd.y, cmd.special2, cmd.special3, cmd.special4+1, wiggle, translate);
break; break;
} }
case SBARINFO_DRAWSHADER: case SBARINFO_DRAWSHADER:
{ {
static FBarShader shader_horz_normal(false, false);
static FBarShader shader_horz_reverse(false, true);
static FBarShader shader_vert_normal(true, false);
static FBarShader shader_vert_reverse(true, true);
static FBarShader *const shaders[4] =
{
&shader_horz_normal, &shader_horz_reverse,
&shader_vert_normal, &shader_vert_reverse
};
bool vertical = !!(cmd.flags & DRAWSHADER_VERTICAL); bool vertical = !!(cmd.flags & DRAWSHADER_VERTICAL);
bool reverse = !!(cmd.flags & DRAWSHADER_REVERSE); bool reverse = !!(cmd.flags & DRAWSHADER_REVERSE);
FBarShader* shader = new FBarShader(); screen->DrawTexture (shaders[(vertical << 1) + reverse], ST_X+cmd.x, ST_Y+cmd.y,
shader->PrepareShader(cmd.special, cmd.special2, vertical, reverse); DTA_DestWidth, cmd.special,
screen->DrawTexture (shader, ST_X+cmd.x, ST_Y+cmd.y, DTA_DestHeight, cmd.special2,
DTA_320x200, Scaled, DTA_320x200, Scaled,
DTA_AlphaChannel, true, DTA_AlphaChannel, true,
DTA_FillColor, 0, DTA_FillColor, 0,
TAG_DONE); TAG_DONE);
delete shader;
break; break;
} }
case SBARINFO_GAMEMODE: case SBARINFO_GAMEMODE:
if(((cmd.flags & GAMETYPE_SINGLEPLAYER) == GAMETYPE_SINGLEPLAYER && !multiplayer) || if(((cmd.flags & GAMETYPE_SINGLEPLAYER) && !multiplayer) ||
((cmd.flags & GAMETYPE_DEATHMATCH) == GAMETYPE_DEATHMATCH && deathmatch) || ((cmd.flags & GAMETYPE_DEATHMATCH) && deathmatch) ||
((cmd.flags & GAMETYPE_COOPERATIVE) == GAMETYPE_COOPERATIVE && multiplayer && !deathmatch) || ((cmd.flags & GAMETYPE_COOPERATIVE) && multiplayer && !deathmatch) ||
((cmd.flags & GAMETYPE_TEAMGAME) == GAMETYPE_TEAMGAME && teamplay)) ((cmd.flags & GAMETYPE_TEAMGAME) && teamplay))
{ {
doCommands(cmd.subBlock); doCommands(cmd.subBlock);
} }
@ -1673,12 +1673,12 @@ private:
//draws and image with the specified flags //draws and image with the specified flags
void DrawGraphic(FTexture* texture, int x, int y, int flags) void DrawGraphic(FTexture* texture, int x, int y, int flags)
{ {
if((flags & DRAWIMAGE_OFFSET_CENTER) == DRAWIMAGE_OFFSET_CENTER) if((flags & DRAWIMAGE_OFFSET_CENTER))
{ {
x -= (texture->GetWidth()/2)-texture->LeftOffset; x -= (texture->GetWidth()/2)-texture->LeftOffset;
y -= (texture->GetHeight()/2)-texture->TopOffset; y -= (texture->GetHeight()/2)-texture->TopOffset;
} }
if((flags & DRAWIMAGE_TRANSLATABLE) == DRAWIMAGE_TRANSLATABLE) if((flags & DRAWIMAGE_TRANSLATABLE))
DrawImage(texture, x, y, getTranslation()); DrawImage(texture, x, y, getTranslation());
else else
DrawImage(texture, x, y); DrawImage(texture, x, y);

View file

@ -46,6 +46,6 @@ struct SBarInfo
SBarInfo(); SBarInfo();
}; };
extern SBarInfo SBarInfoScript; extern SBarInfo *SBarInfoScript;
#endif //__SBarInfo_SBAR_H__ #endif //__SBarInfo_SBAR_H__