- 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:
Randy Heit 2007-12-11 03:29:31 +00:00
parent e666cde418
commit acbe3a191e
4 changed files with 48 additions and 0 deletions

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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;
}
}
}