mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-23 04:22:34 +00:00
- Fixed: Redefining a decal did not rebind any old references to the decal, so
they would be left pointing at invalid data. SVN r594 (trunk)
This commit is contained in:
parent
e666cde418
commit
acbe3a191e
4 changed files with 48 additions and 0 deletions
|
@ -1,4 +1,6 @@
|
||||||
December 10, 2007
|
December 10, 2007
|
||||||
|
- Fixed: Redefining a decal did not rebind any old references to the decal, so
|
||||||
|
they would be left pointing at invalid data.
|
||||||
- Fixed some more GCC warnings.
|
- Fixed some more GCC warnings.
|
||||||
- Updated project files for nasm 2.0, which is now named nasm.exe for the
|
- Updated project files for nasm 2.0, which is now named nasm.exe for the
|
||||||
Windows version, rather than nasmw.exe. Also fixed the annoying new warnings
|
Windows version, rather than nasmw.exe. Also fixed the annoying new warnings
|
||||||
|
|
|
@ -66,6 +66,10 @@ class FDecalGroup : public FDecalBase
|
||||||
public:
|
public:
|
||||||
FDecalGroup () : Choices (pr_decalchoice) {}
|
FDecalGroup () : Choices (pr_decalchoice) {}
|
||||||
const FDecalTemplate *GetDecal () const;
|
const FDecalTemplate *GetDecal () const;
|
||||||
|
void ReplaceDecalRef (FDecalBase *from, FDecalBase *to)
|
||||||
|
{
|
||||||
|
Choices.ReplaceValues(from, to);
|
||||||
|
}
|
||||||
void AddDecal (FDecalBase *decal, WORD weight)
|
void AddDecal (FDecalBase *decal, WORD weight)
|
||||||
{
|
{
|
||||||
Choices.AddEntry (decal, weight);
|
Choices.AddEntry (decal, weight);
|
||||||
|
@ -301,6 +305,14 @@ const FDecalTemplate *FDecalBase::GetDecal () const
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FDecalTemplate::ReplaceDecalRef(FDecalBase *from, FDecalBase *to)
|
||||||
|
{
|
||||||
|
if (LowerDecal == from)
|
||||||
|
{
|
||||||
|
LowerDecal = to;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FDecalLib::FDecalLib ()
|
FDecalLib::FDecalLib ()
|
||||||
{
|
{
|
||||||
Root = NULL;
|
Root = NULL;
|
||||||
|
@ -828,6 +840,17 @@ void FDecalLib::ParseCombiner ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FDecalLib::ReplaceDecalRef (FDecalBase *from, FDecalBase *to, FDecalBase *root)
|
||||||
|
{
|
||||||
|
if (root == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ReplaceDecalRef (from, to, root->Left);
|
||||||
|
ReplaceDecalRef (from, to, root->Right);
|
||||||
|
root->ReplaceDecalRef (from, to);
|
||||||
|
}
|
||||||
|
|
||||||
void FDecalLib::AddDecal (const char *name, BYTE num, const FDecalTemplate &decal)
|
void FDecalLib::AddDecal (const char *name, BYTE num, const FDecalTemplate &decal)
|
||||||
{
|
{
|
||||||
FDecalTemplate *newDecal = new FDecalTemplate;
|
FDecalTemplate *newDecal = new FDecalTemplate;
|
||||||
|
@ -873,6 +896,10 @@ void FDecalLib::AddDecal (FDecalBase *decal)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // Yes, replace the old one.
|
{ // Yes, replace the old one.
|
||||||
|
// If this decal has been used as the lowerdecal for another decal,
|
||||||
|
// be sure and update the lowerdecal to use the new decal.
|
||||||
|
ReplaceDecalRef(node, decal, Root);
|
||||||
|
|
||||||
decal->Left = node->Left;
|
decal->Left = node->Left;
|
||||||
decal->Right = node->Right;
|
decal->Right = node->Right;
|
||||||
*prev = decal;
|
*prev = decal;
|
||||||
|
|
|
@ -52,6 +52,7 @@ class FDecalBase
|
||||||
friend class FDecalLib;
|
friend class FDecalLib;
|
||||||
public:
|
public:
|
||||||
virtual const FDecalTemplate *GetDecal () const;
|
virtual const FDecalTemplate *GetDecal () const;
|
||||||
|
virtual void ReplaceDecalRef (FDecalBase *from, FDecalBase *to) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
FDecalBase ();
|
FDecalBase ();
|
||||||
|
@ -71,6 +72,7 @@ public:
|
||||||
|
|
||||||
void ApplyToDecal (DBaseDecal *actor, side_s *wall) const;
|
void ApplyToDecal (DBaseDecal *actor, side_s *wall) const;
|
||||||
const FDecalTemplate *GetDecal () const;
|
const FDecalTemplate *GetDecal () const;
|
||||||
|
void ReplaceDecalRef (FDecalBase *from, FDecalBase *to);
|
||||||
|
|
||||||
fixed_t ScaleX, ScaleY;
|
fixed_t ScaleX, ScaleY;
|
||||||
DWORD ShadeColor;
|
DWORD ShadeColor;
|
||||||
|
@ -104,6 +106,7 @@ private:
|
||||||
static void DelTree (FDecalBase *root);
|
static void DelTree (FDecalBase *root);
|
||||||
static FDecalBase *ScanTreeForNum (const BYTE num, FDecalBase *root);
|
static FDecalBase *ScanTreeForNum (const BYTE num, FDecalBase *root);
|
||||||
static FDecalBase *ScanTreeForName (const char *name, FDecalBase *root);
|
static FDecalBase *ScanTreeForName (const char *name, FDecalBase *root);
|
||||||
|
static void ReplaceDecalRef (FDecalBase *from, FDecalBase *to, FDecalBase *root);
|
||||||
FTranslation *GenerateTranslation (DWORD start, DWORD end);
|
FTranslation *GenerateTranslation (DWORD start, DWORD end);
|
||||||
void AddDecal (const char *name, BYTE num, const FDecalTemplate &decal);
|
void AddDecal (const char *name, BYTE num, const FDecalTemplate &decal);
|
||||||
void AddDecal (FDecalBase *decal);
|
void AddDecal (FDecalBase *decal);
|
||||||
|
|
|
@ -66,6 +66,7 @@ class TWeightedList
|
||||||
|
|
||||||
void AddEntry (T value, WORD weight);
|
void AddEntry (T value, WORD weight);
|
||||||
T PickEntry () const;
|
T PickEntry () const;
|
||||||
|
void ReplaceValues (T oldval, T newval);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Choice<T> *Choices;
|
Choice<T> *Choices;
|
||||||
|
@ -148,3 +149,18 @@ void TWeightedList<T>::RecalcRandomVals ()
|
||||||
choice->RandomVal = (BYTE)(randVal * 255.0);
|
choice->RandomVal = (BYTE)(randVal * 255.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Replace all values that match oldval with newval
|
||||||
|
template<class T>
|
||||||
|
void TWeightedList<T>::ReplaceValues(T oldval, T newval)
|
||||||
|
{
|
||||||
|
Choice<T> *choice;
|
||||||
|
|
||||||
|
for (choice = Choices; choice != NULL; choice = choice->Next)
|
||||||
|
{
|
||||||
|
if (choice->Value == oldval)
|
||||||
|
{
|
||||||
|
choice->Value = newval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue