- Added Jim's Makefile.linux;

- Changed: Decal scales now use full precision fixed point numbers.
- Changed: Keeping impact decals in their own statlist is enough to keep track
  of them for when one needs to be destroyed. There's no need to maintain a
  separate list for them.
- Fixed: Decal actors did not spread their decals across neighboring walls.
- Fixed: Decal groups did not initialize their IDs and could not be reliably
  used with the decal actor.
- Fixed: Decals on moving polyobjects were not interpolated. R_RenderDecal()
  now uses the decal's LeftDistance to calculate its visible location, so it
  always stays in sync with the wall's vertices. This also lets me dump some
  code from the polyobjects that maintained the decals' (x, y) coordinates.
  Also, the decals' x and y information is redundant and can be removed.
  Doing this revealed a bug with slider decals and horizontal sliding:
  That is, it didn't work at all. I have opted to simply remove the horizontal
  sliding support so that I don't have to worry about what happens when a
  decal slides across the edge of a wall.
- Fixed: DBaseDecal::LeftDistance was calculated as a 30.2 fixed point number.
  It should be 2.30 fixed point.


SVN r35 (trunk)
This commit is contained in:
Randy Heit 2006-04-13 02:01:40 +00:00
parent 4982558bbf
commit 735e6d72c4
17 changed files with 360 additions and 284 deletions

View File

@ -1,6 +1,5 @@
ifeq (Windows_NT,$(OS))
include Makefile.mgw
else
all:
@echo Building with MinGW requires Windows NT
include Makefile.linux
endif

91
Makefile.linux Normal file
View File

@ -0,0 +1,91 @@
# created on 4/12/2006 by James Bentler
CXX ?= g++
CPPFLAGS ?= -Wall -Wno-unused -O2 -fomit-frame-pointer
CXXFLAGS += -DHAVE_FILELENGTH -D__forceinline=inline -Izlib -IFLAC `sdl-config --cflags`
CXXFLAGS += -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp
LDFLAGS += -lFLAC++ -lFLAC -lz -lfmod `sdl-config --libs`
NASM ?= nasm
NASMFLAGS += -f elf -DM_TARGET_LINUX
SRCDIRS = src/ $(addprefix src/,g_doom/ g_heretic/ g_hexen/ g_raven/ g_shared/ g_strife/ oplsynth/ sound/ sdl/)
INCLUDES = $(addprefix -I,$(SRCDIRS))
CXXFLAGS += $(INCLUDES)
RELEASEOBJ ?= releaseobj
DEBUGOBJ ?= debugobj
CSRCS = $(wildcard $(addsuffix *.cpp,$(SRCDIRS)))
ASRCS = $(wildcard src/*.nas)
SRCS = $(ASRCS) $(CSRCS)
COBJFILES = $(notdir $(patsubst %.cpp,%.o,$(CSRCS)))
AOBJFILES = $(notdir $(patsubst %.nas,%.o,$(ASRCS)))
ZDOOM = zdoom
ZDOOMDEBUG = zdoomd
ifndef DEBUG
OBJDIR = $(RELEASEOBJ)
CXXFLAGS += -DNDEBUG
ZDOOMBIN = $(ZDOOM)
else
OBJDIR = $(DEBUGOBJ)
CXXFLAGS += -g
ZDOOMBIN = $(ZDOOMDEBUG)
endif
COBJS = $(addprefix $(OBJDIR)/,$(COBJFILES))
DEPS = $(patsubst %.o,%.d,$(COBJS))
OBJS = $(addprefix $(OBJDIR)/,$(AOBJFILES)) $(COBJS)
# rule pattern for dependencies
define DEPBUILD_PATTERN
_dep_: _src_
echo "_dep_: _src_"
$(CXX) _src_ -MM $(CXXFLAGS) -MT "$$(patsubst %.d,%.o,_dep_) _dep_" -MF _dep_
-include _dep_
endef
# rule pattern for assembly files
define ASMBUILD_PATTERN
_obj_: _src_
echo "_obj_: _src_"
$(NASM) -o _obj_ $(NASMFLAGS) _src_
endef
all: $(ZDOOMBIN) zdoom.wad
$(ZDOOMBIN): $(DEPS) $(OBJDIR) $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $(ZDOOMBIN)
# textually substitute in the _obj_ and the _src_ it depends on to create rules
$(foreach src,$(ASRCS), $(eval $(subst _src_,$(src),$(subst \
_obj_,$(OBJDIR)/$(patsubst %.nas,%.o,$(notdir $$$(src))),$(ASMBUILD_PATTERN)))))
# textually substitute in the _dep_ and the _src_ it depends on to create rules
$(foreach src,$(CSRCS), $(eval $(subst _src_,$(src),$(subst \
_dep_,$(OBJDIR)/$(patsubst %.cpp,%.d,$(notdir $$$(src))),$(DEPBUILD_PATTERN)))))
$(OBJDIR)/%.o:
$(CXX) -c $(CXXFLAGS) -o $@ -c $<
-include $(DEPS)
$(OBJDIR):
mkdir -p $(OBJDIR)
zdoom.wad:
make -C wadsrc/ -f Makefile
.PHONY : clean cleandeps cleanobjs
clean:
rm -f $(RELEASEOBJ)/* $(DEBUGOBJ)/* $(ZDOOMDEBUG) $(ZDOOM)
cleandeps:
rm -f $(RELEASEOBJ)/*.d $(DEBUGOBJ)/*.d
cleanobjs:
rm -f $(RELEASEOBJ)/*.o $(DEBUGOBJ)/*.o

View File

@ -1,3 +1,24 @@
April 12, 2006
- Added Jim's Makefile.linux;
- Changed: Decal scales now use full precision fixed point numbers.
- Changed: Keeping impact decals in their own statlist is enough to keep track
of them for when one needs to be destroyed. There's no need to maintain a
separate list for them.
- Fixed: Decal actors did not spread their decals across neighboring walls.
- Fixed: Decal groups did not initialize their IDs and could not be reliably
used with the decal actor.
- Fixed: Decals on moving polyobjects were not interpolated. R_RenderDecal()
now uses the decal's LeftDistance to calculate its visible location, so it
always stays in sync with the wall's vertices. This also lets me dump some
code from the polyobjects that maintained the decals' (x, y) coordinates.
Also, the decals' x and y information is redundant and can be removed.
Doing this revealed a bug with slider decals and horizontal sliding:
That is, it didn't work at all. I have opted to simply remove the horizontal
sliding support so that I don't have to worry about what happens when a
decal slides across the edge of a wall.
- Fixed: DBaseDecal::LeftDistance was calculated as a 30.2 fixed point number.
It should be 2.30 fixed point.
April 12, 2006 (Changes by Graf Zahl)
- Fixed: SAVEVER was still 231 although MINSAVEVER was 232.
- Fixed: Decal spreading used an incorrect z-coordinate. It has to use

View File

@ -47,7 +47,7 @@
FDecalLib DecalLibrary;
static int ReadScale ();
static fixed_t ReadScale ();
static TArray<BYTE> DecalTranslations;
extern TArray<char*> DecalNames;
@ -90,7 +90,7 @@ struct FDecalAnimator
{
FDecalAnimator (const char *name);
virtual ~FDecalAnimator ();
virtual DThinker *CreateThinker (DBaseDecal *actor) const = 0;
virtual DThinker *CreateThinker (DBaseDecal *actor, side_t *wall) const = 0;
char *Name;
};
@ -122,7 +122,7 @@ void DDecalThinker::Serialize (FArchive &arc)
struct FDecalFaderAnim : public FDecalAnimator
{
FDecalFaderAnim (const char *name) : FDecalAnimator (name) {}
DThinker *CreateThinker (DBaseDecal *actor) const;
DThinker *CreateThinker (DBaseDecal *actor, side_t *wall) const;
int DecayStart;
int DecayTime;
@ -146,7 +146,7 @@ private:
struct FDecalColorerAnim : public FDecalAnimator
{
FDecalColorerAnim (const char *name) : FDecalAnimator (name) {}
DThinker *CreateThinker (DBaseDecal *actor) const;
DThinker *CreateThinker (DBaseDecal *actor, side_t *wall) const;
int DecayStart;
int DecayTime;
@ -172,11 +172,11 @@ private:
struct FDecalStretcherAnim : public FDecalAnimator
{
FDecalStretcherAnim (const char *name) : FDecalAnimator (name) {}
DThinker *CreateThinker (DBaseDecal *actor) const;
DThinker *CreateThinker (DBaseDecal *actor, side_t *wall) const;
int StretchStart;
int StretchTime;
int GoalX, GoalY;
fixed_t GoalX, GoalY;
};
class DDecalStretcher : public DDecalThinker
@ -189,10 +189,10 @@ public:
int TimeToStart;
int TimeToStop;
BYTE GoalX;
BYTE StartX;
BYTE GoalY;
BYTE StartY;
fixed_t GoalX;
fixed_t StartX;
fixed_t GoalY;
fixed_t StartY;
bool bStretchX;
bool bStretchY;
bool bStarted;
@ -203,11 +203,11 @@ private:
struct FDecalSliderAnim : public FDecalAnimator
{
FDecalSliderAnim (const char *name) : FDecalAnimator (name) {}
DThinker *CreateThinker (DBaseDecal *actor) const;
DThinker *CreateThinker (DBaseDecal *actor, side_t *wall) const;
int SlideStart;
int SlideTime;
fixed_t DistX, DistY;
fixed_t /*DistX,*/ DistY;
};
class DDecalSlider : public DDecalThinker
@ -220,7 +220,7 @@ public:
int TimeToStart;
int TimeToStop;
fixed_t DistX;
/* fixed_t DistX; */
fixed_t DistY;
fixed_t StartX;
fixed_t StartY;
@ -232,7 +232,7 @@ private:
struct FDecalCombinerAnim : public FDecalAnimator
{
FDecalCombinerAnim (const char *name) : FDecalAnimator (name) {}
DThinker *CreateThinker (DBaseDecal *actor) const;
DThinker *CreateThinker (DBaseDecal *actor, side_t *wall) const;
int FirstAnimator;
int NumAnimators;
@ -328,7 +328,7 @@ void FDecalLib::DelTree (FDecalBase *root)
void FDecalLib::ReadAllDecals ()
{
int lump, lastlump = 0;
size_t i;
unsigned int i;
while ((lump = Wads.FindLump ("DECALDEF", &lastlump)) != -1)
{
@ -432,7 +432,7 @@ void FDecalLib::ParseDecal ()
memset (&newdecal, 0, sizeof(newdecal));
newdecal.PicNum = 0xffff;
newdecal.ScaleX = newdecal.ScaleY = 63;
newdecal.ScaleX = newdecal.ScaleY = FRACUNIT;
newdecal.RenderFlags = RF_WALLSPRITE;
newdecal.RenderStyle = STYLE_Normal;
newdecal.Alpha = 0x8000;
@ -555,6 +555,7 @@ void FDecalLib::ParseDecalGroup ()
if (SC_Compare ("}"))
{
group->Name = copystring (groupName);
group->SpawnID = decalNum;
AddDecal (group);
break;
}
@ -652,7 +653,7 @@ void FDecalLib::ParseFader ()
void FDecalLib::ParseStretcher ()
{
char stretcherName[64];
int goalX = -1, goalY = -1;
fixed_t goalX = -1, goalY = -1;
int startTime = 0, takeTime = 0;
SC_MustGetString ();
@ -715,12 +716,12 @@ void FDecalLib::ParseSlider ()
SC_MustGetString ();
if (SC_Compare ("}"))
{
if ((distX | distY) != 0)
if ((/*distX |*/ distY) != 0)
{
FDecalSliderAnim *slider = new FDecalSliderAnim (sliderName);
slider->SlideStart = startTime;
slider->SlideTime = takeTime;
slider->DistX = distX;
/*slider->DistX = distX;*/
slider->DistY = distY;
Animators.Push (slider);
}
@ -740,6 +741,7 @@ void FDecalLib::ParseSlider ()
{
SC_MustGetFloat ();
distX = (fixed_t)(sc_Float * FRACUNIT);
Printf ("DistX in slider decal %s is unsupported\n", sliderName);
}
else if (SC_Compare ("DistY"))
{
@ -994,28 +996,28 @@ FDecalBase::~FDecalBase ()
delete[] Name;
}
void FDecalTemplate::ApplyToDecal (DBaseDecal *actor) const
void FDecalTemplate::ApplyToDecal (DBaseDecal *decal, side_t *wall) const
{
if (RenderStyle == STYLE_Shaded)
{
actor->SetShade (ShadeColor);
decal->SetShade (ShadeColor);
}
actor->Translation = Translation;
actor->XScale = ScaleX;
actor->YScale = ScaleY;
actor->PicNum = PicNum;
actor->Alpha = Alpha << 1;
actor->RenderStyle = RenderStyle;
actor->RenderFlags = (RenderFlags & ~(DECAL_RandomFlipX|DECAL_RandomFlipY)) |
(actor->RenderFlags & (RF_RELMASK|RF_CLIPMASK|RF_INVISIBLE|RF_ONESIDED));
decal->Translation = Translation;
decal->ScaleX = ScaleX;
decal->ScaleY = ScaleY;
decal->PicNum = PicNum;
decal->Alpha = Alpha << 1;
decal->RenderStyle = RenderStyle;
decal->RenderFlags = (RenderFlags & ~(DECAL_RandomFlipX|DECAL_RandomFlipY)) |
(decal->RenderFlags & (RF_RELMASK|RF_CLIPMASK|RF_INVISIBLE|RF_ONESIDED));
if (RenderFlags & (DECAL_RandomFlipX|DECAL_RandomFlipY))
{
actor->RenderFlags ^= pr_decal() &
decal->RenderFlags ^= pr_decal() &
((RenderFlags & (DECAL_RandomFlipX|DECAL_RandomFlipY)) >> 8);
}
if (Animator != NULL)
{
Animator->CreateThinker (actor);
Animator->CreateThinker (decal, wall);
}
}
@ -1152,7 +1154,7 @@ void DDecalFader::Tick ()
}
}
DThinker *FDecalFaderAnim::CreateThinker (DBaseDecal *actor) const
DThinker *FDecalFaderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const
{
DDecalFader *fader = new DDecalFader (actor);
@ -1178,7 +1180,7 @@ void DDecalStretcher::Serialize (FArchive &arc)
<< bStarted;
}
DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor) const
DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const
{
DDecalStretcher *thinker = new DDecalStretcher (actor);
@ -1221,11 +1223,11 @@ void DDecalStretcher::Tick ()
{
if (bStretchX)
{
TheDecal->XScale = GoalX;
TheDecal->ScaleX = GoalX;
}
if (bStretchY)
{
TheDecal->YScale = GoalY;
TheDecal->ScaleY = GoalY;
}
Destroy ();
return;
@ -1233,19 +1235,19 @@ void DDecalStretcher::Tick ()
if (!bStarted)
{
bStarted = true;
StartX = TheDecal->XScale;
StartY = TheDecal->YScale;
StartX = TheDecal->ScaleX;
StartY = TheDecal->ScaleY;
}
int distance = level.maptime - TimeToStart;
int maxDistance = TimeToStop - TimeToStart;
if (bStretchX)
{
TheDecal->XScale = StartX + Scale (GoalX - StartX, distance, maxDistance);
TheDecal->ScaleX = StartX + Scale (GoalX - StartX, distance, maxDistance);
}
if (bStretchY)
{
TheDecal->YScale = StartY + Scale (GoalY - StartY, distance, maxDistance);
TheDecal->ScaleY = StartY + Scale (GoalY - StartY, distance, maxDistance);
}
}
@ -1256,20 +1258,20 @@ void DDecalSlider::Serialize (FArchive &arc)
Super::Serialize (arc);
arc << TimeToStart
<< TimeToStop
<< DistX
/*<< DistX*/
<< DistY
<< StartX
/*<< StartX*/
<< StartY
<< bStarted;
}
DThinker *FDecalSliderAnim::CreateThinker (DBaseDecal *actor) const
DThinker *FDecalSliderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const
{
DDecalSlider *thinker = new DDecalSlider (actor);
thinker->TimeToStart = level.maptime + SlideStart;
thinker->TimeToStop = thinker->TimeToStart + SlideTime;
thinker->DistX = DistX;
/*thinker->DistX = DistX;*/
thinker->DistY = DistY;
thinker->bStarted = false;
return thinker;
@ -1289,30 +1291,30 @@ void DDecalSlider::Tick ()
if (!bStarted)
{
bStarted = true;
StartX = TheDecal->x;
StartY = TheDecal->z;
/*StartX = TheDecal->LeftDistance;*/
StartY = TheDecal->Z;
}
if (level.maptime >= TimeToStop)
{
TheDecal->x = StartX + DistX;
TheDecal->z = StartY + DistY;
/*TheDecal->LeftDistance = StartX + DistX;*/
TheDecal->Z = StartY + DistY;
Destroy ();
return;
}
int distance = level.maptime - TimeToStart;
int maxDistance = TimeToStop - TimeToStart;
TheDecal->x = StartX + Scale (DistX, distance, maxDistance);
TheDecal->z = StartY + Scale (DistY, distance, maxDistance);
/*TheDecal->LeftDistance = StartX + Scale (DistX, distance, maxDistance);*/
TheDecal->Z = StartY + Scale (DistY, distance, maxDistance);
}
DThinker *FDecalCombinerAnim::CreateThinker (DBaseDecal *actor) const
DThinker *FDecalCombinerAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const
{
DThinker *thinker = NULL;
for (int i = 0; i < NumAnimators; ++i)
{
thinker = AnimatorList[FirstAnimator+i]->CreateThinker (actor);
thinker = AnimatorList[FirstAnimator+i]->CreateThinker (actor, wall);
}
return thinker;
}
@ -1380,7 +1382,7 @@ void DDecalColorer::Tick ()
}
}
DThinker *FDecalColorerAnim::CreateThinker (DBaseDecal *actor) const
DThinker *FDecalColorerAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const
{
DDecalColorer *Colorer = new DDecalColorer (actor);
@ -1391,8 +1393,8 @@ DThinker *FDecalColorerAnim::CreateThinker (DBaseDecal *actor) const
return Colorer;
}
static int ReadScale ()
static fixed_t ReadScale ()
{
SC_MustGetFloat ();
return clamp ((int)(sc_Float * 64.f), 1, 256) - 1;
return fixed_t(clamp (sc_Float * FRACUNIT, 256.f, 256.f*FRACUNIT));
}

View File

@ -44,6 +44,7 @@ class FDecalTemplate;
struct FDecalAnimator;
struct TypeInfo;
class DBaseDecal;
struct side_s;
class FDecalBase
{
@ -67,12 +68,12 @@ class FDecalTemplate : public FDecalBase
public:
FDecalTemplate () : Translation (0) {}
void ApplyToDecal (DBaseDecal *actor) const;
void ApplyToDecal (DBaseDecal *actor, side_s *wall) const;
const FDecalTemplate *GetDecal () const;
fixed_t ScaleX, ScaleY;
DWORD ShadeColor;
WORD Translation;
BYTE ScaleX, ScaleY;
BYTE RenderStyle;
WORD PicNum;
WORD RenderFlags;

View File

@ -170,6 +170,26 @@ void DThinker::PostBeginPlay ()
{
}
DThinker *DThinker::FirstThinker (int statnum)
{
Node *node;
if ((unsigned)statnum > MAX_STATNUM)
{
statnum = MAX_STATNUM;
}
node = Thinkers[statnum].Head;
if (node->Succ == NULL)
{
node = FreshThinkers[statnum].Head;
if (node->Succ == NULL)
{
return NULL;
}
}
return static_cast<DThinker *>(node);
}
void DThinker::ChangeStatNum (int statnum)
{
if ((unsigned)statnum > MAX_STATNUM)

View File

@ -68,6 +68,8 @@ public:
static void DestroyMostThinkers ();
static void SerializeAll (FArchive &arc, bool keepPlayers);
static DThinker *FirstThinker (int statnum);
private:
static void DestroyThinkersInList (Node *first);
static void DestroyMostThinkersInList (List &list, int stat);

View File

@ -49,8 +49,6 @@ static const FDecalTemplate *SpreadTemplate;
static TArray<side_t *> SpreadStack;
static int ImpactCount;
static DImpactDecal *FirstImpact; // (but not the Second or Third Impact :-)
static DImpactDecal *LastImpact;
CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE)
@ -62,33 +60,38 @@ IMPLEMENT_CLASS (DImpactDecal)
DBaseDecal::DBaseDecal ()
: DThinker(STAT_DECAL),
WallNext(0), WallPrev(0), x(0), y(0), z(0), AlphaColor(0), Translation(0), PicNum(0xFFFF),
RenderFlags(0), XScale(8), YScale(8), RenderStyle(0), LeftDistance(0), Alpha(0)
WallNext(0), WallPrev(0), LeftDistance(0), Z(0), ScaleX(FRACUNIT), ScaleY(FRACUNIT), Alpha(FRACUNIT),
AlphaColor(0), Translation(0), PicNum(0xFFFF), RenderFlags(0), RenderStyle(0)
{
}
DBaseDecal::DBaseDecal (fixed_t x, fixed_t y, fixed_t z)
DBaseDecal::DBaseDecal (fixed_t z)
: DThinker(STAT_DECAL),
WallNext(0), WallPrev(0), x(x), y(y), z(z), AlphaColor(0), Translation(0), PicNum(0xFFFF),
RenderFlags(0), XScale(8), YScale(8), RenderStyle(0), LeftDistance(0), Alpha(0)
WallNext(0), WallPrev(0), LeftDistance(0), Z(z), ScaleX(FRACUNIT), ScaleY(FRACUNIT), Alpha(FRACUNIT),
AlphaColor(0), Translation(0), PicNum(0xFFFF), RenderFlags(0), RenderStyle(0)
{
}
DBaseDecal::DBaseDecal (int statnum, fixed_t z)
: DThinker(statnum),
WallNext(0), WallPrev(0), LeftDistance(0), Z(z), ScaleX(FRACUNIT), ScaleY(FRACUNIT), Alpha(FRACUNIT),
AlphaColor(0), Translation(0), PicNum(0xFFFF), RenderFlags(0), RenderStyle(0)
{
}
DBaseDecal::DBaseDecal (const AActor *basis)
: DThinker(STAT_DECAL),
WallNext(0), WallPrev(0), x(basis->x), y(basis->y), z(basis->z), AlphaColor(basis->alphacolor),
Translation(basis->Translation), PicNum(basis->picnum), RenderFlags(basis->renderflags),
XScale(basis->xscale), YScale(basis->yscale), RenderStyle(basis->RenderStyle), LeftDistance(0),
Alpha(basis->alpha)
WallNext(0), WallPrev(0), LeftDistance(0), Z(basis->z), ScaleX(basis->xscale<<10), ScaleY(basis->yscale<<10),
Alpha(basis->alpha), AlphaColor(basis->alphacolor), Translation(basis->Translation), PicNum(basis->picnum),
RenderFlags(basis->renderflags), RenderStyle(basis->RenderStyle)
{
}
DBaseDecal::DBaseDecal (const DBaseDecal *basis)
: DThinker(STAT_DECAL),
WallNext(0), WallPrev(0), x(basis->x), y(basis->y), z(basis->z), AlphaColor(basis->AlphaColor),
Translation(basis->Translation), PicNum(basis->PicNum), RenderFlags(basis->RenderFlags),
XScale(basis->XScale), YScale(basis->YScale), RenderStyle(basis->RenderStyle), LeftDistance(0),
Alpha(basis->Alpha)
WallNext(0), WallPrev(0), LeftDistance(basis->LeftDistance), Z(basis->Z), ScaleX(basis->ScaleX),
ScaleY(basis->ScaleY), Alpha(basis->Alpha), AlphaColor(basis->AlphaColor), Translation(basis->Translation),
PicNum(basis->PicNum), RenderFlags(basis->RenderFlags), RenderStyle(basis->RenderStyle)
{
}
@ -111,15 +114,15 @@ void DBaseDecal::Remove ()
void DBaseDecal::Serialize (FArchive &arc)
{
Super::Serialize (arc);
arc << x << y << z
arc << LeftDistance
<< Z
<< ScaleX << ScaleY
<< Alpha
<< AlphaColor
<< Translation
<< PicNum
<< RenderFlags
<< XScale << YScale
<< RenderStyle
<< LeftDistance
<< Alpha;
<< RenderStyle;
}
void DBaseDecal::SerializeChain (FArchive &arc, DBaseDecal **first)
@ -159,19 +162,8 @@ void DBaseDecal::SerializeChain (FArchive &arc, DBaseDecal **first)
}
}
void DBaseDecal::MoveChain (DBaseDecal *first, fixed_t x, fixed_t y)
void DBaseDecal::GetXY (side_t *wall, fixed_t &ox, fixed_t &oy) const
{
while (first != NULL)
{
first->x += x;
first->y += y;
first = (DBaseDecal *)first->WallNext;
}
}
void DBaseDecal::FixForSide (side_t *wall)
{
DBaseDecal *decal = wall->AttachedDecals;
line_t *line = &lines[wall->linenum];
DWORD wallnum = DWORD(wall - sides);
vertex_t *v1, *v2;
@ -190,12 +182,8 @@ void DBaseDecal::FixForSide (side_t *wall)
fixed_t dx = v2->x - v1->x;
fixed_t dy = v2->y - v1->y;
while (decal != NULL)
{
decal->x = v1->x + MulScale2 (decal->LeftDistance, dx);
decal->y = v1->y + MulScale2 (decal->LeftDistance, dy);
decal = decal->WallNext;
}
ox = v1->x + MulScale30 (LeftDistance, dx);
oy = v1->y + MulScale30 (LeftDistance, dy);
}
void DBaseDecal::SetShade (DWORD rgb)
@ -210,7 +198,7 @@ void DBaseDecal::SetShade (int r, int g, int b)
}
// Returns the texture the decal stuck to.
int DBaseDecal::StickToWall (side_t *wall)
int DBaseDecal::StickToWall (side_t *wall, fixed_t x, fixed_t y)
{
// Stick the decal at the end of the chain so it appears on top
DBaseDecal *next, **prev;
@ -251,31 +239,31 @@ int DBaseDecal::StickToWall (side_t *wall)
{
RenderFlags |= RF_RELMID;
if (line->flags & ML_DONTPEGBOTTOM)
z -= front->floortexz;
Z -= front->floortexz;
else
z -= front->ceilingtexz;
Z -= front->ceilingtexz;
tex = wall->midtexture;
}
else if (back->floorplane.ZatPoint (x, y) >= z)
else if (back->floorplane.ZatPoint (x, y) >= Z)
{
RenderFlags |= RF_RELLOWER|RF_CLIPLOWER;
if (line->flags & ML_DONTPEGBOTTOM)
z -= front->ceilingtexz;
Z -= front->ceilingtexz;
else
z -= back->floortexz;
Z -= back->floortexz;
tex = wall->bottomtexture;
}
else
{
RenderFlags |= RF_RELUPPER|RF_CLIPUPPER;
if (line->flags & ML_DONTPEGTOP)
z -= front->ceilingtexz;
Z -= front->ceilingtexz;
else
z -= back->ceilingtexz;
Z -= back->ceilingtexz;
tex = wall->toptexture;
}
CalcFracPos (wall);
CalcFracPos (wall, x, y);
return tex;
}
@ -303,38 +291,38 @@ fixed_t DBaseDecal::GetRealZ (const side_t *wall) const
switch (RenderFlags & RF_RELMASK)
{
default:
return z;
return Z;
case RF_RELUPPER:
if (curline->linedef->flags & ML_DONTPEGTOP)
{
return z + front->ceilingtexz;
return Z + front->ceilingtexz;
}
else
{
return z + back->ceilingtexz;
return Z + back->ceilingtexz;
}
case RF_RELLOWER:
if (curline->linedef->flags & ML_DONTPEGBOTTOM)
{
return z + front->ceilingtexz;
return Z + front->ceilingtexz;
}
else
{
return z + back->floortexz;
return Z + back->floortexz;
}
case RF_RELMID:
if (curline->linedef->flags & ML_DONTPEGBOTTOM)
{
return z + front->floortexz;
return Z + front->floortexz;
}
else
{
return z + front->ceilingtexz;
return Z + front->ceilingtexz;
}
}
}
void DBaseDecal::CalcFracPos (side_t *wall)
void DBaseDecal::CalcFracPos (side_t *wall, fixed_t x, fixed_t y)
{
line_t *line = &lines[wall->linenum];
DWORD wallnum = DWORD(wall - sides);
@ -356,11 +344,11 @@ void DBaseDecal::CalcFracPos (side_t *wall)
if (abs(dx) > abs(dy))
{
LeftDistance = SafeDivScale2 (x - v1->x, dx);
LeftDistance = SafeDivScale30 (x - v1->x, dx);
}
else if (dy != 0)
{
LeftDistance = SafeDivScale2 (y - v1->y, dy);
LeftDistance = SafeDivScale30 (y - v1->y, dy);
}
else
{
@ -493,12 +481,11 @@ void DBaseDecal::SpreadRight (fixed_t r, side_t *feelwall, fixed_t wallsize)
}
}
void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, fixed_t spread_z)
void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, fixed_t x, fixed_t y, fixed_t z)
{
FTexture *tex;
vertex_t *v1;
fixed_t rorg, ldx, ldy;
int xscale, yscale;
GetWallStuff (wall, v1, ldx, ldy);
rorg = Length (x - v1->x, y - v1->y);
@ -506,16 +493,12 @@ void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, fixed_t spread
tex = TexMan[PicNum];
int dwidth = tex->GetWidth ();
xscale = (XScale + 1) << (FRACBITS - 6);
yscale = (YScale + 1) << (FRACBITS - 6);
DecalWidth = dwidth * xscale;
DecalLeft = tex->LeftOffset * xscale;
DecalWidth = dwidth * ScaleX;
DecalLeft = tex->LeftOffset * ScaleX;
DecalRight = DecalWidth - DecalLeft;
SpreadSource = this;
SpreadTemplate = tpl;
SpreadZ = spread_z;
SpreadZ = z;
// Try spreading left first
SpreadLeft (rorg - DecalLeft, v1, wall);
@ -529,11 +512,11 @@ void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, fixed_t spread
DBaseDecal *DBaseDecal::CloneSelf (const FDecalTemplate *tpl, fixed_t ix, fixed_t iy, fixed_t iz, side_t *wall) const
{
DBaseDecal *decal = new DBaseDecal(ix, iy, iz);
DBaseDecal *decal = new DBaseDecal(iz);
if (decal != NULL)
{
decal->StickToWall (wall);
tpl->ApplyToDecal (decal);
decal->StickToWall (wall, ix, iy);
tpl->ApplyToDecal (decal, wall);
decal->AlphaColor = AlphaColor;
decal->RenderFlags = (decal->RenderFlags & RF_DECALMASK) |
(this->RenderFlags & ~RF_DECALMASK);
@ -551,7 +534,11 @@ CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE)
{
while (ImpactCount > self)
{
FirstImpact->Destroy ();
DThinker *thinker = DThinker::FirstThinker (STAT_AUTODECAL);
if (thinker != NULL)
{
thinker->Destroy();
}
}
}
}
@ -570,7 +557,6 @@ void DImpactDecal::SerializeTime (FArchive &arc)
if (arc.IsLoading ())
{
ImpactCount = 0;
FirstImpact = LastImpact = NULL;
}
}
@ -580,31 +566,27 @@ void DImpactDecal::Serialize (FArchive &arc)
}
DImpactDecal::DImpactDecal ()
: ImpactNext(0), ImpactPrev(0)
{
Link();
ChangeStatNum (STAT_AUTODECAL);
ImpactCount++;
}
DImpactDecal::DImpactDecal (fixed_t x, fixed_t y, fixed_t z)
: DBaseDecal (x, y, z),
ImpactNext(0), ImpactPrev(0)
{
Link();
}
void DImpactDecal::Link ()
DImpactDecal::DImpactDecal (fixed_t z)
: DBaseDecal (STAT_AUTODECAL, z)
{
ImpactCount++;
ImpactPrev = LastImpact;
if (ImpactPrev != NULL)
}
void DImpactDecal::CheckMax ()
{
if (ImpactCount >= cl_maxdecals)
{
ImpactPrev->ImpactNext = this;
DThinker *thinker = DThinker::FirstThinker (STAT_AUTODECAL);
if (thinker != NULL)
{
thinker->Destroy();
}
}
else
{
FirstImpact = this;
}
LastImpact = this;
}
DImpactDecal *DImpactDecal::StaticCreate (const char *name, fixed_t x, fixed_t y, fixed_t z, side_t *wall, PalEntry color)
@ -630,14 +612,10 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, fixed_t x,
{
StaticCreate (tpl->LowerDecal->GetDecal(), x, y, z, wall);
}
if (ImpactCount >= cl_maxdecals)
{
FirstImpact->Destroy ();
}
DImpactDecal::CheckMax();
decal = new DImpactDecal (z);
decal = new DImpactDecal (x, y, z);
int stickypic = decal->StickToWall (wall);
int stickypic = decal->StickToWall (wall, x, y);
FTexture *tex = TexMan[stickypic];
if (tex != NULL && tex->bNoDecals)
@ -650,7 +628,7 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, fixed_t x,
return NULL;
}
tpl->ApplyToDecal (decal);
tpl->ApplyToDecal (decal, wall);
if (color != 0)
{
decal->SetShade (color.r, color.g, color.b);
@ -662,22 +640,19 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, fixed_t x,
}
// Spread decal to nearby walls if it does not all fit on this one
decal->Spread (tpl, wall, z);
decal->Spread (tpl, wall, x, y, z);
}
return decal;
}
DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, fixed_t ix, fixed_t iy, fixed_t iz, side_t *wall) const
{
if (ImpactCount >= cl_maxdecals)
{
FirstImpact->Destroy ();
}
DImpactDecal *decal = new DImpactDecal(ix, iy, iz);
DImpactDecal::CheckMax();
DImpactDecal *decal = new DImpactDecal(iz);
if (decal != NULL)
{
decal->StickToWall (wall);
tpl->ApplyToDecal (decal);
decal->StickToWall (wall, ix, iy);
tpl->ApplyToDecal (decal, wall);
decal->AlphaColor = AlphaColor;
decal->RenderFlags = (decal->RenderFlags & RF_DECALMASK) |
(this->RenderFlags & ~RF_DECALMASK);
@ -687,23 +662,6 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, fixed_t ix, fixe
void DImpactDecal::Destroy ()
{
if (ImpactPrev != NULL)
{
ImpactPrev->ImpactNext = ImpactNext;
}
if (ImpactNext != NULL)
{
ImpactNext->ImpactPrev = ImpactPrev;
}
if (LastImpact == this)
{
LastImpact = ImpactPrev;
}
if (FirstImpact == this)
{
FirstImpact = ImpactNext;
}
ImpactCount--;
Super::Destroy ();
}
@ -715,7 +673,7 @@ CCMD (countdecals)
CCMD (countdecalsreal)
{
TThinkerIterator<DImpactDecal> iterator (STAT_DECAL);
TThinkerIterator<DImpactDecal> iterator (STAT_AUTODECAL);
int count = 0;
while (iterator.Next())
@ -760,7 +718,6 @@ class ADecal : public AActor
DECLARE_STATELESS_ACTOR (ADecal, AActor);
public:
void BeginPlay ();
bool DoTrace (DBaseDecal *decal, angle_t angle, sector_t *sec);
};
IMPLEMENT_STATELESS_ACTOR (ADecal, Any, 9200, 0)
@ -768,47 +725,45 @@ END_DEFAULTS
void ADecal::BeginPlay ()
{
const FDecalTemplate *tpl;
FTraceResults trace;
DBaseDecal *decal;
side_t *wall;
Super::BeginPlay ();
// Find a wall to attach to, and set RenderFlags to keep
// the decal at its current height. If the decal cannot find a wall
// within 64 units, it destroys itself.
//
// Subclasses can set special1 if they don't want this sticky logic.
DBaseDecal *decal = new DBaseDecal (this);
if (!DoTrace (decal, angle, Sector))
// If no decal is specified, don't try to create one.
if (args[0] != 0 && (tpl = DecalLibrary.GetDecalByNum (args[0])) != 0)
{
decal->Destroy();
return;
}
// Look for a wall within 64 units behind the actor. If none can be
// found, then no decal is created, and this actor is destroyed
// without effectively doing anything.
Trace (x, y, z, Sector,
finecosine[(angle+ANGLE_180)>>ANGLETOFINESHIFT],
finesine[(angle+ANGLE_180)>>ANGLETOFINESHIFT], 0,
64*FRACUNIT, 0, 0, NULL, trace, TRACE_NoSky);
if (args[0] != 0)
{
const FDecalTemplate *tpl = DecalLibrary.GetDecalByNum (args[0]);
if (tpl != NULL)
if (trace.HitType == TRACE_HitWall)
{
tpl->ApplyToDecal (decal);
decal = new DBaseDecal (this);
wall = sides + trace.Line->sidenum[trace.Side];
decal->StickToWall (wall, trace.X, trace.Y);
tpl->ApplyToDecal (decal, wall);
// Spread decal to nearby walls if it does not all fit on this one
if (cl_spreaddecals)
{
decal->Spread (tpl, wall, trace.X, trace.Y, z);
}
}
else
{
DPrintf ("Could not find a wall to stick decal to at (%ld,%ld)\n", x>>FRACBITS, y>>FRACBITS);
}
}
}
bool ADecal::DoTrace (DBaseDecal *decal, angle_t angle, sector_t *sec)
{
FTraceResults trace;
Trace (x, y, z, sec,
finecosine[(angle+ANGLE_180)>>ANGLETOFINESHIFT],
finesine[(angle+ANGLE_180)>>ANGLETOFINESHIFT], 0,
64*FRACUNIT, 0, 0, NULL, trace, TRACE_NoSky);
if (trace.HitType == TRACE_HitWall)
else
{
decal->x = trace.X;
decal->y = trace.Y;
decal->StickToWall (sides + trace.Line->sidenum[trace.Side]);
return true;
DPrintf ("Decal actor at (%ld,%ld) does not have a good template\n", x>>FRACBITS, y>>FRACBITS);
}
return false;
// This actor doesn't need to stick around anymore.
Destroy();
}

View File

@ -28,7 +28,7 @@ struct Keygroup
bool check(AActor * owner)
{
for(size_t i=0;i<anykeylist.Size();i++)
for(unsigned int i=0;i<anykeylist.Size();i++)
{
if (anykeylist[i].check(owner)) return true;
}
@ -52,7 +52,7 @@ struct Lock
~Lock()
{
for(size_t i=0;i<keylist.Size();i++) delete keylist[i];
for(unsigned int i=0;i<keylist.Size();i++) delete keylist[i];
keylist.Clear();
if (message) delete [] message;
if (remotemsg) delete [] remotemsg;
@ -71,7 +71,7 @@ struct Lock
}
}
}
else for(size_t i=0;i<keylist.Size();i++)
else for(unsigned int i=0;i<keylist.Size();i++)
{
if (!keylist[i]->check(owner)) return false;
}

View File

@ -55,37 +55,37 @@ class DBaseDecal : public DThinker
DECLARE_CLASS (DBaseDecal, DThinker)
public:
DBaseDecal ();
DBaseDecal (fixed_t x, fixed_t y, fixed_t z);
DBaseDecal (fixed_t z);
DBaseDecal (int statnum, fixed_t z);
DBaseDecal (const AActor *actor);
DBaseDecal (const DBaseDecal *basis);
void Serialize (FArchive &arc);
void Destroy ();
int StickToWall (side_s *wall);
int StickToWall (side_s *wall, fixed_t x, fixed_t y);
fixed_t GetRealZ (const side_s *wall) const;
void SetShade (DWORD rgb);
void SetShade (int r, int g, int b);
void Spread (const FDecalTemplate *tpl, side_s *wall, fixed_t spread_z);
void Spread (const FDecalTemplate *tpl, side_s *wall, fixed_t x, fixed_t y, fixed_t z);
void GetXY (side_s *side, fixed_t &x, fixed_t &y) const;
static void SerializeChain (FArchive &arc, DBaseDecal **firstptr);
static void MoveChain (DBaseDecal *first, fixed_t x, fixed_t y);
static void FixForSide (side_s *side);
DBaseDecal *WallNext, **WallPrev;
fixed_t x, y, z;
fixed_t LeftDistance;
fixed_t Z;
fixed_t ScaleX, ScaleY;
fixed_t Alpha;
DWORD AlphaColor;
WORD Translation;
WORD PicNum;
WORD RenderFlags;
BYTE XScale, YScale;
BYTE RenderStyle;
fixed_t LeftDistance;
fixed_t Alpha;
protected:
virtual DBaseDecal *CloneSelf (const FDecalTemplate *tpl, fixed_t x, fixed_t y, fixed_t z, side_s *wall) const;
void CalcFracPos (side_s *wall);
void CalcFracPos (side_s *wall, fixed_t x, fixed_t y);
void Remove ();
static void SpreadLeft (fixed_t r, vertex_s *v1, side_s *feelwall);
@ -96,7 +96,7 @@ class DImpactDecal : public DBaseDecal
{
DECLARE_CLASS (DImpactDecal, DBaseDecal)
public:
DImpactDecal (fixed_t x, fixed_t y, fixed_t z);
DImpactDecal (fixed_t z);
DImpactDecal (side_s *wall, const FDecalTemplate *templ);
static DImpactDecal *StaticCreate (const char *name, fixed_t x, fixed_t y, fixed_t z, side_s *wall, PalEntry color=0);
@ -108,14 +108,12 @@ public:
void Serialize (FArchive &arc);
static void SerializeTime (FArchive &arc);
DImpactDecal *ImpactNext, *ImpactPrev;
protected:
DBaseDecal *CloneSelf (const FDecalTemplate *tpl, fixed_t x, fixed_t y, fixed_t z, side_s *wall) const;
static void CheckMax ();
private:
DImpactDecal();
void Link();
};
class AWaterSplashBase : public AActor

View File

@ -820,10 +820,6 @@ void DoMovePolyobj (polyobj_t *po, int x, int y)
linedef->bbox[BOXBOTTOM] += y;
linedef->bbox[BOXLEFT] += x;
linedef->bbox[BOXRIGHT] += x;
if (linedef->sidenum[0] != NO_SIDE)
DBaseDecal::MoveChain (sides[linedef->sidenum[0]].AttachedDecals, x, y);
if (linedef->sidenum[1] != NO_SIDE)
DBaseDecal::MoveChain (sides[linedef->sidenum[1]].AttachedDecals, x, y);
linedef->validcount = validcount;
}
for (veryTempSeg = po->segs; veryTempSeg != segList; veryTempSeg++)
@ -908,12 +904,7 @@ BOOL PO_RotatePolyobj (int num, angle_t angle)
if ((*segList)->linedef->validcount != validcount)
{
UpdateSegBBox(*segList);
line_t *line = (*segList)->linedef;
if (line->sidenum[0] != NO_SIDE)
DBaseDecal::FixForSide (&sides[line->sidenum[0]]);
if (line->sidenum[1] != NO_SIDE)
DBaseDecal::FixForSide (&sides[line->sidenum[1]]);
line->validcount = validcount;
(*segList)->linedef->validcount = validcount;
}
}
if (blocked)
@ -932,12 +923,7 @@ BOOL PO_RotatePolyobj (int num, angle_t angle)
if ((*segList)->linedef->validcount != validcount)
{
UpdateSegBBox(*segList);
line_t *line = (*segList)->linedef;
if (line->sidenum[0] != NO_SIDE)
DBaseDecal::FixForSide (&sides[line->sidenum[0]]);
if (line->sidenum[1] != NO_SIDE)
DBaseDecal::FixForSide (&sides[line->sidenum[1]]);
line->validcount = validcount;
(*segList)->linedef->validcount = validcount;
}
}
LinkPolyobj(po);

View File

@ -124,7 +124,7 @@ FTexture *rw_pic;
static short *maskedtexturecol;
static FTexture *WallSpriteTile;
static void R_RenderDecal (DBaseDecal *first, drawseg_t *clipper, int pass);
static void R_RenderDecal (side_t *wall, DBaseDecal *first, drawseg_t *clipper, int pass);
static void WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Span *spans));
//=============================================================================
@ -1336,7 +1336,7 @@ void R_StoreWallRange (int start, int stop)
// [RH] Draw any decals bound to the seg
for (DBaseDecal *decal = curline->sidedef->AttachedDecals; decal != NULL; decal = decal->WallNext)
{
R_RenderDecal (decal, ds_p, 0);
R_RenderDecal (curline->sidedef, decal, ds_p, 0);
}
ds_p++;
@ -1766,11 +1766,11 @@ void PrepLWall (fixed_t *lwall, fixed_t walxrepeat)
// = 1: drawing masked textures (including sprites)
// Currently, only pass = 0 is done or used
static void R_RenderDecal (DBaseDecal *decal, drawseg_t *clipper, int pass)
static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper, int pass)
{
fixed_t lx, ly, lx2, ly2;
fixed_t lx, ly, lx2, ly2, decalx, decaly;
int x1, x2;
int xscale, yscale;
fixed_t xscale, yscale;
fixed_t topoff;
byte flipx;
fixed_t zpos;
@ -1781,47 +1781,47 @@ static void R_RenderDecal (DBaseDecal *decal, drawseg_t *clipper, int pass)
return;
// Determine actor z
zpos = decal->z;
zpos = decal->Z;
front = curline->frontsector;
back = (curline->backsector != NULL) ? curline->backsector : curline->frontsector;
switch (decal->RenderFlags & RF_RELMASK)
{
default:
zpos = decal->z;
zpos = decal->Z;
break;
case RF_RELUPPER:
if (curline->linedef->flags & ML_DONTPEGTOP)
{
zpos = decal->z + front->ceilingtexz;
zpos = decal->Z + front->ceilingtexz;
}
else
{
zpos = decal->z + back->ceilingtexz;
zpos = decal->Z + back->ceilingtexz;
}
break;
case RF_RELLOWER:
if (curline->linedef->flags & ML_DONTPEGBOTTOM)
{
zpos = decal->z + front->ceilingtexz;
zpos = decal->Z + front->ceilingtexz;
}
else
{
zpos = decal->z + back->floortexz;
zpos = decal->Z + back->floortexz;
}
break;
case RF_RELMID:
if (curline->linedef->flags & ML_DONTPEGBOTTOM)
{
zpos = decal->z + front->floortexz;
zpos = decal->Z + front->floortexz;
}
else
{
zpos = decal->z + front->ceilingtexz;
zpos = decal->Z + front->ceilingtexz;
}
}
xscale = decal->XScale + 1;
yscale = decal->YScale + 1;
xscale = decal->ScaleX;
yscale = decal->ScaleY;
WallSpriteTile = TexMan(decal->PicNum);
flipx = decal->RenderFlags & RF_XFLIP;
@ -1842,11 +1842,13 @@ static void R_RenderDecal (DBaseDecal *decal, drawseg_t *clipper, int pass)
x1 *= xscale;
x2 *= xscale;
decal->GetXY (wall, decalx, decaly);
angle_t ang = R_PointToAngle2 (curline->v1->x, curline->v1->y, curline->v2->x, curline->v2->y) >> ANGLETOFINESHIFT;
lx = decal->x - MulScale6 (x1, finecosine[ang]) - viewx;
lx2 = decal->x + MulScale6 (x2, finecosine[ang]) - viewx;
ly = decal->y - MulScale6 (x1, finesine[ang]) - viewy;
ly2 = decal->y + MulScale6 (x2, finesine[ang]) - viewy;
lx = decalx - FixedMul (x1, finecosine[ang]) - viewx;
lx2 = decalx + FixedMul (x2, finecosine[ang]) - viewx;
ly = decaly - FixedMul (x1, finesine[ang]) - viewy;
ly2 = decaly + FixedMul (x2, finesine[ang]) - viewy;
WallTX1 = DMulScale20 (lx, viewsin, -ly, viewcos);
WallTX2 = DMulScale20 (lx2, viewsin, -ly2, viewcos);
@ -1974,10 +1976,7 @@ static void R_RenderDecal (DBaseDecal *decal, drawseg_t *clipper, int pass)
}
topoff = WallSpriteTile->TopOffset << FRACBITS;
dc_texturemid = topoff + SafeDivScale6 (zpos - viewz, yscale);
// Scale the texture size
rw_scalestep = MulScale6 (rw_scalestep, yscale);
dc_texturemid = topoff + FixedDiv (zpos - viewz, yscale);
// Clip sprite to drawseg
if (x1 < clipper->x1)
@ -2035,7 +2034,8 @@ static void R_RenderDecal (DBaseDecal *decal, drawseg_t *clipper, int pass)
sprflipvert = false;
}
rw_offset = 16*FRACUNIT/yscale;
// rw_offset is used as the texture's vertical scale
rw_offset = SafeDivScale30(1, yscale);
do
{

View File

@ -531,7 +531,7 @@ int S_DupPlayerSound (const char *pclass, int gender, int refid, int aliasref)
static void S_ClearSoundData()
{
size_t i;
unsigned int i;
S_sfx.Clear();

View File

@ -40,6 +40,7 @@ enum
{ // Thinkers that don't actually think
STAT_INFO, // An info queue
STAT_DECAL, // A decal
STAT_AUTODECAL, // A decal that can be automatically deleted
STAT_CORPSEPOINTER, // An entry in Hexen's corpse queue
STAT_TRAVELLING, // An actor temporarily travelling to a new map

View File

@ -91,8 +91,8 @@ inline char * MS_Strdup(const char * s)
//==========================================================================
// [RH] Keep GCC quiet by not using offsetof on Actor types.
#define DEFINE_FLAG(prefix, name, type, variable) { prefix##_##name, #name, (int)&((type*)1)->variable - 1 }
#define DEFINE_FLAG2(symbol, name, type, variable) { symbol, #name, (int)&((type*)1)->variable - 1 }
#define DEFINE_FLAG(prefix, name, type, variable) { prefix##_##name, #name, (int)(size_t)&((type*)1)->variable - 1 }
#define DEFINE_FLAG2(symbol, name, type, variable) { symbol, #name, (int)(size_t)&((type*)1)->variable - 1 }
struct flagdef
{
@ -3344,7 +3344,7 @@ static const ActorProps *is_actorprop (const char *str)
//==========================================================================
void FinishThingdef()
{
size_t i;
unsigned int i;
for (i = 0;i < TypeInfo::m_RuntimeActors.Size(); i++)
{

View File

@ -558,7 +558,7 @@ void WI_LoadBackground(bool isenterpic)
void WI_updateAnimatedBack()
{
size_t i;
unsigned int i;
for(i=0;i<anims.Size();i++)
{
@ -593,7 +593,7 @@ void WI_updateAnimatedBack()
void WI_drawBackground()
{
size_t i;
unsigned int i;
int animwidth=320; // For a flat fill or clear background scale animations to 320x200
int animheight=200;
@ -841,7 +841,7 @@ void WI_drawEL ()
int WI_MapToIndex (char *map)
{
size_t i;
unsigned int i;
for (i = 0; i < lnodes.Size(); i++)
{
@ -1089,7 +1089,7 @@ void WI_updateShowNextLoc ()
void WI_drawShowNextLoc(void)
{
size_t i;
unsigned int i;
WI_drawBackground();

View File

@ -181,7 +181,7 @@ bool FCDThread::Init ()
return false;
CD_Window = CreateWindow (
(LPCTSTR)(int)CD_WindowAtom,
(LPCTSTR)(INT_PTR)(int)CD_WindowAtom,
"ZDoom CD Player",
0,
0, 0, 10, 10,
@ -192,7 +192,7 @@ bool FCDThread::Init ()
if (CD_Window == NULL)
{
UnregisterClass ((LPCTSTR)(int)CD_WindowAtom, g_hInst);
UnregisterClass ((LPCTSTR)(INT_PTR)(int)CD_WindowAtom, g_hInst);
CD_WindowAtom = 0;
return false;
}
@ -217,7 +217,7 @@ void FCDThread::Deinit ()
}
if (CD_WindowAtom)
{
UnregisterClass ((LPCTSTR)(int)CD_WindowAtom, g_hInst);
UnregisterClass ((LPCTSTR)(INT_PTR)(int)CD_WindowAtom, g_hInst);
CD_WindowAtom = 0;
}
if (DeviceID)