diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index e301d99f5..8cb71bfe7 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5143,7 +5143,7 @@ static void HWR_ProjectSprite(mobj_t *thing) INT32 flipsign = ((flip && papersprite) ? -1 : 1); // Flip OGL affine papersprites for Software parity - angle = spriterotangle * flipsign; + angle = R_ConvToRollAngle(spriterotangle) * flipsign; const fixed_t rolloffs_x = FixedDiv(interptarg->rollingxoffset, highresscale) * (((thing->renderflags & RF_FLIPOFFSETS) && flip) ? -1 : 1); const fixed_t rolloffs_y = FixedDiv(interptarg->rollingyoffset, highresscale); diff --git a/src/r_main.cpp b/src/r_main.cpp index 77f004feb..c41e79d3b 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -197,6 +197,8 @@ consvar_t cv_sliptidetilt = CVAR_INIT ("sliptidetilt", "On", CV_SAVE, CV_OnOff, consvar_t cv_nulldriftefx = CVAR_INIT ("nulldriftefx", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_nulldrifttilt = CVAR_INIT ("nulldrifttilt", "On", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_fakerollangle = CVAR_INIT ("fakerollangle", "Off", CV_SAVE, CV_OnOff, NULL); + static CV_PossibleValue_t affineangle_cons_t[] = {{0, "MIN"}, {360 * FRACUNIT, "MAX"}, {0, NULL}}; static CV_PossibleValue_t affinetest_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Auto"}, {0, NULL}}; @@ -1807,6 +1809,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_sliptidetilt); CV_RegisterVar(&cv_nulldriftefx); CV_RegisterVar(&cv_nulldrifttilt); + CV_RegisterVar(&cv_fakerollangle); CV_RegisterVar(&cv_showhud); CV_RegisterVar(&cv_translucenthud); diff --git a/src/r_main.h b/src/r_main.h index 57889b115..b8a62812d 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -161,6 +161,8 @@ extern consvar_t cv_sloperoll; extern consvar_t cv_sliptidetilt; extern consvar_t cv_nulldriftefx, cv_nulldrifttilt; +extern consvar_t cv_fakerollangle; + // debugging typedef enum { diff --git a/src/r_patch.h b/src/r_patch.h index d23280c91..4ae365f58 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -58,6 +58,7 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll( interpmobjstate_t *interp, vector2_t* out, vector2_t* rolloffs); +angle_t R_ConvToRollAngle(angle_t ang); #endif #ifdef __cplusplus diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index e12e720ac..ca854dcaf 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -147,6 +147,12 @@ INT32 R_GetRollAngle(angle_t rollangle) #define VISROTMUL (ANG1 * ROTANGDIFF) +// Simulates "rollangle" angling +angle_t R_ConvToRollAngle(angle_t ang) +{ + return (cv_fakerollangle.value) ? (R_GetRollAngle(ang) * VISROTMUL) : ang; +} + vector2_t* R_RotateSpriteOffsetsByPitchRoll( mobj_t* mobj, boolean vflip, diff --git a/src/r_things.cpp b/src/r_things.cpp index 7ce247153..aa004d90f 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -2326,7 +2326,7 @@ static void R_ProjectSprite(mobj_t *thing) INT32 flipsign = ((flip) ? -1 : 1); - angle = spriterotangle * flipsign; + angle = R_ConvToRollAngle(spriterotangle) * flipsign; const fixed_t rolloffs_x = FixedDiv(interptarg->rollingxoffset, highresscale) * (((thing->renderflags & RF_FLIPOFFSETS) && flip) ? -1 : 1); const fixed_t rolloffs_y = FixedDiv(interptarg->rollingyoffset, highresscale);