Toggle for affine pre-scaling
Now you can choose between sane rotation + scaling, or SRB2 rotation + scaling Hooray?!
This commit is contained in:
parent
3880139feb
commit
de8f2e40da
6 changed files with 45 additions and 8 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue