Interpolate camera roll, fix skybox in opengl

This commit is contained in:
Sally Coolatta 2021-12-01 10:53:15 -05:00
parent 0c8a6ccf40
commit 7238a1be83
5 changed files with 38 additions and 46 deletions

View file

@ -5803,8 +5803,7 @@ static void HWR_DrawSkyBackground(player_t *player)
dometransform.scalez = 1;
dometransform.fovxangle = fpov; // Tails
dometransform.fovyangle = fpov; // Tails
HWR_RollTransform(&dometransform,
R_ViewRollAngle(player));
HWR_RollTransform(&dometransform, viewroll);
dometransform.splitscreen = r_splitscreen;
HWR_GetTexture(texturetranslation[skytexture]);
@ -6096,7 +6095,7 @@ void HWR_RenderSkyboxView(player_t *player)
atransform.fovxangle = fpov; // Tails
atransform.fovyangle = fpov; // Tails
HWR_RollTransform(&atransform, R_ViewRollAngle(player));
HWR_RollTransform(&atransform, viewroll);
atransform.splitscreen = r_splitscreen;
gl_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
@ -6308,7 +6307,7 @@ void HWR_RenderPlayerView(void)
atransform.fovxangle = fpov; // Tails
atransform.fovyangle = fpov; // Tails
HWR_RollTransform(&atransform, R_ViewRollAngle(player));
HWR_RollTransform(&atransform, viewroll);
atransform.splitscreen = r_splitscreen;
gl_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));

View file

@ -83,10 +83,7 @@ static void R_SetupFreelook(player_t *player, boolean skybox)
void R_InterpolateView(fixed_t frac)
{
boolean skybox = false;
INT32 i;
if (FIXED_TO_FLOAT(frac) < 0)
if (frac < 0)
frac = 0;
if (frac > FRACUNIT)
frac = FRACUNIT;
@ -97,31 +94,20 @@ void R_InterpolateView(fixed_t frac)
viewangle = oldview->angle + R_LerpAngle(oldview->angle, newview->angle, frac);
aimingangle = oldview->aim + R_LerpAngle(oldview->aim, newview->aim, frac);
viewroll = oldview->roll + R_LerpAngle(oldview->roll, newview->roll, frac);
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
// this is gonna create some interesting visual errors for long distance teleports...
// might want to recalculate the view sector every frame instead...
viewplayer = newview->player;
viewsector = R_PointInSubsector(viewx, viewy)->sector;
// well, this ain't pretty
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
{
if (newview == &skyview_new[i])
{
skybox = true;
break;
}
}
R_SetupFreelook(newview->player, skybox);
R_SetupFreelook(newview->player, newview->sky);
}
void R_UpdateViewInterpolation(void)
{
INT32 i;
UINT8 i;
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
{
@ -132,7 +118,7 @@ void R_UpdateViewInterpolation(void)
void R_SetViewContext(enum viewcontext_e _viewcontext)
{
INT32 i;
UINT8 i = 0;
I_Assert(_viewcontext >= VIEWCONTEXT_PLAYER1
&& _viewcontext <= VIEWCONTEXT_SKY4);
@ -149,7 +135,7 @@ void R_SetViewContext(enum viewcontext_e _viewcontext)
newview = &pview_new[i];
break;
case VIEWCONTEXT_SKY1:
case VIEWCONTEXT_SKY2:
case VIEWCONTEXT_SKY2:;
case VIEWCONTEXT_SKY3:
case VIEWCONTEXT_SKY4:
i = viewcontext - VIEWCONTEXT_SKY1;

View file

@ -41,6 +41,7 @@ typedef struct {
angle_t angle;
angle_t aim;
angle_t roll;
fixed_t cos;
fixed_t sin;
mobj_t *mobj;

View file

@ -71,7 +71,7 @@ size_t framecount;
size_t loopcount;
fixed_t viewx, viewy, viewz;
angle_t viewangle, aimingangle;
angle_t viewangle, aimingangle, viewroll;
UINT8 viewssnum;
fixed_t viewcos, viewsin;
sector_t *viewsector;
@ -656,7 +656,7 @@ void R_CheckViewMorph(int s)
float fisheyemap[MAXVIDWIDTH/2 + 1];
#endif
angle_t rollangle = R_ViewRollAngle(&players[displayplayers[s]]);
angle_t rollangle = viewroll;
#ifdef WOUGHMP_WOUGHMP
fixed_t fisheye = cv_cam2_turnmultiplier.value; // temporary test value
#endif
@ -1206,8 +1206,8 @@ subsector_t *R_PointInSubsectorOrNull(fixed_t x, fixed_t y)
void R_SetupFrame(player_t *player)
{
camera_t *thiscam = &camera[0];
boolean chasecam = false;
UINT8 i;
boolean chasecam = (cv_chasecam[0].value != 0);
UINT8 i = 0;
for (i = 0; i <= r_splitscreen; i++)
{
@ -1221,12 +1221,17 @@ void R_SetupFrame(player_t *player)
}
if (i > r_splitscreen)
return; // shouldn't be possible, but just in case
{
i = 0; // Shouldn't be possible, but just in case.
thiscam = &camera[0];
chasecam = (cv_chasecam[0].value != 0);
R_SetViewContext(VIEWCONTEXT_PLAYER1);
}
if (player->spectator) // no spectator chasecam
chasecam = false; // force chasecam off
if (chasecam && !thiscam->chase)
if (chasecam && (thiscam && !thiscam->chase))
{
P_ResetCamera(player, thiscam);
thiscam->chase = true;
@ -1270,6 +1275,7 @@ void R_SetupFrame(player_t *player)
newview->aim = localaiming[i];
}
}
newview->roll = R_ViewRollAngle(player);
newview->z += quake.z;
newview->player = player;
@ -1302,7 +1308,7 @@ void R_SetupFrame(player_t *player)
// newview->sin = FINESINE(viewangle>>ANGLETOFINESHIFT);
// newview->cos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
R_InterpolateView(cv_frameinterpolation.value == 1 ? rendertimefrac : FRACUNIT);
R_InterpolateView(rendertimefrac);
}
void R_SkyboxFrame(player_t *player)
@ -1310,22 +1316,21 @@ void R_SkyboxFrame(player_t *player)
camera_t *thiscam = &camera[0];
UINT8 i = 0;
if (r_splitscreen)
for (i = 0; i <= r_splitscreen; i++)
{
for (i = 1; i <= r_splitscreen; i++)
if (player == &players[displayplayers[i]])
{
if (player == &players[displayplayers[i]])
{
thiscam = &camera[i];
R_SetViewContext(VIEWCONTEXT_SKY1 + i);
break;
}
thiscam = &camera[i];
R_SetViewContext(VIEWCONTEXT_SKY1 + i);
break;
}
}
if (i > r_splitscreen)
{
i = 0;
}
if (i > r_splitscreen)
{
i = 0; // Shouldn't be possible, but just in case.
thiscam = &camera[0];
R_SetViewContext(VIEWCONTEXT_SKY1);
}
// cut-away view stuff
@ -1343,7 +1348,7 @@ void R_SkyboxFrame(player_t *player)
newview->aim = player->awayviewaiming;
newview->angle = player->awayviewmobj->angle;
}
else if (thiscam->chase)
else if (thiscam && thiscam->chase)
{
newview->aim = thiscam->aiming;
newview->angle = thiscam->angle;
@ -1359,6 +1364,7 @@ void R_SkyboxFrame(player_t *player)
}
}
newview->angle += r_viewmobj->angle;
newview->roll = R_ViewRollAngle(player);
newview->player = player;
@ -1445,7 +1451,7 @@ void R_SkyboxFrame(player_t *player)
// newview->sin = FINESINE(viewangle>>ANGLETOFINESHIFT);
// newview->cos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
R_InterpolateView(cv_frameinterpolation.value == 1 ? rendertimefrac : FRACUNIT);
R_InterpolateView(rendertimefrac);
}
boolean R_ViewpointHasChasecam(player_t *player)

View file

@ -93,7 +93,7 @@ extern side_t *spawnsides;
// POV data.
//
extern fixed_t viewx, viewy, viewz;
extern angle_t viewangle, aimingangle;
extern angle_t viewangle, aimingangle, viewroll;
extern UINT8 viewssnum; // splitscreen view number
extern boolean viewsky, skyVisible;
extern boolean skyVisiblePerPlayer[MAXSPLITSCREENPLAYERS]; // saved values of skyVisible of each splitscreen player