mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-03-26 04:31:22 +00:00
Fixed view position forcing camera interpolation
Fixed absolute view position not working. Camera Actor is no longer visible when using view offsets.
This commit is contained in:
parent
a1a916a823
commit
4d1590ad82
3 changed files with 19 additions and 18 deletions
|
@ -397,7 +397,7 @@ void P_PlaySpawnSound(AActor *missile, AActor *spawner);
|
|||
void P_AimCamera (AActor *t1, DVector3 &, DAngle &, sector_t *&sec, bool &unlinked);
|
||||
|
||||
// [MC] Aiming for ViewPos
|
||||
void P_AdjustViewPos(AActor *t1, DVector3 orig, DVector3 &, sector_t *&sec, bool &unlinked, DViewPosition *VP, FRenderViewpoint *view);
|
||||
void P_AdjustViewPos(AActor *t1, DVector3 orig, DVector3 &, sector_t *&sec, bool &unlinked, FRenderViewpoint *view);
|
||||
|
||||
|
||||
// [RH] Means of death
|
||||
|
|
|
@ -5626,7 +5626,7 @@ static ETraceStatus VPos_CheckPortal(FTraceResults &res, void *userdata)
|
|||
}
|
||||
|
||||
// [MC] Used for ViewPos. Uses code borrowed from P_AimCamera.
|
||||
void P_AdjustViewPos(AActor *t1, DVector3 orig, DVector3 &campos, sector_t *&CameraSector, bool &unlinked, DViewPosition *VP, FRenderViewpoint *view)
|
||||
void P_AdjustViewPos(AActor *t1, DVector3 orig, DVector3 &campos, sector_t *&CameraSector, bool &unlinked, FRenderViewpoint *view)
|
||||
{
|
||||
FTraceResults trace;
|
||||
ViewPosPortal pc;
|
||||
|
@ -5642,7 +5642,6 @@ void P_AdjustViewPos(AActor *t1, DVector3 orig, DVector3 &campos, sector_t *&Cam
|
|||
campos = trace.HitPos - trace.HitVector * 1 / 256.;
|
||||
|
||||
|
||||
if (pc.counter > 2) view->noviewer = true;
|
||||
CameraSector = trace.Sector;
|
||||
unlinked = trace.unlinked;
|
||||
}
|
||||
|
|
|
@ -551,8 +551,10 @@ void R_InterpolateView (FRenderViewpoint &viewpoint, player_t *player, double Fr
|
|||
viewpoint.Path[0] = viewpoint.Path[1] = iview->New.Pos;
|
||||
}
|
||||
if (P_NoInterpolation(player, viewpoint.camera) &&
|
||||
iview->New.Pos.X == viewpoint.camera->X() &&
|
||||
iview->New.Pos.Y == viewpoint.camera->Y())
|
||||
// TODO: This is only temporarily disabled until R_SetupFrame can be reworked to take up-to-date angles into account.
|
||||
!(player->cheats & CF_CHASECAM) && (!r_deathcamera || viewpoint.camera->health > 0) &&
|
||||
iview->New.Pos.X == viewpoint.ActorPos.X &&
|
||||
iview->New.Pos.Y == viewpoint.ActorPos.Y)
|
||||
{
|
||||
viewpoint.Angles.Yaw = (nviewangle + DAngle::fromBam(LocalViewAngle)).Normalized180();
|
||||
DAngle delta = player->centering ? nullAngle : DAngle::fromBam(LocalViewPitch);
|
||||
|
@ -896,16 +898,12 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor
|
|||
// it's probably best to just reset the interpolation for this move.
|
||||
// Note that this can still cause problems with unusually linked portals
|
||||
if (viewpoint.sector->PortalGroup != oldsector->PortalGroup || (unlinked && ((iview->New.Pos.XY() - iview->Old.Pos.XY()).LengthSquared()) > 256 * 256))
|
||||
{
|
||||
iview->otic = nowtic;
|
||||
iview->Old = iview->New;
|
||||
r_NoInterpolate = true;
|
||||
}
|
||||
viewpoint.camera->renderflags |= RF_NOINTERPOLATEVIEW;
|
||||
|
||||
viewpoint.ActorPos = campos;
|
||||
}
|
||||
else if (VP) // No chase/death cam and player is alive, wants viewpos.
|
||||
{
|
||||
viewpoint.sector = viewpoint.ViewLevel->PointInRenderSubsector(iview->New.Pos.XY())->sector;
|
||||
viewpoint.showviewer = false;
|
||||
|
||||
// [MC] Ignores all portal portal transitions since it's meant to be absolute.
|
||||
|
@ -914,9 +912,14 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor
|
|||
if (VP->Flags & VPSF_ABSOLUTEPOS)
|
||||
{
|
||||
iview->New.Pos = VP->Offset;
|
||||
DefaultDraw = false;
|
||||
viewpoint.sector = viewpoint.ViewLevel->PointInRenderSubsector(iview->New.Pos.XY())->sector;
|
||||
viewpoint.showviewer = viewpoint.NoPortalPath = false;
|
||||
viewpoint.noviewer = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
viewpoint.sector = viewpoint.ViewLevel->PointInRenderSubsector(iview->New.Pos.XY())->sector;
|
||||
DVector3 next = orig;
|
||||
|
||||
if (VP->isZero())
|
||||
|
@ -944,18 +947,17 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor
|
|||
// Also, disable the portal interpolation pathing entirely when using the viewpos feature.
|
||||
// Interpolation still happens with everything else though and seems to work fine.
|
||||
DefaultDraw = false;
|
||||
viewpoint.noviewer = true;
|
||||
viewpoint.NoPortalPath = true;
|
||||
P_AdjustViewPos(mo, orig, next, viewpoint.sector, unlinked, VP, &viewpoint);
|
||||
P_AdjustViewPos(mo, orig, next, viewpoint.sector, unlinked, &viewpoint);
|
||||
iview->New.Pos = next;
|
||||
|
||||
if (viewpoint.sector->PortalGroup != oldsector->PortalGroup || (unlinked && ((iview->New.Pos.XY() - iview->Old.Pos.XY()).LengthSquared()) > 256 * 256))
|
||||
{
|
||||
iview->otic = nowtic;
|
||||
iview->Old = iview->New;
|
||||
r_NoInterpolate = true;
|
||||
}
|
||||
iview->New.Pos = next;
|
||||
viewpoint.camera->renderflags |= RF_NOINTERPOLATEVIEW;
|
||||
}
|
||||
}
|
||||
|
||||
viewpoint.ActorPos = iview->New.Pos;
|
||||
}
|
||||
|
||||
if (DefaultDraw)
|
||||
|
|
Loading…
Reference in a new issue