diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 1bb4de180eb6521cb1cb428d9c6b090f6d7f21ef..55029828035e99ddb69c22e9c657dc9ccffbb9e3 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -467,7 +467,23 @@ static int libd_patchExists(lua_State *L) static int libd_cachePatch(lua_State *L) { - LUA_PushUserdata(L, W_CachePatchLongName(luaL_checkstring(L, 1), PU_PATCH), META_PATCH); + const char *name = luaL_checkstring(L, 1); + patch_t *patch = W_CachePatchLongName(name, PU_PATCH); + +#ifdef ROTSPRITE + if (lua_isnumber(L, 2)) + { + angle_t rollangle = luaL_checkangle(L, 2); + INT32 rot = R_GetRollAngle(rollangle); + if (rot) { + patch_t *rotpatch = Patch_GetRotated(patch, rot, false); + LUA_PushUserdata(L, rotpatch, META_PATCH); + return 1; + } + } +#endif + + LUA_PushUserdata(L, patch, META_PATCH); return 1; } diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index 989665d74179854fcfac552814132671c3d00ed2..7c4f6257eeb029ccb3a0fa30b9a44222fe1a7958 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -54,12 +54,26 @@ INT32 R_GetRollAngle(angle_t rollangle) patch_t *Patch_GetRotated(patch_t *patch, INT32 angle, boolean flip) { rotsprite_t *rotsprite = patch->rotated; - if (rotsprite == NULL || angle < 1 || angle >= ROTANGLES) + if (angle < 1 || angle >= ROTANGLES) return NULL; + if (rotsprite == NULL) + { + rotsprite = RotatedPatch_Create(ROTANGLES); + patch->rotated = rotsprite; + } + if (flip) angle += rotsprite->angles; + if (rotsprite->patches[angle] == NULL) + { + INT32 xpivot = 0, ypivot = 0; + xpivot = patch->leftoffset; + ypivot = patch->topoffset; + RotatedPatch_DoRotation(rotsprite, patch, angle, xpivot, ypivot, flip); + } + return rotsprite->patches[angle]; }