diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 8cb71bfe7..bed2b5ddf 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5156,10 +5156,23 @@ static void HWR_ProjectSprite(mobj_t *thing) } fixed_t sa = FSIN(angle), ca = FCOS(angle); - affine_transform.a = FixedDiv(ca, affine_scale.x); - affine_transform.b = FixedDiv(-sa, affine_scale.x); - affine_transform.c = FixedDiv(sa, affine_scale.y); - affine_transform.d = FixedDiv(ca, affine_scale.y); + + if (R_AffinePreScale(interptarg)) + { + affine_transform.a = FixedDiv(ca, affine_scale.x); + affine_transform.b = FixedDiv(-sa, affine_scale.x); + affine_transform.c = FixedDiv(sa, affine_scale.y); + affine_transform.d = FixedDiv(ca, affine_scale.y); + } + else + { + // Simulate shitty SRB2 "scale after rotate" nonsense + affine_transform.a = FixedDiv(ca, affine_scale.x); + affine_transform.b = FixedDiv(-sa, affine_scale.y); + affine_transform.c = FixedDiv(sa, affine_scale.x); + affine_transform.d = FixedDiv(ca, affine_scale.y); + } + affine_transform.ox = spr_offset - rolloffs_x; affine_transform.oy = y_piv - rolloffs_y; diff --git a/src/r_defs.h b/src/r_defs.h index c84bf1bad..74e95cf2a 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1040,6 +1040,7 @@ typedef enum { RF2_NOAFFINE = 0x00000001, // Disables affine drawing for this sprite RF2_AFFINEPAPER = 0x00000002, // Enables "affine papersprites" + RF2_AFFINEPRESCALE = 0x00000004, // Makes affines scale before rotating, instead of rotating before scaling } renderflags2_t; typedef enum diff --git a/src/r_main.cpp b/src/r_main.cpp index c41e79d3b..be7a995ed 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -199,6 +199,8 @@ consvar_t cv_nulldrifttilt = CVAR_INIT ("nulldrifttilt", "On", CV_SAVE, CV_OnOff consvar_t cv_fakerollangle = CVAR_INIT ("fakerollangle", "Off", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_affineprescale = CVAR_INIT ("affineprescale", "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}}; @@ -1810,6 +1812,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_nulldriftefx); CV_RegisterVar(&cv_nulldrifttilt); CV_RegisterVar(&cv_fakerollangle); + CV_RegisterVar(&cv_affineprescale); CV_RegisterVar(&cv_showhud); CV_RegisterVar(&cv_translucenthud); diff --git a/src/r_main.h b/src/r_main.h index b8a62812d..b1f066705 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -162,6 +162,7 @@ extern consvar_t cv_sliptidetilt; extern consvar_t cv_nulldriftefx, cv_nulldrifttilt; extern consvar_t cv_fakerollangle; +extern consvar_t cv_affineprescale; // debugging diff --git a/src/r_things.cpp b/src/r_things.cpp index aa004d90f..8198ca96a 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -2339,10 +2339,23 @@ static void R_ProjectSprite(mobj_t *thing) } fixed_t sa = FSIN(angle), ca = FCOS(angle); - affine_transform.a = FixedDiv(ca, affine_scale.x); - affine_transform.b = FixedDiv(-sa, affine_scale.x); - affine_transform.c = FixedDiv(sa, affine_scale.y); - affine_transform.d = FixedDiv(ca, affine_scale.y); + + if (R_AffinePreScale(interptarg)) + { + affine_transform.a = FixedDiv(ca, affine_scale.x); + affine_transform.b = FixedDiv(-sa, affine_scale.x); + affine_transform.c = FixedDiv(sa, affine_scale.y); + affine_transform.d = FixedDiv(ca, affine_scale.y); + } + else + { + // Simulate shitty SRB2 "scale after rotate" nonsense + affine_transform.a = FixedDiv(ca, affine_scale.x); + affine_transform.b = FixedDiv(-sa, affine_scale.y); + affine_transform.c = FixedDiv(sa, affine_scale.x); + affine_transform.d = FixedDiv(ca, affine_scale.y); + } + affine_transform.ox = ((patch->pivot.x + patch->leftoffset) * FRACUNIT) - rolloffs_x; affine_transform.oy = y_piv - rolloffs_y; @@ -4340,6 +4353,11 @@ boolean R_ThingIsFullDark(mobj_t *thing) return ((thing->frame & FF_BRIGHTMASK) == FF_FULLDARK); } +boolean R_AffinePreScale(mobj_t *thing) +{ + return (cv_affineprescale.value || thing->renderflags2 & RF2_AFFINEPRESCALE); +} + // // R_DrawMasked // diff --git a/src/r_things.h b/src/r_things.h index c3acd679d..31924f34a 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -96,6 +96,7 @@ boolean R_ThingIsAffineSprite (mobj_t *thing); boolean R_ThingIsFullBright (mobj_t *thing); boolean R_ThingIsSemiBright (mobj_t *thing); boolean R_ThingIsFullDark (mobj_t *thing); +boolean R_AffinePreScale (mobj_t *thing); boolean R_ThingIsFlashing(mobj_t *thing);