Add affine renderflag

Guest starring: even MORE flag variables!
This commit is contained in:
yamamama 2026-02-27 01:52:20 -05:00
parent 402b48342b
commit aeadb21ad3
5 changed files with 18 additions and 4 deletions

View file

@ -62,6 +62,7 @@ enum mobj_e {
mobj_flags2,
mobj_eflags,
mobj_renderflags,
mobj_renderflags2,
mobj_skin,
mobj_voice,
mobj_color,
@ -160,6 +161,7 @@ static const char *const mobj_opt[] = {
"flags2",
"eflags",
"renderflags",
"renderflags2",
"skin",
"voice",
"color",
@ -429,6 +431,9 @@ static int mobj_get(lua_State *L)
case mobj_renderflags:
lua_pushinteger(L, mo->renderflags);
break;
case mobj_renderflags2:
lua_pushinteger(L, mo->renderflags2);
break;
case mobj_skin: // skin name or nil, not struct
if (!mo->skin)
return 0;
@ -901,6 +906,9 @@ static int mobj_set(lua_State *L)
case mobj_renderflags:
mo->renderflags = (UINT32)luaL_checkinteger(L, 3);
break;
case mobj_renderflags2:
mo->renderflags2 = (UINT32)luaL_checkinteger(L, 3);
break;
case mobj_skin: // set skin by name
{
INT32 i;

View file

@ -305,7 +305,7 @@ struct mobj_t
UINT8 sprite2; // player sprites
UINT16 anim_duration; // for FF_ANIMATE states
UINT32 renderflags; // render flags
UINT32 renderflags, renderflags2; // render flags
fixed_t spritexscale, spriteyscale;
fixed_t spritexoffset, spriteyoffset;
fixed_t old_spritexscale, old_spriteyscale;
@ -494,7 +494,7 @@ struct precipmobj_t
UINT8 sprite2; // player sprites
UINT16 anim_duration; // for FF_ANIMATE states
UINT32 renderflags; // render flags
UINT32 renderflags, renderflags2; // render flags
fixed_t spritexscale, spriteyscale;
fixed_t spritexoffset, spriteyoffset;
fixed_t old_spritexscale, old_spriteyscale;

View file

@ -2046,7 +2046,7 @@ static void DiffMobj(const mobj_t *mobj, UINT32 diff[])
DIFF(mobj->mirrored, MD2_MIRRORED);
DIFF(mobj->rollangle, MD2_ROLLANGLE);
DIFF(mobj->shadowscale, MD2_SHADOWSCALE);
DIFF(mobj->renderflags, MD2_RENDERFLAGS);
DIFF(mobj->renderflags || mobj->renderflags2, MD2_RENDERFLAGS);
DIFF(mobj->tid != 0, MD2_TID);
DIFF(mobj->spritexscale != FRACUNIT || mobj->spriteyscale != FRACUNIT, MD2_SPRITESCALE);
DIFF(mobj->spritexoffset || mobj->spriteyoffset || mobj->rollingxoffset || mobj->rollingyoffset, MD2_SPRITEOFFSET);
@ -2324,6 +2324,7 @@ static thinker_t *SyncMobjThinker(savebuffer_t *save, actionf_p1 thinker, thinke
mobj->renderflags = READUINT32(save->p);
}
}
SYNCF(MD2_RENDERFLAGS, mobj->renderflags2);
SYNCF(MD2_TID, mobj->tid);
SYNCDEF(MD2_SPRITESCALE, mobj->spritexscale, FRACUNIT);
SYNCDEF(MD2_SPRITESCALE, mobj->spriteyscale, FRACUNIT);

View file

@ -1036,6 +1036,11 @@ typedef enum
RF_GHOSTLYMASK = (RF_TRANSMASK | RF_FULLBRIGHT),
} renderflags_t;
typedef enum
{
RF2_AFFINE = 0x00000001, // Affine sprite; draws scaling and rotation using a Mode 7 matrix
} renderflags2_t;
typedef enum
{
SRF_SINGLE = 0, // 0-angle for all rotations

View file

@ -1955,7 +1955,7 @@ static void R_ProjectSprite(mobj_t *thing)
mobj_t *interptarg = thing;
// Affines
boolean affinesprite = (thing->player != NULL);
boolean affinesprite = ((thing->player != NULL) || ((thing->renderflags2 & RF2_AFFINE) == RF2_AFFINE));
affine_t affine_transform = {0};
affine_bounding_t affine_bounds = {0};
vector2_t affine_scale = {0};