- first batch of routing all write access to sectortype::ceilingz and floorz through a function interface.

We need this for implementing "precise" rendering to flag vertices as dirty.
This commit is contained in:
Christoph Oelckers 2021-12-27 22:32:26 +01:00
parent c24aafd3d6
commit 059412b75e
15 changed files with 158 additions and 99 deletions

View file

@ -63,8 +63,8 @@ void Set(int index, int type, double val)
int old; int old;
switch(type) switch(type)
{ {
case Interp_Sect_Floorz: sector[index].floorz = xs_CRoundToInt(val); break; case Interp_Sect_Floorz: sector[index].setfloorz(xs_CRoundToInt(val)); break;
case Interp_Sect_Ceilingz: sector[index].ceilingz = xs_CRoundToInt(val); break; case Interp_Sect_Ceilingz: sector[index].setceilingz(xs_CRoundToInt(val)); break;
case Interp_Sect_Floorheinum: sector[index].floorheinum = (short)xs_CRoundToInt(val); break; case Interp_Sect_Floorheinum: sector[index].floorheinum = (short)xs_CRoundToInt(val); break;
case Interp_Sect_Ceilingheinum: sector[index].ceilingheinum = (short)xs_CRoundToInt(val); break; case Interp_Sect_Ceilingheinum: sector[index].ceilingheinum = (short)xs_CRoundToInt(val); break;
case Interp_Sect_FloorPanX: sector[index].floorxpan_ = float(val); break; case Interp_Sect_FloorPanX: sector[index].floorxpan_ = float(val); break;

View file

@ -98,8 +98,8 @@ static void ReadSectorV7(FileReader& fr, sectortype& sect)
{ {
sect.wallptr = fr.ReadInt16(); sect.wallptr = fr.ReadInt16();
sect.wallnum = fr.ReadInt16(); sect.wallnum = fr.ReadInt16();
sect.ceilingz = fr.ReadInt32(); sect.setceilingz(fr.ReadInt32());
sect.floorz = fr.ReadInt32(); sect.setfloorz(fr.ReadInt32());
sect.ceilingstat = ESectorFlags::FromInt(fr.ReadUInt16()); sect.ceilingstat = ESectorFlags::FromInt(fr.ReadUInt16());
sect.floorstat = ESectorFlags::FromInt(fr.ReadUInt16()); sect.floorstat = ESectorFlags::FromInt(fr.ReadUInt16());
sect.ceilingpicnum = fr.ReadUInt16(); sect.ceilingpicnum = fr.ReadUInt16();
@ -129,8 +129,8 @@ static void ReadSectorV6(FileReader& fr, sectortype& sect)
sect.floorpicnum = fr.ReadUInt16(); sect.floorpicnum = fr.ReadUInt16();
sect.ceilingheinum = clamp(fr.ReadInt16() << 5, -32768, 32767); sect.ceilingheinum = clamp(fr.ReadInt16() << 5, -32768, 32767);
sect.floorheinum = clamp(fr.ReadInt16() << 5, -32768, 32767); sect.floorheinum = clamp(fr.ReadInt16() << 5, -32768, 32767);
sect.ceilingz = fr.ReadInt32(); sect.setceilingz(fr.ReadInt32());
sect.floorz = fr.ReadInt32(); sect.setfloorz(fr.ReadInt32());
sect.ceilingshade = fr.ReadInt8(); sect.ceilingshade = fr.ReadInt8();
sect.floorshade = fr.ReadInt8(); sect.floorshade = fr.ReadInt8();
sect.ceilingxpan_ = fr.ReadUInt8(); sect.ceilingxpan_ = fr.ReadUInt8();
@ -156,8 +156,8 @@ static void ReadSectorV5(FileReader& fr, sectortype& sect)
sect.floorpicnum = fr.ReadUInt16(); sect.floorpicnum = fr.ReadUInt16();
sect.ceilingheinum = clamp(fr.ReadInt16() << 5, -32768, 32767); sect.ceilingheinum = clamp(fr.ReadInt16() << 5, -32768, 32767);
sect.floorheinum = clamp(fr.ReadInt16() << 5, -32768, 32767); sect.floorheinum = clamp(fr.ReadInt16() << 5, -32768, 32767);
sect.ceilingz = fr.ReadInt32(); sect.setceilingz(fr.ReadInt32());
sect.floorz = fr.ReadInt32(); sect.setfloorz(fr.ReadInt32());
sect.ceilingshade = fr.ReadInt8(); sect.ceilingshade = fr.ReadInt8();
sect.floorshade = fr.ReadInt8(); sect.floorshade = fr.ReadInt8();
sect.ceilingxpan_ = fr.ReadUInt8(); sect.ceilingxpan_ = fr.ReadUInt8();

View file

@ -184,6 +184,9 @@ END_BLD_NS
class DCoreActor; class DCoreActor;
struct walltype; struct walltype;
// enable for running a compile-check to ensure that renderer-critical variables are not being written to directly.
//#define SECTOR_HACKJOB
//============================================================================= //=============================================================================
// //
// internal sector struct - no longer identical with on-disk format // internal sector struct - no longer identical with on-disk format
@ -192,12 +195,58 @@ struct walltype;
struct sectortype struct sectortype
{ {
// Fields were reordered by size, some also enlarged. // Fields were reordered by size, some also enlarged.
DCoreActor* firstEntry, * lastEntry; DCoreActor* firstEntry, * lastEntry;
int32_t wallptr; int32_t wallptr;
#ifdef SECTOR_HACKJOB
// Debug hack job for finding all places where ceilingz and floorz get written to.
// If the engine does not compile with this block on, we got a problem.
// Since this is only for compile verification there's no need to provide a working implementation.
const int32_t ceilingz;
const int32_t floorz;
sectortype(int a = 0, int b = 0) : ceilingz(a), floorz(b) {}
void setceilingz(int cc, bool temp = false) {}
void setfloorz(int cc, bool temp = false) {}
void addceilingz(int cc, bool temp = false) {}
void addfloorz(int cc, bool temp = false) {}
int32_t* ceilingzptr(bool temp = false) { return nullptr; }
int32_t* floorzptr(bool temp = false) { return nullptr; }
#else
// Do not change directly!
int32_t ceilingz; int32_t ceilingz;
int32_t floorz; int32_t floorz;
void setceilingz(int cc, bool temp = false)
{
ceilingz = cc;
}
void setfloorz(int cc, bool temp = false)
{
floorz = cc;
}
void addceilingz(int cc, bool temp = false)
{
ceilingz += cc;
}
void addfloorz(int cc, bool temp = false)
{
floorz += cc;
}
int32_t* ceilingzptr(bool temp = false)
{
return &ceilingz;
}
int32_t* floorzptr(bool temp = false)
{
return &floorz;
}
#endif
// panning byte fields were promoted to full floats to enable panning interpolation. // panning byte fields were promoted to full floats to enable panning interpolation.
float ceilingxpan_; float ceilingxpan_;

View file

@ -180,7 +180,7 @@ public:
HWSkyInfo * sky; // for normal sky HWSkyInfo * sky; // for normal sky
//HWHorizonInfo * horizon; // for horizon information //HWHorizonInfo * horizon; // for horizon information
PortalDesc * portal; // stacked sector portals PortalDesc * portal; // stacked sector portals
int * planemirror; // for plane mirrors const int * planemirror; // for plane mirrors
spritetype* teleport; // SW's teleport-views spritetype* teleport; // SW's teleport-views
}; };

View file

@ -512,8 +512,10 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sectortype &c, sectort
("lastentry", c.lastEntry) ("lastentry", c.lastEntry)
("wallptr", c.wallptr, def->wallptr) ("wallptr", c.wallptr, def->wallptr)
("wallnum", c.wallnum, def->wallnum) ("wallnum", c.wallnum, def->wallnum)
#ifndef SECTOR_HACKJOB //
("ceilingz", c.ceilingz, def->ceilingz) ("ceilingz", c.ceilingz, def->ceilingz)
("floorz", c.floorz, def->floorz) ("floorz", c.floorz, def->floorz)
#endif
("ceilingstat", c.ceilingstat, def->ceilingstat) ("ceilingstat", c.ceilingstat, def->ceilingstat)
("floorstat", c.floorstat, def->floorstat) ("floorstat", c.floorstat, def->floorstat)
("ceilingpicnum", c.ceilingpicnum, def->ceilingpicnum) ("ceilingpicnum", c.ceilingpicnum, def->ceilingpicnum)

View file

@ -379,7 +379,11 @@ bool SectionGeometry::ValidateSection(Section* section, int plane)
section->dirty &= ~EDirty::CeilingDirty; section->dirty &= ~EDirty::CeilingDirty;
} }
#ifdef SECTOR_HACKJOB
memcpy(compare, sec, sizeof(*sec));
#else
*compare = *sec; *compare = *sec;
#endif
sdata.poscompare[plane] = sec->firstWall()->pos; sdata.poscompare[plane] = sec->firstWall()->pos;
sdata.poscompare2[plane] = sec->firstWall()->point2Wall()->pos; sdata.poscompare2[plane] = sec->firstWall()->point2Wall()->pos;
return false; return false;
@ -435,7 +439,8 @@ void SectionGeometry::CreatePlaneMesh(Section* section, int plane, const FVector
auto& sdata = data[section->index]; auto& sdata = data[section->index];
auto& entry = sdata.planes[plane]; auto& entry = sdata.planes[plane];
int fz = sectorp->floorz, cz = sectorp->ceilingz; int fz = sectorp->floorz, cz = sectorp->ceilingz;
sectorp->floorz = sectorp->ceilingz = 0; sectorp->setfloorz(0, true);
sectorp->setceilingz(0, true);
UVCalculator uvcalc(sectorp, plane, texture, offset); UVCalculator uvcalc(sectorp, plane, texture, offset);
@ -453,8 +458,8 @@ void SectionGeometry::CreatePlaneMesh(Section* section, int plane, const FVector
tc = uvcalc.GetUV(int(pt.X * 16.), int(pt.Y * -16.), pt.Z); tc = uvcalc.GetUV(int(pt.X * 16.), int(pt.Y * -16.), pt.Z);
} }
entry.normal = CalcNormal(sectorp, plane); entry.normal = CalcNormal(sectorp, plane);
sectorp->floorz = fz; sectorp->setfloorz(fz, true);
sectorp->ceilingz = cz; sectorp->setceilingz(cz, true);
} }
//========================================================================== //==========================================================================

View file

@ -71,14 +71,14 @@ void SE40_Draw(int tag, spritetype *spr, int x, int y, int z, binangle a, fixedh
if (k == tag + 0) if (k == tag + 0)
{ {
sect->Flag = sect->floorz; sect->Flag = sect->floorz;
sect->floorz += (((z - sect->floorz) / 32768) + 1) * 32768; sect->addfloorz((((z - sect->floorz) / 32768) + 1) * 32768, true);
sect->Damage = sect->floorpicnum; sect->Damage = sect->floorpicnum;
sect->floorpicnum = 13; sect->floorpicnum = 13;
} }
if (k == tag + 1) if (k == tag + 1)
{ {
sect->Flag = sect->ceilingz; sect->Flag = sect->ceilingz;
sect->ceilingz += (((z - sect->ceilingz) / 32768) - 1) * 32768; sect->addceilingz((((z - sect->ceilingz) / 32768) - 1) * 32768, true);
sect->Damage = sect->ceilingpicnum; sect->Damage = sect->ceilingpicnum;
sect->ceilingpicnum = 13; sect->ceilingpicnum = 13;
} }
@ -103,12 +103,12 @@ void SE40_Draw(int tag, spritetype *spr, int x, int y, int z, binangle a, fixedh
auto sect = act->spr.sector(); auto sect = act->spr.sector();
if (k == tag + 0) if (k == tag + 0)
{ {
sect->floorz = sect->Flag; sect->setfloorz(sect->Flag, true);
sect->floorpicnum = sect->Damage; sect->floorpicnum = sect->Damage;
} }
if (k == tag + 1) if (k == tag + 1)
{ {
sect->ceilingz = sect->Flag; sect->setceilingz(sect->Flag, true);
sect->ceilingpicnum = sect->Damage; sect->ceilingpicnum = sect->Damage;
} }
}// end if }// end if

View file

@ -1094,12 +1094,12 @@ void movetouchplate(DDukeActor* actor, int plate)
{ {
if (x >= actor->temp_data[2]) if (x >= actor->temp_data[2])
{ {
sectp->floorz = x; sectp->setfloorz(x);
actor->temp_data[1] = 0; actor->temp_data[1] = 0;
} }
else else
{ {
sectp->floorz += sectp->extra; sectp->addfloorz(sectp->extra);
p = checkcursectnums(actor->spr.sector()); p = checkcursectnums(actor->spr.sector());
if (p >= 0) ps[p].pos.Z += sectp->extra; if (p >= 0) ps[p].pos.Z += sectp->extra;
} }
@ -1108,12 +1108,12 @@ void movetouchplate(DDukeActor* actor, int plate)
{ {
if (x <= actor->spr.pos.Z) if (x <= actor->spr.pos.Z)
{ {
sectp->floorz = actor->spr.pos.Z; sectp->setfloorz(actor->spr.pos.Z);
actor->temp_data[1] = 0; actor->temp_data[1] = 0;
} }
else else
{ {
sectp->floorz -= sectp->extra; sectp->addfloorz(-sectp->extra);
p = checkcursectnums(actor->spr.sector()); p = checkcursectnums(actor->spr.sector());
if (p >= 0) if (p >= 0)
ps[p].pos.Z -= sectp->extra; ps[p].pos.Z -= sectp->extra;
@ -2613,18 +2613,18 @@ void handle_se00(DDukeActor* actor, int LASERLINE)
if (sect->floorz > actor->spr.pos.Z) //z's are touching if (sect->floorz > actor->spr.pos.Z) //z's are touching
{ {
sect->floorz -= 512; sect->addfloorz(-512);
zchange = -512; zchange = -512;
if (sect->floorz < actor->spr.pos.Z) if (sect->floorz < actor->spr.pos.Z)
sect->floorz = actor->spr.pos.Z; sect->setfloorz(actor->spr.pos.Z);
} }
else if (sect->floorz < actor->spr.pos.Z) //z's are touching else if (sect->floorz < actor->spr.pos.Z) //z's are touching
{ {
sect->floorz += 512; sect->addfloorz(512);
zchange = 512; zchange = 512;
if (sect->floorz > actor->spr.pos.Z) if (sect->floorz > actor->spr.pos.Z)
sect->floorz = actor->spr.pos.Z; sect->setfloorz(actor->spr.pos.Z);
} }
} }
else if (actor->spr.extra == 3) else if (actor->spr.extra == 3)
@ -2641,18 +2641,18 @@ void handle_se00(DDukeActor* actor, int LASERLINE)
if (sect->floorz > actor->temp_data[3]) //z's are touching if (sect->floorz > actor->temp_data[3]) //z's are touching
{ {
sect->floorz -= 512; sect->addfloorz(-512);
zchange = -512; zchange = -512;
if (sect->floorz < actor->temp_data[3]) if (sect->floorz < actor->temp_data[3])
sect->floorz = actor->temp_data[3]; sect->setfloorz(actor->temp_data[3]);
} }
else if (sect->floorz < actor->temp_data[3]) //z's are touching else if (sect->floorz < actor->temp_data[3]) //z's are touching
{ {
sect->floorz += 512; sect->addfloorz(512);
zchange = 512; zchange = 512;
if (sect->floorz > actor->temp_data[3]) if (sect->floorz > actor->temp_data[3])
sect->floorz = actor->temp_data[3]; sect->setfloorz(actor->temp_data[3]);
} }
} }
@ -3396,8 +3396,8 @@ void handle_se05(DDukeActor* actor, int FIRELASER)
} }
actor->spr.pos.Z += actor->spr.zvel; actor->spr.pos.Z += actor->spr.zvel;
sc->ceilingz += actor->spr.zvel; sc->addceilingz(actor->spr.zvel);
actor->temp_sect->ceilingz += actor->spr.zvel; actor->temp_sect->addceilingz(actor->spr.zvel);
ms(actor); ms(actor);
SetActor(actor, actor->spr.pos); SetActor(actor, actor->spr.pos);
} }
@ -3682,24 +3682,24 @@ void handle_se13(DDukeActor* actor)
if (actor->spriteextra) if (actor->spriteextra)
{ {
if (abs(actor->temp_data[0] - sc->ceilingz) >= j) if (abs(actor->temp_data[0] - sc->ceilingz) >= j)
sc->ceilingz += Sgn(actor->temp_data[0] - sc->ceilingz) * j; sc->addceilingz(Sgn(actor->temp_data[0] - sc->ceilingz) * j);
else sc->ceilingz = actor->temp_data[0]; else sc->setceilingz(actor->temp_data[0]);
} }
else else
{ {
if (abs(actor->temp_data[1] - sc->floorz) >= j) if (abs(actor->temp_data[1] - sc->floorz) >= j)
sc->floorz += Sgn(actor->temp_data[1] - sc->floorz) * j; sc->addfloorz(Sgn(actor->temp_data[1] - sc->floorz) * j);
else sc->floorz = actor->temp_data[1]; else sc->setfloorz(actor->temp_data[1]);
} }
} }
else else
{ {
if (abs(actor->temp_data[1] - sc->floorz) >= j) if (abs(actor->temp_data[1] - sc->floorz) >= j)
sc->floorz += Sgn(actor->temp_data[1] - sc->floorz) * j; sc->addfloorz(Sgn(actor->temp_data[1] - sc->floorz) * j);
else sc->floorz = actor->temp_data[1]; else sc->setfloorz(actor->temp_data[1]);
if (abs(actor->temp_data[0] - sc->ceilingz) >= j) if (abs(actor->temp_data[0] - sc->ceilingz) >= j)
sc->ceilingz += Sgn(actor->temp_data[0] - sc->ceilingz) * j; sc->addceilingz(Sgn(actor->temp_data[0] - sc->ceilingz) * j);
sc->ceilingz = actor->temp_data[0]; sc->setceilingz(actor->temp_data[0]);
} }
if (actor->temp_data[3] == 1) if (actor->temp_data[3] == 1)
@ -3810,8 +3810,8 @@ void handle_se16(DDukeActor* actor, int REACTOR, int REACTOR2)
else actor->spr.shade = 1; else actor->spr.shade = 1;
} }
if (actor->spr.shade) sc->ceilingz += 1024; if (actor->spr.shade) sc->addceilingz(1024);
else sc->ceilingz -= 512; else sc->addceilingz(-512);
ms(actor); ms(actor);
SetActor(actor, actor->spr.pos); SetActor(actor, actor->spr.pos);
@ -3830,8 +3830,8 @@ void handle_se17(DDukeActor* actor)
int q = actor->temp_data[0] * (actor->spr.yvel << 2); int q = actor->temp_data[0] * (actor->spr.yvel << 2);
sc->ceilingz += q; sc->addceilingz(q);
sc->floorz += q; sc->addfloorz(q);
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto act1 = it.Next()) while (auto act1 = it.Next())
@ -3944,17 +3944,17 @@ void handle_se18(DDukeActor *actor, bool morecheck)
{ {
if (actor->spr.ang == 512) if (actor->spr.ang == 512)
{ {
sc->ceilingz -= sc->extra; sc->addceilingz(-sc->extra);
if (sc->ceilingz <= actor->temp_data[1]) if (sc->ceilingz <= actor->temp_data[1])
{ {
sc->ceilingz = actor->temp_data[1]; sc->setceilingz(actor->temp_data[1]);
deletesprite(actor); deletesprite(actor);
return; return;
} }
} }
else else
{ {
sc->floorz += sc->extra; sc->addfloorz(sc->extra);
if (morecheck) if (morecheck)
{ {
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
@ -3971,7 +3971,7 @@ void handle_se18(DDukeActor *actor, bool morecheck)
} }
if (sc->floorz >= actor->temp_data[1]) if (sc->floorz >= actor->temp_data[1])
{ {
sc->floorz = actor->temp_data[1]; sc->setfloorz(actor->temp_data[1]);
deletesprite(actor); deletesprite(actor);
return; return;
} }
@ -3981,17 +3981,17 @@ void handle_se18(DDukeActor *actor, bool morecheck)
{ {
if (actor->spr.ang == 512) if (actor->spr.ang == 512)
{ {
sc->ceilingz += sc->extra; sc->addceilingz(sc->extra);
if (sc->ceilingz >= actor->spr.pos.Z) if (sc->ceilingz >= actor->spr.pos.Z)
{ {
sc->ceilingz = actor->spr.pos.Z; sc->setceilingz(actor->spr.pos.Z);
deletesprite(actor); deletesprite(actor);
return; return;
} }
} }
else else
{ {
sc->floorz -= sc->extra; sc->addfloorz(-sc->extra);
if (morecheck) if (morecheck)
{ {
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
@ -4008,7 +4008,7 @@ void handle_se18(DDukeActor *actor, bool morecheck)
} }
if (sc->floorz <= actor->spr.pos.Z) if (sc->floorz <= actor->spr.pos.Z)
{ {
sc->floorz = actor->spr.pos.Z; sc->setfloorz(actor->spr.pos.Z);
deletesprite(actor); deletesprite(actor);
return; return;
} }
@ -4057,10 +4057,10 @@ void handle_se19(DDukeActor *actor, int BIGFORCE)
} }
if (sc->ceilingz < sc->floorz) if (sc->ceilingz < sc->floorz)
sc->ceilingz += actor->spr.yvel; sc->addceilingz(actor->spr.yvel);
else else
{ {
sc->ceilingz = sc->floorz; sc->setceilingz(sc->floorz);
DukeStatIterator it(STAT_EFFECTOR); DukeStatIterator it(STAT_EFFECTOR);
while (auto a2 = it.Next()) while (auto a2 = it.Next())
@ -4204,9 +4204,9 @@ void handle_se21(DDukeActor* actor)
if (actor->temp_data[0] == 0) return; if (actor->temp_data[0] == 0) return;
if (actor->spr.ang == 1536) if (actor->spr.ang == 1536)
lp = &sc->ceilingz; lp = sc->ceilingzptr();
else else
lp = &sc->floorz; lp = sc->floorzptr();
if (actor->temp_data[0] == 1) //Decide if the sector should go up or down if (actor->temp_data[0] == 1) //Decide if the sector should go up or down
{ {
@ -4239,7 +4239,7 @@ void handle_se22(DDukeActor* actor)
if (actor->temp_data[1]) if (actor->temp_data[1])
{ {
if (getanimationgoal(anim_ceilingz, actor->temp_sect) >= 0) if (getanimationgoal(anim_ceilingz, actor->temp_sect) >= 0)
sc->ceilingz += sc->extra * 9; sc->addceilingz(sc->extra * 9);
else actor->temp_data[1] = 0; else actor->temp_data[1] = 0;
} }
} }
@ -4264,11 +4264,11 @@ void handle_se26(DDukeActor* actor)
{ {
actor->spr.pos.X = actor->temp_data[3]; actor->spr.pos.X = actor->temp_data[3];
actor->spr.pos.Y = actor->temp_data[4]; actor->spr.pos.Y = actor->temp_data[4];
sc->floorz -= ((actor->spr.zvel * actor->spr.shade) - actor->spr.zvel); sc->addfloorz(-((actor->spr.zvel * actor->spr.shade) - actor->spr.zvel));
actor->spr.shade = 0; actor->spr.shade = 0;
} }
else else
sc->floorz += actor->spr.zvel; sc->addfloorz(actor->spr.zvel);
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto a2 = it.Next()) while (auto a2 = it.Next())
@ -4447,20 +4447,20 @@ void handle_se25(DDukeActor* actor, int t_index, int snd1, int snd2)
if (actor->spr.shade) if (actor->spr.shade)
{ {
sec->ceilingz += actor->spr.yvel << 4; sec->addceilingz(actor->spr.yvel << 4);
if (sec->ceilingz > sec->floorz) if (sec->ceilingz > sec->floorz)
{ {
sec->ceilingz = sec->floorz; sec->setceilingz(sec->floorz);
if (pistonsound && snd1 >= 0) if (pistonsound && snd1 >= 0)
S_PlayActorSound(snd1, actor); S_PlayActorSound(snd1, actor);
} }
} }
else else
{ {
sec->ceilingz -= actor->spr.yvel << 4; sec->addceilingz(-actor->spr.yvel << 4);
if (sec->ceilingz < actor->temp_data[t_index]) if (sec->ceilingz < actor->temp_data[t_index])
{ {
sec->ceilingz = actor->temp_data[t_index]; sec->setceilingz(actor->temp_data[t_index]);
if (pistonsound && snd2 >= 0) if (pistonsound && snd2 >= 0)
S_PlayActorSound(snd2, actor); S_PlayActorSound(snd2, actor);
} }
@ -4487,23 +4487,23 @@ void handle_se32(DDukeActor *actor)
{ {
if (abs(sc->ceilingz - actor->spr.pos.Z) < (actor->spr.yvel << 1)) if (abs(sc->ceilingz - actor->spr.pos.Z) < (actor->spr.yvel << 1))
{ {
sc->ceilingz = actor->spr.pos.Z; sc->setceilingz(actor->spr.pos.Z);
callsound(actor->spr.sector(), actor); callsound(actor->spr.sector(), actor);
actor->temp_data[2] = 0; actor->temp_data[2] = 0;
actor->temp_data[0] = 0; actor->temp_data[0] = 0;
} }
else sc->ceilingz += Sgn(actor->spr.pos.Z - sc->ceilingz) * actor->spr.yvel; else sc->addceilingz(Sgn(actor->spr.pos.Z - sc->ceilingz) * actor->spr.yvel);
} }
else else
{ {
if (abs(sc->ceilingz - actor->temp_data[1]) < (actor->spr.yvel << 1)) if (abs(sc->ceilingz - actor->temp_data[1]) < (actor->spr.yvel << 1))
{ {
sc->ceilingz = actor->temp_data[1]; sc->setceilingz(actor->temp_data[1]);
callsound(actor->spr.sector(), actor); callsound(actor->spr.sector(), actor);
actor->temp_data[2] = 0; actor->temp_data[2] = 0;
actor->temp_data[0] = 0; actor->temp_data[0] = 0;
} }
else sc->ceilingz += Sgn(actor->temp_data[1] - sc->ceilingz) * actor->spr.yvel; else sc->addceilingz((actor->temp_data[1] - sc->ceilingz) * actor->spr.yvel);
} }
return; return;
} }
@ -4515,9 +4515,9 @@ void handle_se32(DDukeActor *actor)
actor->temp_data[0] = 0; actor->temp_data[0] = 0;
actor->temp_data[2] = !actor->temp_data[2]; actor->temp_data[2] = !actor->temp_data[2];
callsound(actor->spr.sector(), actor); callsound(actor->spr.sector(), actor);
sc->ceilingz = actor->spr.pos.Z; sc->setceilingz(actor->spr.pos.Z);
} }
else sc->ceilingz += Sgn(actor->spr.pos.Z - sc->ceilingz) * actor->spr.yvel; else sc->addceilingz(Sgn(actor->spr.pos.Z - sc->ceilingz) * actor->spr.yvel);
} }
else else
{ {
@ -4527,7 +4527,7 @@ void handle_se32(DDukeActor *actor)
actor->temp_data[2] = !actor->temp_data[2]; actor->temp_data[2] = !actor->temp_data[2];
callsound(actor->spr.sector(), actor); callsound(actor->spr.sector(), actor);
} }
else sc->ceilingz -= Sgn(actor->spr.pos.Z - actor->temp_data[1]) * actor->spr.yvel; else sc->addceilingz(-Sgn(actor->spr.pos.Z - actor->temp_data[1]) * actor->spr.yvel);
} }
} }
@ -4561,17 +4561,17 @@ void handle_se35(DDukeActor *actor, int SMALLSMOKE, int EXPLOSION2)
switch (actor->temp_data[0]) switch (actor->temp_data[0])
{ {
case 0: case 0:
sc->ceilingz += actor->spr.yvel; sc->addceilingz(actor->spr.yvel);
if (sc->ceilingz > sc->floorz) if (sc->ceilingz > sc->floorz)
sc->floorz = sc->ceilingz; sc->setfloorz(sc->ceilingz);
if (sc->ceilingz > actor->spr.pos.Z + (32 << 8)) if (sc->ceilingz > actor->spr.pos.Z + (32 << 8))
actor->temp_data[0]++; actor->temp_data[0]++;
break; break;
case 1: case 1:
sc->ceilingz -= (actor->spr.yvel << 2); sc->addceilingz(-(actor->spr.yvel << 2));
if (sc->ceilingz < actor->temp_data[4]) if (sc->ceilingz < actor->temp_data[4])
{ {
sc->ceilingz = actor->temp_data[4]; sc->setceilingz(actor->temp_data[4]);
actor->temp_data[0] = 0; actor->temp_data[0] = 0;
} }
break; break;
@ -4675,7 +4675,7 @@ void handle_se31(DDukeActor* actor, bool choosedir)
{ {
if (abs(sec->floorz - actor->spr.pos.Z) < actor->spr.yvel) if (abs(sec->floorz - actor->spr.pos.Z) < actor->spr.yvel)
{ {
sec->floorz = actor->spr.pos.Z; sec->setfloorz(actor->spr.pos.Z);
actor->temp_data[2] = 0; actor->temp_data[2] = 0;
actor->temp_data[0] = 0; actor->temp_data[0] = 0;
if (choosedir) actor->temp_data[3] = actor->spr.hitag; if (choosedir) actor->temp_data[3] = actor->spr.hitag;
@ -4684,7 +4684,7 @@ void handle_se31(DDukeActor* actor, bool choosedir)
else else
{ {
int l = Sgn(actor->spr.pos.Z - sec->floorz) * actor->spr.yvel; int l = Sgn(actor->spr.pos.Z - sec->floorz) * actor->spr.yvel;
sec->floorz += l; sec->addfloorz(l);
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto a2 = it.Next()) while (auto a2 = it.Next())
@ -4704,7 +4704,7 @@ void handle_se31(DDukeActor* actor, bool choosedir)
{ {
if (abs(sec->floorz - actor->temp_data[1]) < actor->spr.yvel) if (abs(sec->floorz - actor->temp_data[1]) < actor->spr.yvel)
{ {
sec->floorz = actor->temp_data[1]; sec->setfloorz(actor->temp_data[1]);
callsound(actor->spr.sector(), actor); callsound(actor->spr.sector(), actor);
actor->temp_data[2] = 0; actor->temp_data[2] = 0;
actor->temp_data[0] = 0; actor->temp_data[0] = 0;
@ -4713,7 +4713,7 @@ void handle_se31(DDukeActor* actor, bool choosedir)
else else
{ {
int l = Sgn(actor->temp_data[1] - sec->floorz) * actor->spr.yvel; int l = Sgn(actor->temp_data[1] - sec->floorz) * actor->spr.yvel;
sec->floorz += l; sec->addfloorz(l);
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto a2 = it.Next()) while (auto a2 = it.Next())
@ -4744,7 +4744,7 @@ void handle_se31(DDukeActor* actor, bool choosedir)
else else
{ {
int l = Sgn(actor->spr.pos.Z - sec->floorz) * actor->spr.yvel; int l = Sgn(actor->spr.pos.Z - sec->floorz) * actor->spr.yvel;
sec->floorz += l; sec->addfloorz(l);
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto a2 = it.Next()) while (auto a2 = it.Next())
@ -4772,7 +4772,7 @@ void handle_se31(DDukeActor* actor, bool choosedir)
else else
{ {
int l = Sgn(actor->spr.pos.Z - actor->temp_data[1]) * actor->spr.yvel; int l = Sgn(actor->spr.pos.Z - actor->temp_data[1]) * actor->spr.yvel;
sec->floorz -= l; sec->addfloorz(-l);
DukeSectIterator it(actor->sector()); DukeSectIterator it(actor->sector());
while (auto a2 = it.Next()) while (auto a2 = it.Next())

View file

@ -3598,7 +3598,7 @@ void moveeffectors_d(void) //STATNUM 3
case SE_29_WAVES: case SE_29_WAVES:
act->spr.hitag += 64; act->spr.hitag += 64;
l = MulScale(act->spr.yvel, bsin(act->spr.hitag), 12); l = MulScale(act->spr.yvel, bsin(act->spr.hitag), 12);
sc->floorz = act->spr.pos.Z + l; sc->setfloorz(act->spr.pos.Z + l);
break; break;
case SE_31_FLOOR_RISE_FALL: // True Drop Floor case SE_31_FLOOR_RISE_FALL: // True Drop Floor
handle_se31(act, true); handle_se31(act, true);

View file

@ -3560,7 +3560,7 @@ void moveeffectors_r(void) //STATNUM 3
case SE_29_WAVES: case SE_29_WAVES:
act->spr.hitag += 64; act->spr.hitag += 64;
l = MulScale(act->spr.yvel, bsin(act->spr.hitag), 12); l = MulScale(act->spr.yvel, bsin(act->spr.hitag), 12);
sc->floorz = act->spr.pos.Z + l; sc->setfloorz(act->spr.pos.Z + l);
break; break;
case SE_31_FLOOR_RISE_FALL: // True Drop Floor case SE_31_FLOOR_RISE_FALL: // True Drop Floor
@ -4105,8 +4105,8 @@ void destroyit(DDukeActor *actor)
destwal->nextWall()->cstat = 0; destwal->nextWall()->cstat = 0;
} }
} }
destsect->floorz = srcsect->floorz; destsect->setfloorz(srcsect->floorz);
destsect->ceilingz = srcsect->ceilingz; destsect->setceilingz(srcsect->ceilingz);
destsect->ceilingstat = srcsect->ceilingstat; destsect->ceilingstat = srcsect->ceilingstat;
destsect->floorstat = srcsect->floorstat; destsect->floorstat = srcsect->floorstat;
destsect->ceilingpicnum = srcsect->ceilingpicnum; destsect->ceilingpicnum = srcsect->ceilingpicnum;

View file

@ -1069,11 +1069,11 @@ void DoSector(bool bSet, int lVar1, int lLabelID, int lVar2, DDukeActor* sActor,
if (!bSet) SetGameVarID(lVar2, sectp->wallnum, sActor, sPlayer); if (!bSet) SetGameVarID(lVar2, sectp->wallnum, sActor, sPlayer);
break; break;
case SECTOR_CEILINGZ: case SECTOR_CEILINGZ:
if (bSet) sectp->ceilingz = lValue; if (bSet) sectp->setceilingz(lValue);
else SetGameVarID(lVar2, sectp->ceilingz, sActor, sPlayer); else SetGameVarID(lVar2, sectp->ceilingz, sActor, sPlayer);
break; break;
case SECTOR_FLOORZ: case SECTOR_FLOORZ:
if (bSet) sectp->floorz = lValue; if (bSet) sectp->setfloorz(lValue);
else SetGameVarID(lVar2, sectp->floorz, sActor, sPlayer); else SetGameVarID(lVar2, sectp->floorz, sActor, sPlayer);
break; break;
case SECTOR_CEILINGSTAT: case SECTOR_CEILINGSTAT:

View file

@ -283,9 +283,9 @@ int* animateptr(int type, int index, bool write)
switch (type) switch (type)
{ {
case anim_floorz: case anim_floorz:
return &sector[index].floorz; return sector[index].floorzptr(!write);
case anim_ceilingz: case anim_ceilingz:
return &sector[index].ceilingz; return sector[index].ceilingzptr(!write);
case anim_vertexx: case anim_vertexx:
if (write) wall[index].moved(); if (write) wall[index].moved();
return &wall[index].pos.X; return &wall[index].pos.X;
@ -1243,8 +1243,8 @@ void allignwarpelevators(void)
{ {
if ((act2->spr.lotag) == SE_17_WARP_ELEVATOR && act != act2 && act->spr.hitag == act2->spr.hitag) if ((act2->spr.lotag) == SE_17_WARP_ELEVATOR && act != act2 && act->spr.hitag == act2->spr.hitag)
{ {
act2->sector()->floorz = act->sector()->floorz; act2->sector()->setfloorz(act->sector()->floorz);
act2->sector()->ceilingz = act->sector()->ceilingz; act2->sector()->setceilingz(act->sector()->ceilingz);
} }
} }
} }

View file

@ -644,13 +644,13 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
{ {
actor->temp_data[1] = sectp->ceilingz; actor->temp_data[1] = sectp->ceilingz;
if (actor->spr.pal) if (actor->spr.pal)
sectp->ceilingz = actor->spr.pos.Z; sectp->setceilingz(actor->spr.pos.Z);
} }
else else
{ {
actor->temp_data[1] = sectp->floorz; actor->temp_data[1] = sectp->floorz;
if (actor->spr.pal) if (actor->spr.pal)
sectp->floorz = actor->spr.pos.Z; sectp->setfloorz(actor->spr.pos.Z);
} }
actor->spr.hitag <<= 2; actor->spr.hitag <<= 2;
@ -668,11 +668,11 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
else else
actor->temp_data[4] = sectp->ceilingz; actor->temp_data[4] = sectp->ceilingz;
sectp->ceilingz = actor->spr.pos.Z; sectp->setceilingz(actor->spr.pos.Z);
StartInterpolation(sectp, Interp_Sect_Ceilingz); StartInterpolation(sectp, Interp_Sect_Ceilingz);
break; break;
case SE_35: case SE_35:
sectp->ceilingz = actor->spr.pos.Z; sectp->setceilingz(actor->spr.pos.Z);
break; break;
case SE_27_DEMO_CAM: case SE_27_DEMO_CAM:
if (ud.recstat == 1) if (ud.recstat == 1)
@ -702,12 +702,15 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
if (actor->spr.ang == 512) if (actor->spr.ang == 512)
{ {
if (ceiling) if (ceiling)
sectp->ceilingz = actor->spr.pos.Z; sectp->setceilingz(actor->spr.pos.Z);
else else
sectp->floorz = actor->spr.pos.Z; sectp->setfloorz(actor->spr.pos.Z);
} }
else else
sectp->ceilingz = sectp->floorz = actor->spr.pos.Z; {
sectp->setceilingz(actor->spr.pos.Z);
sectp->setfloorz(actor->spr.pos.Z);
}
if (sectp->ceilingstat & CSTAT_SECTOR_SKY) if (sectp->ceilingstat & CSTAT_SECTOR_SKY)
{ {
@ -832,7 +835,7 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
case SE_31_FLOOR_RISE_FALL: case SE_31_FLOOR_RISE_FALL:
actor->temp_data[1] = sectp->floorz; actor->temp_data[1] = sectp->floorz;
// actor->temp_data[2] = actor->spr.hitag; // actor->temp_data[2] = actor->spr.hitag;
if (actor->spr.ang != 1536) sectp->floorz = actor->spr.pos.Z; if (actor->spr.ang != 1536) sectp->setfloorz(actor->spr.pos.Z);
for (auto& wal : wallsofsector(sectp)) for (auto& wal : wallsofsector(sectp))
if (wal.hitag == 0) wal.hitag = 9999; if (wal.hitag == 0) wal.hitag = 9999;
@ -843,7 +846,7 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
case SE_32_CEILING_RISE_FALL: case SE_32_CEILING_RISE_FALL:
actor->temp_data[1] = sectp->ceilingz; actor->temp_data[1] = sectp->ceilingz;
actor->temp_data[2] = actor->spr.hitag; actor->temp_data[2] = actor->spr.hitag;
if (actor->spr.ang != 1536) sectp->ceilingz = actor->spr.pos.Z; if (actor->spr.ang != 1536) sectp->setceilingz(actor->spr.pos.Z);
for (auto& wal : wallsofsector(sectp)) for (auto& wal : wallsofsector(sectp))
if (wal.hitag == 0) wal.hitag = 9999; if (wal.hitag == 0) wal.hitag = 9999;

View file

@ -724,7 +724,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
case TOUCHPLATE: case TOUCHPLATE:
act->temp_data[2] = sectp->floorz; act->temp_data[2] = sectp->floorz;
if (sectp->lotag != 1 && sectp->lotag != 2) if (sectp->lotag != 1 && sectp->lotag != 2)
sectp->floorz = act->spr.pos.Z; sectp->setfloorz(act->spr.pos.Z);
if (!isWorldTour()) if (!isWorldTour())
{ {
if (act->spr.pal && ud.multimode > 1) if (act->spr.pal && ud.multimode > 1)

View file

@ -717,7 +717,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
case TOUCHPLATE: case TOUCHPLATE:
act->temp_data[2] = sectp->floorz; act->temp_data[2] = sectp->floorz;
if (sectp->lotag != 1 && sectp->lotag != 2) if (sectp->lotag != 1 && sectp->lotag != 2)
sectp->floorz = act->spr.pos.Z; sectp->setfloorz(act->spr.pos.Z);
if (act->spr.pal && ud.multimode > 1) if (act->spr.pal && ud.multimode > 1)
{ {
act->spr.xrepeat = act->spr.yrepeat = 0; act->spr.xrepeat = act->spr.yrepeat = 0;