diff --git a/src/r_fps.c b/src/r_fps.c index 1418b2a22..61c3eb192 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -140,10 +140,6 @@ void R_InterpolateView(fixed_t frac) prevview = newview; } - viewx = R_LerpFixed(prevview->x, newview->x, frac); - viewy = R_LerpFixed(prevview->y, newview->y, frac); - viewz = R_LerpFixed(prevview->z, newview->z, frac); - viewangle = R_LerpAngle(prevview->angle, newview->angle, frac); aimingangle = R_LerpAngle(prevview->aim, newview->aim, frac); viewroll = R_LerpAngle(prevview->roll, newview->roll, frac); @@ -151,6 +147,12 @@ void R_InterpolateView(fixed_t frac) viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT); viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT); + fixed_t zoom = R_LerpFixed(prevview->zoom, newview->zoom, frac); + + viewx = R_LerpFixed(prevview->x, newview->x, frac) - FixedMul(viewcos, zoom); + viewy = R_LerpFixed(prevview->y, newview->y, frac) - FixedMul(viewsin, zoom); + viewz = R_LerpFixed(prevview->z, newview->z, frac); + viewplayer = newview->player; viewsector = R_PointInSubsector(viewx, viewy)->sector; diff --git a/src/r_fps.h b/src/r_fps.h index 969c427fa..f2df84cd9 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -48,6 +48,7 @@ struct viewvars_t { fixed_t x; fixed_t y; fixed_t z; + fixed_t zoom; boolean sky; sector_t *sector; player_t *player; diff --git a/src/r_main.cpp b/src/r_main.cpp index 7277c2ace..e05c88fe3 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -1244,6 +1244,7 @@ void R_SetupFrame(int s) newview->x = r_viewmobj->x; newview->y = r_viewmobj->y; newview->z = r_viewmobj->z; + newview->zoom = 0; R_SetupCommonFrame(player, r_viewmobj->subsector); } @@ -1252,9 +1253,13 @@ void R_SetupFrame(int s) { r_viewmobj = NULL; - newview->x = thiscam->x; - newview->y = thiscam->y; + fixed_t x = player->mo ? player->mo->x : thiscam->x; + fixed_t y = player->mo ? player->mo->y : thiscam->y; + + newview->x = x; + newview->y = y; newview->z = thiscam->z + (thiscam->height>>1); + newview->zoom = FixedHypot(thiscam->x - x, thiscam->y - y); R_SetupCommonFrame(player, thiscam->subsector); } @@ -1267,6 +1272,7 @@ void R_SetupFrame(int s) newview->x = r_viewmobj->x; newview->y = r_viewmobj->y; newview->z = player->viewz; + newview->zoom = 0; R_SetupCommonFrame(player, r_viewmobj->subsector); } @@ -1297,6 +1303,7 @@ void R_SkyboxFrame(int s) newview->x = r_viewmobj->x; newview->y = r_viewmobj->y; newview->z = r_viewmobj->z; // 26/04/17: use actual Z position instead of spawnpoint angle! + newview->zoom = 0; if (mapheaderinfo[gamemap-1]) {