diff --git a/docs/rh-log.txt b/docs/rh-log.txt index f64bb51b1d..d92290e278 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,10 @@ +January 26, 2008 (Changes by Graf Zahl) +- Fixed: ACS used incompatible values for APROP_RenderStyle. It needs to use + the exact same values as previous ZDoom versions +- Added a DECORATE 'stencilcolor' property so that the stencil render style + can be used. +- Added some NULL pointer checks to the font loading code. + January 25, 2008 - Undid some of the changes from lempar.c v1.30->v1.31, because it broke error handling. diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 0d58a001d9..597251e285 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -2152,6 +2152,22 @@ void DLevelScript::DoSetFont (int fontnum) #define APROP_DeathSound 8 #define APROP_ActiveSound 9 +// These are needed for ACS's APROP_RenderStyle +static const int LegacyRenderStyleIndices[] = +{ + 0, // STYLE_None, + 1, // STYLE_Normal, + 2, // STYLE_Fuzzy, + 3, // STYLE_SoulTrans, + 4, // STYLE_OptFuzzy, + 5, // STYLE_Stencil, + 64, // STYLE_Translucent + 65, // STYLE_Add, + 66, // STYLE_Shaded, + 67, // STYLE_TranslucentStencil, + -1 +}; + void DLevelScript::SetActorProperty (int tid, int property, int value) { if (tid == 0) @@ -2199,7 +2215,14 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) break; case APROP_RenderStyle: - actor->RenderStyle = ERenderStyle(value); + for(int i=0; LegacyRenderStyleIndices[i] >= 0; i++) + { + if (LegacyRenderStyleIndices[i] == value) + { + actor->RenderStyle = ERenderStyle(i); + break; + } + } break; case APROP_Ambush: @@ -2293,7 +2316,7 @@ int DLevelScript::GetActorProperty (int tid, int property) { // Check for a legacy render style that matches. if (LegacyRenderStyles[style] == actor->RenderStyle) { - return style; + return LegacyRenderStyleIndices[style]; } } // The current render style isn't expressable as a legacy style, diff --git a/src/r_blend.h b/src/r_blend.h index ccf6129ec6..08e31c5390 100644 --- a/src/r_blend.h +++ b/src/r_blend.h @@ -1,3 +1,6 @@ +#ifndef __R_BLEND_H +#define __R_BLEND_H + /* ** r_blend.h ** Constants and types for specifying texture blending. @@ -116,7 +119,7 @@ union FRenderStyle inline FRenderStyle &operator= (ERenderStyle legacy); operator DWORD() const { return AsDWORD; } bool operator==(const FRenderStyle &o) const { return AsDWORD == o.AsDWORD; } - + void CheckFuzz(); bool IsVisible(fixed_t alpha) const throw(); private: // Code that compares an actor's render style with a legacy render @@ -142,3 +145,5 @@ inline FArchive &operator<< (FArchive &arc, FRenderStyle &style) arc << style.BlendOp << style.SrcAlpha << style.DestAlpha << style.Flags; return arc; } + +#endif diff --git a/src/r_draw.cpp b/src/r_draw.cpp index 3f91a63c10..9e3c49152c 100644 --- a/src/r_draw.cpp +++ b/src/r_draw.cpp @@ -2223,18 +2223,7 @@ ESPSResult R_SetPatchStyle (FRenderStyle style, fixed_t alpha, int translation, { fixed_t fglevel, bglevel; - if (style.BlendOp == STYLEOP_FuzzOrAdd) - { - style.BlendOp = (r_drawfuzz || !r_drawtrans) ? STYLEOP_Fuzz : STYLEOP_Add; - } - else if (style.BlendOp == STYLEOP_FuzzOrSub) - { - style.BlendOp = (r_drawfuzz || !r_drawtrans) ? STYLEOP_Fuzz : STYLEOP_Sub; - } - else if (style.BlendOp == STYLEOP_FuzzOrRevSub) - { - style.BlendOp = (r_drawfuzz || !r_drawtrans) ? STYLEOP_Fuzz : STYLEOP_RevSub; - } + style.CheckFuzz(); if (style.Flags & STYLEF_TransSoulsAlpha) { @@ -2376,3 +2365,28 @@ bool FRenderStyle::IsVisible(fixed_t alpha) const throw() // Treat anything else as visible. return true; } + + +//========================================================================== +// +// FRenderStyle :: CheckFuzz +// +// Adjusts settings based on r_drawfuzz CVAR +// +//========================================================================== + +void FRenderStyle::CheckFuzz() +{ + if (BlendOp == STYLEOP_FuzzOrAdd) + { + BlendOp = (r_drawfuzz || !r_drawtrans) ? STYLEOP_Fuzz : STYLEOP_Add; + } + else if (BlendOp == STYLEOP_FuzzOrSub) + { + BlendOp = (r_drawfuzz || !r_drawtrans) ? STYLEOP_Fuzz : STYLEOP_Sub; + } + else if (BlendOp == STYLEOP_FuzzOrRevSub) + { + BlendOp = (r_drawfuzz || !r_drawtrans) ? STYLEOP_Fuzz : STYLEOP_RevSub; + } +} diff --git a/src/thingdef/thingdef_properties.cpp b/src/thingdef/thingdef_properties.cpp index 3cbb3438f3..a654594708 100644 --- a/src/thingdef/thingdef_properties.cpp +++ b/src/thingdef/thingdef_properties.cpp @@ -1216,7 +1216,7 @@ static void ActorRenderStyle (FScanner &sc, AActor *defaults, Baggage &bag) static const int renderstyle_values[]={ STYLE_None, STYLE_Normal, STYLE_Fuzzy, STYLE_SoulTrans, STYLE_OptFuzzy, - STYLE_Stencil, STYLE_Translucent, STYLE_Add}; + STYLE_TranslucentStencil, STYLE_Translucent, STYLE_Add}; sc.MustGetString(); defaults->RenderStyle = LegacyRenderStyles[renderstyle_values[sc.MustMatchString(renderstyles)]]; @@ -1395,6 +1395,36 @@ static void ActorTranslation (FScanner &sc, AActor *defaults, Baggage &bag) } } +//========================================================================== +// +//========================================================================== +static void ActorStencilColor (FScanner &sc,AActor *defaults, Baggage &bag) +{ + int r,g,b; + + if (sc.CheckNumber()) + { + sc.MustGetNumber(); + r=clamp(sc.Number, 0, 255); + sc.CheckString(","); + sc.MustGetNumber(); + g=clamp(sc.Number, 0, 255); + sc.CheckString(","); + sc.MustGetNumber(); + b=clamp(sc.Number, 0, 255); + } + else + { + sc.MustGetString(); + int c = V_GetColor(NULL, sc.String); + r=RPART(c); + g=GPART(c); + b=BPART(c); + } + defaults->fillcolor = MAKERGB(r,g,b); +} + + //========================================================================== // //========================================================================== @@ -2501,6 +2531,7 @@ static const ActorProps props[] = { "spawnid", ActorSpawnID, RUNTIME_CLASS(AActor) }, { "speed", ActorSpeed, RUNTIME_CLASS(AActor) }, { "states", ActorStates, RUNTIME_CLASS(AActor) }, + { "stencilcolor", ActorStencilColor, RUNTIME_CLASS(AActor) }, { "tag", ActorTag, RUNTIME_CLASS(AActor) }, { "translation", ActorTranslation, RUNTIME_CLASS(AActor) }, { "vspeed", ActorVSpeed, RUNTIME_CLASS(AActor) }, diff --git a/src/v_font.cpp b/src/v_font.cpp index 5f2780eb3b..a6e585042e 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -335,19 +335,22 @@ FFont::FFont (const char *name, const char *nametemplate, int first, int count, if (lump >= 0) { FTexture *pic = TexMan[TexMan.AddPatch (buffer)]; - int height = pic->GetScaledHeight(); - int yoffs = pic->GetScaledTopOffset(); + if (pic != NULL) + { + int height = pic->GetScaledHeight(); + int yoffs = pic->GetScaledTopOffset(); - if (yoffs > maxyoffs) - { - maxyoffs = yoffs; + if (yoffs > maxyoffs) + { + maxyoffs = yoffs; + } + height += abs (yoffs); + if (height > FontHeight) + { + FontHeight = height; + } + RecordTextureColors (pic, usedcolors); } - height += abs (yoffs); - if (height > FontHeight) - { - FontHeight = height; - } - RecordTextureColors (pic, usedcolors); } } @@ -1478,21 +1481,25 @@ FSpecialFont::FSpecialFont (const char *name, int first, int count, int *lumplis if (lump >= 0) { Wads.GetLumpName(buffer, lump); + buffer[8]=0; FTexture *pic = TexMan[TexMan.AddPatch (buffer)]; - int height = pic->GetScaledHeight(); - int yoffs = pic->GetScaledTopOffset(); - - if (yoffs > maxyoffs) + if (pic != NULL) { - maxyoffs = yoffs; - } - height += abs (yoffs); - if (height > FontHeight) - { - FontHeight = height; - } + int height = pic->GetScaledHeight(); + int yoffs = pic->GetScaledTopOffset(); - RecordTextureColors (pic, usedcolors); + if (yoffs > maxyoffs) + { + maxyoffs = yoffs; + } + height += abs (yoffs); + if (height > FontHeight) + { + FontHeight = height; + } + + RecordTextureColors (pic, usedcolors); + } } }