From aeadb21ad3567bb78ab35b0e8e269a8dd614a5c6 Mon Sep 17 00:00:00 2001 From: yamamama Date: Fri, 27 Feb 2026 01:52:20 -0500 Subject: [PATCH] Add affine renderflag Guest starring: even MORE flag variables! --- src/lua_mobjlib.c | 8 ++++++++ src/p_mobj.h | 4 ++-- src/p_saveg.c | 3 ++- src/r_defs.h | 5 +++++ src/r_things.cpp | 2 +- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 6cdec7b59..f8521fbe7 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -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; diff --git a/src/p_mobj.h b/src/p_mobj.h index 371cbe1db..004508530 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -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; diff --git a/src/p_saveg.c b/src/p_saveg.c index 6e8779124..235e68dc1 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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); diff --git a/src/r_defs.h b/src/r_defs.h index 03992f22d..6b2fffdb6 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -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 diff --git a/src/r_things.cpp b/src/r_things.cpp index eb5a9c806..b11570a3e 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -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};