Toggle for affine pre-scaling

Now you can choose between sane rotation + scaling, or SRB2 rotation + scaling
Hooray?!
This commit is contained in:
yamamama 2026-03-03 11:28:16 -05:00
parent 3880139feb
commit de8f2e40da
6 changed files with 45 additions and 8 deletions

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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
//

View file

@ -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);