-fix some bugs, handle occurences in recently changed code

This commit is contained in:
Christoph Oelckers 2022-08-09 00:11:21 +02:00
parent 99188b52e9
commit ad9931081e
7 changed files with 52 additions and 26 deletions

View file

@ -616,7 +616,7 @@ CollisionBase clipmove_(vec3_t * const pos, int * const sectnum, int32_t xvect,
case CSTAT_SPRITE_ALIGNMENT_FACING: case CSTAT_SPRITE_ALIGNMENT_FACING:
if (p1.X >= clipMin.X && p1.X <= clipMax.X && p1.Y >= clipMin.Y && p1.Y <= clipMax.Y) if (p1.X >= clipMin.X && p1.X <= clipMax.X && p1.Y >= clipMin.Y && p1.Y <= clipMax.Y)
{ {
int32_t height, daz = int_pos().Z + actor->GetOffsetAndHeight(height); int32_t height, daz = actor->int_pos().Z + actor->GetOffsetAndHeight(height);
if (pos->Z > daz-height-flordist && pos->Z < daz+ceildist) if (pos->Z > daz-height-flordist && pos->Z < daz+ceildist)
{ {
@ -1166,7 +1166,7 @@ void getzrange(const vec3_t& pos, sectortype* sect, int32_t* ceilz, CollisionBas
int32_t k = walldist+(actor->spr.clipdist<<2)+1; int32_t k = walldist+(actor->spr.clipdist<<2)+1;
if ((abs(v1.X-pos.X) <= k) && (abs(v1.Y-pos.Y) <= k)) if ((abs(v1.X-pos.X) <= k) && (abs(v1.Y-pos.Y) <= k))
{ {
daz = int_pos().Z + actor->GetOffsetAndHeight(k); daz = actor->int_pos().Z + actor->GetOffsetAndHeight(k);
daz2 = daz - k; daz2 = daz - k;
clipyou = 1; clipyou = 1;
} }

View file

@ -528,18 +528,18 @@ DEFINE_FIELD_NAMED(DCoreActor, spritesetindex, spritesetpic)
DEFINE_ACTION_FUNCTION(DCoreActor, pos) DEFINE_ACTION_FUNCTION(DCoreActor, pos)
{ {
PARAM_SELF_PROLOGUE(DCoreActor); PARAM_SELF_PROLOGUE(DCoreActor);
ACTION_RETURN_VEC3(DVector3(self->spr.pos.X * (1 / 16.), self->spr.pos.Y * (1 / 16.), self->spr.pos.Z * (1 / 256.))); ACTION_RETURN_VEC3(self->float_pos());
} }
DEFINE_ACTION_FUNCTION(DCoreActor, xy) DEFINE_ACTION_FUNCTION(DCoreActor, xy)
{ {
PARAM_SELF_PROLOGUE(DCoreActor); PARAM_SELF_PROLOGUE(DCoreActor);
ACTION_RETURN_VEC2(DVector2(self->spr.pos.X * (1 / 16.), self->spr.pos.Y * (1 / 16.))); ACTION_RETURN_VEC2(self->float_pos().XY());
} }
double coreactor_z(DCoreActor* self) double coreactor_z(DCoreActor* self)
{ {
return self->spr.zvel * zinttoworld; return self->float_pos().Z;
} }
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, z, coreactor_z) DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, z, coreactor_z)
@ -550,11 +550,9 @@ DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, z, coreactor_z)
void coreactor_setpos(DCoreActor* self, double x, double y, double z, int relink) void coreactor_setpos(DCoreActor* self, double x, double y, double z, int relink)
{ {
self->spr.pos.X = int(x * worldtoint); self->set_float_pos({ x, y, z });
self->spr.pos.Y = int(y * worldtoint);
self->spr.pos.Z = int(z * zworldtoint);
// todo: SW needs to call updatesectorz here or have a separate function. // todo: SW needs to call updatesectorz here or have a separate function.
if (relink) SetActor(self, self->spr.pos); if (relink) SetActor(self, self->int_pos());
} }
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setpos, coreactor_setpos) DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setpos, coreactor_setpos)
@ -571,9 +569,9 @@ DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setpos, coreactor_setpos)
void coreactor_copypos(DCoreActor* self, DCoreActor* other, int relink) void coreactor_copypos(DCoreActor* self, DCoreActor* other, int relink)
{ {
if (!other) return; if (!other) return;
self->spr.pos = other->spr.pos; self->copy_pos(other);
// todo: SW needs to call updatesectorz here or have a separate function. // todo: SW needs to call updatesectorz here or have a separate function.
if (relink) SetActor(self, self->spr.pos); if (relink) SetActor(self, self->int_pos());
} }
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, copypos, coreactor_setpos) DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, copypos, coreactor_setpos)
@ -587,11 +585,9 @@ DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, copypos, coreactor_setpos)
void coreactor_move(DCoreActor* self, double x, double y, double z, int relink) void coreactor_move(DCoreActor* self, double x, double y, double z, int relink)
{ {
self->spr.pos.X += int(x * 16); self->add_float_pos({ x, y, z });
self->spr.pos.Y += int(y * 16);
self->spr.pos.Z += int(z * 256);
// todo: SW needs to call updatesectorz here or have a separate function. // todo: SW needs to call updatesectorz here or have a separate function.
if (relink) SetActor(self, self->spr.pos); if (relink) SetActor(self, self->int_pos());
} }
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, move, coreactor_move) DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, move, coreactor_move)
@ -607,27 +603,27 @@ DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, move, coreactor_move)
void coreactor_setz(DCoreActor* self, double z) void coreactor_setz(DCoreActor* self, double z)
{ {
self->spr.pos.Z = int(z * 256); self->set_float_z(z);
} }
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setz, coreactor_setz) DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setz, coreactor_setz)
{ {
PARAM_SELF_PROLOGUE(DCoreActor); PARAM_SELF_PROLOGUE(DCoreActor);
PARAM_FLOAT(z); PARAM_FLOAT(z);
self->spr.pos.Z = int(z * 256); self->set_float_z(z);
return 0; return 0;
} }
void coreactor_addz(DCoreActor* self, double z) void coreactor_addz(DCoreActor* self, double z)
{ {
self->spr.pos.Z += int(z * 256); self->add_float_z(z);
} }
DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, addz, coreactor_addz) DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, addz, coreactor_addz)
{ {
PARAM_SELF_PROLOGUE(DCoreActor); PARAM_SELF_PROLOGUE(DCoreActor);
PARAM_FLOAT(z); PARAM_FLOAT(z);
self->spr.pos.Z = int(z * 256); self->add_float_z(z);
return 0; return 0;
} }

View file

@ -70,6 +70,11 @@ public:
return time; return time;
} }
void copy_pos(const DCoreActor* other)
{
spr.pos = other->spr.pos;
}
const vec3_t int_pos() const const vec3_t int_pos() const
{ {
return spr.pos; return spr.pos;
@ -112,6 +117,33 @@ public:
return { spr.pos.X * inttoworld, spr.pos.Y * inttoworld, spr.pos.Z * zinttoworld }; return { spr.pos.X * inttoworld, spr.pos.Y * inttoworld, spr.pos.Z * zinttoworld };
} }
void set_float_pos(const DVector3& pos)
{
spr.pos = { int(pos.X * worldtoint), int(pos.Y * worldtoint), int(pos.Z * zworldtoint) };
}
void add_float_pos(const DVector3& pos)
{
spr.pos += { int(pos.X * worldtoint), int(pos.Y * worldtoint), int(pos.Z * zworldtoint) };
}
void set_float_z(int z)
{
spr.pos.Z = int(z * zworldtoint);
}
void add_float_z(int z)
{
spr.pos.Z += int(z * zworldtoint);
}
// Same as above but with invertex y and z axes to match the renderer's coordinate system.
DVector3 render_pos() const
{
return { spr.pos.X * inttoworld, -spr.pos.Y * inttoworld, -spr.pos.Z * zinttoworld };
}
int32_t interpolatedx(double const smoothratio, int const scale = 16) int32_t interpolatedx(double const smoothratio, int const scale = 16)
{ {
return interpolatedvalue(opos.X, spr.pos.X, smoothratio, scale); return interpolatedvalue(opos.X, spr.pos.X, smoothratio, scale);

View file

@ -557,7 +557,7 @@ tspritetype* renderAddTsprite(tspriteArray& tsprites, DCoreActor* actor)
{ {
auto tspr = tsprites.newTSprite(); auto tspr = tsprites.newTSprite();
tspr->pos = actor->spr.pos; tspr->pos = actor->int_pos();
tspr->cstat = actor->spr.cstat; tspr->cstat = actor->spr.cstat;
tspr->picnum = actor->spr.picnum; tspr->picnum = actor->spr.picnum;
tspr->shade = actor->spr.shade; tspr->shade = actor->spr.shade;

View file

@ -676,7 +676,7 @@ void BunchDrawer::ProcessSection(int sectionnum, bool portal)
if ((actor->spr.cstat & CSTAT_SPRITE_INVISIBLE) || actor->spr.xrepeat == 0 || actor->spr.yrepeat == 0) // skip invisible sprites if ((actor->spr.cstat & CSTAT_SPRITE_INVISIBLE) || actor->spr.xrepeat == 0 || actor->spr.yrepeat == 0) // skip invisible sprites
continue; continue;
int sx = actor->spr.pos.X - iview.X, sy = actor->spr.pos.Y - int(iview.Y); int sx = actor->int_pos().X - iview.X, sy = actor->int_pos().Y - int(iview.Y);
// this checks if the sprite is it behind the camera, which will not work if the pitch is high enough to necessitate a FOV of more than 180°. // this checks if the sprite is it behind the camera, which will not work if the pitch is high enough to necessitate a FOV of more than 180°.
//if ((actor->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) || (hw_models && tile2model[actor->spr.picnum].modelid >= 0) || ((sx * gcosang) + (sy * gsinang) > 0)) //if ((actor->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) || (hw_models && tile2model[actor->spr.picnum].modelid >= 0) || ((sx * gcosang) + (sy * gsinang) > 0))

View file

@ -670,7 +670,7 @@ bool HWLineToSpritePortal::Setup(HWDrawInfo* di, FRenderState& rstate, Clipper*
di->mClipPortal = this; di->mClipPortal = this;
auto srccenter = (WallStart(origin) + WallEnd(origin)) / 2; auto srccenter = (WallStart(origin) + WallEnd(origin)) / 2;
DVector2 destcenter ={ camera->spr.pos.X / 16.f, camera->spr.pos.Y / -16.f }; DVector2 destcenter = camera->render_pos().XY();
DVector2 npos = vp.Pos - srccenter + destcenter; DVector2 npos = vp.Pos - srccenter + destcenter;
double origx = vp.Pos.X; double origx = vp.Pos.X;

View file

@ -89,9 +89,7 @@ void BuildRat(DExhumedActor* pActor, int x, int y, int z, sectortype* pSector, i
ChangeActorStat(pActor, 108); ChangeActorStat(pActor, 108);
} }
pActor->spr.pos.X = x; pActor->set_int_pos({ x, y, z });
pActor->spr.pos.Y = y;
pActor->spr.pos.Z = z;
pActor->spr.cstat = CSTAT_SPRITE_BLOCK_ALL; pActor->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
pActor->spr.shade = -12; pActor->spr.shade = -12;
pActor->spr.xoffset = 0; pActor->spr.xoffset = 0;