Let viewrollangle be independent of camera tilting

This commit is contained in:
James R 2021-04-06 15:28:13 -07:00
parent f313eece7e
commit bdc4b50de2
5 changed files with 45 additions and 46 deletions

View file

@ -499,6 +499,8 @@ typedef struct player_s
fixed_t bob;
angle_t viewrollangle;
// camera tilt
// TODO: expose to lua
angle_t tilt;
angle_t angleturn;

View file

@ -64,6 +64,7 @@ static void HWR_ProjectSprite(mobj_t *thing);
#ifdef HWPRECIP
static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing);
#endif
static void HWR_RollTransform(FTransform *tr, angle_t roll);
void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight,
@ -5743,14 +5744,8 @@ static void HWR_DrawSkyBackground(player_t *player)
dometransform.scalez = 1;
dometransform.fovxangle = fpov; // Tails
dometransform.fovyangle = fpov; // Tails
if (player->viewrollangle != 0)
{
fixed_t rol = AngleFixed(player->viewrollangle);
dometransform.rollangle = FIXED_TO_FLOAT(rol);
dometransform.roll = true;
dometransform.rollx = 1.0f;
dometransform.rollz = 0.0f;
}
HWR_RollTransform(&dometransform,
R_ViewRollAngle(player));
dometransform.splitscreen = r_splitscreen;
HWR_GetTexture(texturetranslation[skytexture]);
@ -6042,14 +6037,7 @@ void HWR_RenderSkyboxView(player_t *player)
atransform.fovxangle = fpov; // Tails
atransform.fovyangle = fpov; // Tails
if (player->viewrollangle != 0)
{
fixed_t rol = AngleFixed(player->viewrollangle);
atransform.rollangle = FIXED_TO_FLOAT(rol);
atransform.roll = true;
atransform.rollx = 1.0f;
atransform.rollz = 0.0f;
}
HWR_RollTransform(&atransform, R_ViewRollAngle(player));
atransform.splitscreen = r_splitscreen;
gl_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
@ -6160,6 +6148,18 @@ void HWR_RenderSkyboxView(player_t *player)
// ==========================================================================
//
// ==========================================================================
static void HWR_RollTransform(FTransform *tr, angle_t roll)
{
if (roll != 0)
{
tr->rollangle = roll / (float)ANG1;
tr->roll = true;
tr->rollx = 1.0f;
tr->rollz = 0.0f;
}
}
void HWR_RenderPlayerView(void)
{
player_t * player = &players[displayplayers[viewssnum]];
@ -6249,14 +6249,7 @@ void HWR_RenderPlayerView(void)
atransform.fovxangle = fpov; // Tails
atransform.fovyangle = fpov; // Tails
if (player->viewrollangle != 0)
{
fixed_t rol = AngleFixed(player->viewrollangle);
atransform.rollangle = FIXED_TO_FLOAT(rol);
atransform.roll = true;
atransform.rollx = 1.0f;
atransform.rollz = 0.0f;
}
HWR_RollTransform(&atransform, R_ViewRollAngle(player));
atransform.splitscreen = r_splitscreen;
gl_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));

View file

@ -4289,10 +4289,6 @@ Quaketilt (player_t *player)
return moma;
}
static inline int intsign(int n) {
return n < 0 ? -1 : n > 0 ? 1 : 0;
}
static void
DoABarrelRoll (player_t *player)
{
@ -4323,23 +4319,6 @@ DoABarrelRoll (player_t *player)
player->tilt += delta;
else
player->tilt = slope;
if (cv_tilting.value)
{
player->viewrollangle = player->tilt;
if (cv_actionmovie.value)
{
int xs = intsign(quake.x),
ys = intsign(quake.y),
zs = intsign(quake.z);
player->viewrollangle += (xs ^ ys ^ zs) * ANG1;
}
}
else
{
player->viewrollangle = 0;
}
}
//

View file

@ -629,7 +629,7 @@ void R_CheckViewMorph(int s)
float fisheyemap[MAXVIDWIDTH/2 + 1];
#endif
angle_t rollangle = players[displayplayers[s]].viewrollangle;
angle_t rollangle = R_ViewRollAngle(&players[displayplayers[s]]);
#ifdef WOUGHMP_WOUGHMP
fixed_t fisheye = cv_cam2_turnmultiplier.value; // temporary test value
#endif
@ -936,6 +936,30 @@ void R_ApplyViewMorph(int s)
width*vid.bpp, height, width*vid.bpp, vid.width);
}
static inline int intsign(int n) {
return n < 0 ? -1 : n > 0 ? 1 : 0;
}
angle_t R_ViewRollAngle(const player_t *player)
{
angle_t roll = player->viewrollangle;
if (cv_tilting.value)
{
roll += player->tilt;
if (cv_actionmovie.value)
{
int xs = intsign(quake.x),
ys = intsign(quake.y),
zs = intsign(quake.z);
roll += (xs ^ ys ^ zs) * ANG1;
}
}
return roll;
}
//
// R_SetViewSize

View file

@ -115,6 +115,7 @@ void R_Init(void);
void R_CheckViewMorph(int split);
void R_ApplyViewMorph(int split);
angle_t R_ViewRollAngle(const player_t *player);
// just sets setsizeneeded true
extern boolean setsizeneeded;