- added a redirection hack for rotatesprite so that it can be transitionally used in the 2D drawer.

This commit is contained in:
Christoph Oelckers 2019-11-21 19:30:27 +01:00
parent 81ddf22d5d
commit 2740913c60
4 changed files with 81 additions and 1 deletions

View File

@ -11398,6 +11398,9 @@ void renderFlushPerms(void)
}
bool rotatesprite_2doverride; // gross hack alert. Thanks to the insufficient abstraction the only chance to redirect rotatesprite calls
// to the 2D drawer is to use a global flag and check in rotatesprite_.
#include "v_2ddrawer.h"
//
// rotatesprite
//
@ -11415,6 +11418,12 @@ void rotatesprite_(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum,
tileUpdatePicnum(&picnum, (int16_t)0xc000);
if ((tilesiz[picnum].x <= 0) || (tilesiz[picnum].y <= 0)) return;
if (rotatesprite_2doverride)
{
twod.rotatesprite(sx, sy, z, a, picnum, dashade, dapalnum, dastat, daalpha, dablend, cx1, cy1, cx2, cy2);
return;
}
// Experimental / development bits. ONLY FOR INTERNAL USE!
// bit RS_CENTERORIGIN: see dorotspr_handle_bit2
////////////////////

View File

@ -31,6 +31,7 @@
#include "renderstyle.h"
#include "drawparms.h"
#include "vectors.h"
#include "gamecvars.h"
//#include "doomtype.h"
#include "templates.h"
//#include "r_utility.h"
@ -554,3 +555,49 @@ void F2DDrawer::Clear()
mData.Clear();
mIsFirstPass = true;
}
//==========================================================================
//
//
//
//==========================================================================
#include "build.h"
#include "../src/engine_priv.h"
void F2DDrawer::rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum,
int8_t dashade, uint8_t dapalnum, int32_t dastat, uint8_t daalpha, uint8_t dablend,
int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2)
{
if (r_rotatespritenowidescreen)
{
dastat |= RS_STRETCH;
dastat &= ~RS_ALIGN_MASK;
}
// This is mainly a hack because the rotatesprite code is far too messed up to integrate into the 2D drawer.
// This merely stores the parameters and later just calls polymost_rotatesprite do do the work.
// Cleanup can be done once everything is working - but for the menu's transition the original calls should be preserved.
RenderCommand dg;
dg.mType = DrawTypeRotateSprite;
// Just store the values in the otherwise useless fields of the draw command instead of allocating separate memory.
dg.mVertIndex = sx;
dg.mVertCount = sy;
dg.mIndexIndex = z;
dg.mIndexCount = a;
dg.mSpecialColormap[0].d = picnum;
dg.mRemapIndex = dashade;
dg.mFlags = dapalnum;
dg.mSpecialColormap[1].d = dastat;
dg.mDesaturate = daalpha;
dg.mColor1.d = dablend;
dg.mScissor[0] = cx1;
dg.mScissor[1] = cy1;
dg.mScissor[2] = cx2;
dg.mScissor[3] = cy2;
mData.Push(dg); // don't even try to merge.
}

View File

@ -19,6 +19,7 @@ public:
DrawTypeTriangles,
DrawTypeLines,
DrawTypePoints,
DrawTypeRotateSprite,
};
enum ETextureFlags : uint8_t
@ -85,7 +86,7 @@ public:
bool isCompatible(const RenderCommand &other) const
{
return mTexture == other.mTexture &&
mType == other.mType &&
mType == other.mType && mType != DrawTypeRotateSprite &&
mRemapIndex == other.mRemapIndex &&
mSpecialColormap[0].d == other.mSpecialColormap[0].d &&
mSpecialColormap[1].d == other.mSpecialColormap[1].d &&
@ -122,6 +123,10 @@ public:
void AddThickLine(int x1, int y1, int x2, int y2, double thickness, uint32_t color, uint8_t alpha = 255);
void AddPixel(int x1, int y1, uint32_t color);
void rotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum,
int8_t dashade, uint8_t dapalnum, int32_t dastat, uint8_t daalpha, uint8_t dablend,
int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2);
void Clear();
bool mIsFirstPass = true;

View File

@ -82,6 +82,7 @@ public:
// Draws the 2D stuff. This is the version for OpenGL 3 and later.
//
//===========================================================================
void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, uint8_t dapalnum, int32_t dastat, uint8_t daalpha, uint8_t dablend, int32_t cx1, int32_t cy1, int32_t cx2, int32_t cy2, int32_t uniqid);
void GLInstance::Draw2D(F2DDrawer *drawer)
{
@ -123,6 +124,24 @@ void GLInstance::Draw2D(F2DDrawer *drawer)
for(auto &cmd : commands)
{
if (cmd.mType == F2DDrawer::DrawTypeRotateSprite)
{
// This just gets forwarded to the original drawer. Long term this should not survive and all calls be refactored.
UseColorOnly(false);
SetFadeDisable(false);
polymost_dorotatesprite(cmd.mVertIndex, cmd.mVertCount, cmd.mIndexIndex, cmd.mIndexCount, cmd.mSpecialColormap[0].d, cmd.mRemapIndex, cmd.mFlags, cmd.mSpecialColormap[1].d,
cmd.mDesaturate, cmd.mColor1.d, cmd.mScissor[0], cmd.mScissor[1], cmd.mScissor[2], cmd.mScissor[3], 0);
// Reset everything to the default.
SetFadeDisable(true);
EnableDepthTest(false);
EnableMultisampling(false);
EnableBlend(true);
EnableAlphaTest(true);
SetBlendFunc(STYLEALPHA_Src, STYLEALPHA_InvSrc);
continue;
}
int gltrans = -1;
//state.SetRenderStyle(cmd.mRenderStyle);