From 66c4bc1fee720ed5aaf2b2135449404c5f94e55d Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Sun, 17 Apr 2016 20:55:07 -0500 Subject: [PATCH] Fixed various problems when drawing psprites in a camera texture - When the camera texture for a player view was rendered, its psprites would overwrite the ones stored for hardware acceleration. * Use a temporary vissprite in R_DrawPSprite() until it's known that it will be accelerated. * Do not write to any of the VisPSprites*[] arrays until it's known that the sprite will be accelerated. --- src/r_things.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/r_things.cpp b/src/r_things.cpp index 95b40916e..dafd32fd2 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -1294,7 +1294,7 @@ void R_DrawPSprite (pspdef_t* psp, int pspnum, AActor *owner, fixed_t sx, fixed_ WORD flip; FTexture* tex; vissprite_t* vis; - static vissprite_t avis[NUMPSPRITES]; + static vissprite_t avis[NUMPSPRITES+1]; bool noaccel; assert(pspnum >= 0 && pspnum < NUMPSPRITES); @@ -1325,7 +1325,6 @@ void R_DrawPSprite (pspdef_t* psp, int pspnum, AActor *owner, fixed_t sx, fixed_ tx -= tex->GetScaledLeftOffset() << FRACBITS; x1 = (centerxfrac + FixedMul (tx, pspritexscale)) >>FRACBITS; - VisPSpritesX1[pspnum] = x1; // off the right side if (x1 > viewwidth) @@ -1339,14 +1338,12 @@ void R_DrawPSprite (pspdef_t* psp, int pspnum, AActor *owner, fixed_t sx, fixed_ return; // store information in a vissprite - vis = &avis[pspnum]; + vis = &avis[NUMPSPRITES]; vis->renderflags = owner->renderflags; vis->floorclip = 0; - vis->texturemid = int(((BASEYCENTER<Scale.Y) + (tex->TopOffset << FRACBITS); - if (camera->player && (RenderTarget != screen || viewheight == RenderTarget->GetHeight() || (RenderTarget->GetWidth() > 320 && !st_scale))) @@ -1395,6 +1392,7 @@ void R_DrawPSprite (pspdef_t* psp, int pspnum, AActor *owner, fixed_t sx, fixed_ vis->startfrac += vis->xiscale*(vis->x1-x1); noaccel = false; + FDynamicColormap *colormap_to_use = NULL; if (pspnum <= ps_flash) { vis->Style.Alpha = float(owner->Alpha); @@ -1491,11 +1489,11 @@ void R_DrawPSprite (pspdef_t* psp, int pspnum, AActor *owner, fixed_t sx, fixed_ { noaccel = true; } - VisPSpritesBaseColormap[pspnum] = mybasecolormap; + colormap_to_use = mybasecolormap; } else { - VisPSpritesBaseColormap[pspnum] = basecolormap; + colormap_to_use = basecolormap; vis->Style.colormap = basecolormap->Maps; vis->Style.RenderStyle = STYLE_Normal; } @@ -1508,7 +1506,10 @@ void R_DrawPSprite (pspdef_t* psp, int pspnum, AActor *owner, fixed_t sx, fixed_ style.CheckFuzz(); if (style.BlendOp != STYLEOP_Fuzz) { - VisPSprites[pspnum] = vis; + VisPSpritesX1[pspnum] = x1; + VisPSpritesBaseColormap[pspnum] = colormap_to_use; + VisPSprites[pspnum] = &avis[pspnum]; + avis[pspnum] = *vis; return; } } @@ -1685,9 +1686,6 @@ void R_DrawRemainingPlayerSprites() } } - - - // // R_SortVisSprites //