diff --git a/src/d_player.h b/src/d_player.h index 19a998f74..eec20695c 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b797a19c4..7235511a3 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -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))); diff --git a/src/p_user.c b/src/p_user.c index 9cd908cb0..9e28099b4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -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; - } } // diff --git a/src/r_main.c b/src/r_main.c index d895c4e10..d8b93144d 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -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 diff --git a/src/r_main.h b/src/r_main.h index d58773a73..49e028149 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -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;