diff --git a/src/gl/scene/gl_weapon.cpp b/src/gl/scene/gl_weapon.cpp index ed1ebc69a6..869952b425 100644 --- a/src/gl/scene/gl_weapon.cpp +++ b/src/gl/scene/gl_weapon.cpp @@ -50,7 +50,6 @@ EXTERN_CVAR (Bool, r_drawplayersprites) EXTERN_CVAR (Bool, r_deathcamera) - //========================================================================== // // R_DrawPSprite @@ -59,91 +58,20 @@ EXTERN_CVAR (Bool, r_deathcamera) void GLSceneDrawer::DrawPSprite (player_t * player,DPSprite *psp, float sx, float sy, int OverrideShader, bool alphatexture) { - float fU1,fV1; - float fU2,fV2; - float tx; - float x1,y1,x2,y2; - float scale; - float scalex; - float ftexturemid; + WeaponRect rc; - // decide which patch to use - bool mirror; - FTextureID lump = sprites[psp->GetSprite()].GetSpriteFrame(psp->GetFrame(), 0, 0., &mirror); - if (!lump.isValid()) return; - - FMaterial * tex = FMaterial::ValidateTexture(lump, true, false); - if (!tex) return; - - gl_RenderState.SetMaterial(tex, CLAMP_XY_NOMIP, 0, OverrideShader, alphatexture); - - float vw = (float)viewwidth; - float vh = (float)viewheight; - - FloatRect r; - tex->GetSpriteRect(&r); - - // calculate edges of the shape - scalex = (320.0f / (240.0f * r_viewwindow.WidescreenRatio)) * vw / 320; - - tx = (psp->Flags & PSPF_MIRROR) ? ((160 - r.width) - (sx + r.left)) : (sx - (160 - r.left)); - x1 = tx * scalex + vw/2; - if (x1 > vw) return; // off the right side - x1 += viewwindowx; - - tx += r.width; - x2 = tx * scalex + vw / 2; - if (x2 < 0) return; // off the left side - x2 += viewwindowx; - - // killough 12/98: fix psprite positioning problem - ftexturemid = 100.f - sy - r.top; - - AWeapon * wi=player->ReadyWeapon; - if (wi && wi->YAdjust != 0) - { - float fYAd = wi->YAdjust; - if (screenblocks >= 11) - { - ftexturemid -= fYAd; - } - else - { - ftexturemid -= StatusBar->GetDisplacement () * fYAd; - } - } - - scale = (SCREENHEIGHT*vw) / (SCREENWIDTH * 200.0f); - y1 = viewwindowy + vh / 2 - (ftexturemid * scale); - y2 = y1 + (r.height * scale) + 1; - - - if (!(mirror) != !(psp->Flags & (PSPF_FLIP))) - { - fU2 = tex->GetSpriteUL(); - fV1 = tex->GetSpriteVT(); - fU1 = tex->GetSpriteUR(); - fV2 = tex->GetSpriteVB(); - } - else - { - fU1 = tex->GetSpriteUL(); - fV1 = tex->GetSpriteVT(); - fU2 = tex->GetSpriteUR(); - fV2 = tex->GetSpriteVB(); - - } - - if (tex->tex->GetTranslucency() || OverrideShader != -1) + if (!GetWeaponRect(psp, sx, sy, player, rc)) return; + gl_RenderState.SetMaterial(rc.tex, CLAMP_XY_NOMIP, 0, OverrideShader, alphatexture); + if (rc.tex->tex->GetTranslucency() || OverrideShader != -1) { gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f); } gl_RenderState.Apply(); FQuadDrawer qd; - qd.Set(0, x1, y1, 0, fU1, fV1); - qd.Set(1, x1, y2, 0, fU1, fV2); - qd.Set(2, x2, y1, 0, fU2, fV1); - qd.Set(3, x2, y2, 0, fU2, fV2); + qd.Set(0, rc.x1, rc.y1, 0, rc.u1, rc.v1); + qd.Set(1, rc.x1, rc.y2, 0, rc.u1, rc.v2); + qd.Set(2, rc.x2, rc.y1, 0, rc.u2, rc.v1); + qd.Set(3, rc.x2, rc.y2, 0, rc.u2, rc.v2); qd.Render(GL_TRIANGLE_STRIP); gl_RenderState.AlphaFunc(GL_GEQUAL, 0.5f); } diff --git a/src/hwrenderer/scene/hw_weapon.cpp b/src/hwrenderer/scene/hw_weapon.cpp index 5433674ae9..c2000bdf9d 100644 --- a/src/hwrenderer/scene/hw_weapon.cpp +++ b/src/hwrenderer/scene/hw_weapon.cpp @@ -33,6 +33,7 @@ #include "g_levellocals.h" #include "hw_weapon.h" #include "hw_fakeflat.h" +#include "hwrenderer/textures/hw_material.h" #include "hwrenderer/utility/hw_lighting.h" #include "hwrenderer/utility/hw_cvars.h" @@ -282,3 +283,85 @@ WeaponRenderStyle GetWeaponRenderStyle(DPSprite *psp, AActor *playermo) return r; } +//========================================================================== +// +// Coordinates +// +//========================================================================== + +bool GetWeaponRect(DPSprite *psp, float sx, float sy, player_t *player, WeaponRect &rc) +{ + float tx; + float x1, x2; + float scale; + float scalex; + float ftexturemid; + + // decide which patch to use + bool mirror; + FTextureID lump = sprites[psp->GetSprite()].GetSpriteFrame(psp->GetFrame(), 0, 0., &mirror); + if (!lump.isValid()) return false; + + FMaterial * tex = FMaterial::ValidateTexture(lump, true, false); + if (!tex) return false; + + float vw = (float)viewwidth; + float vh = (float)viewheight; + + FloatRect r; + tex->GetSpriteRect(&r); + + // calculate edges of the shape + scalex = (320.0f / (240.0f * r_viewwindow.WidescreenRatio)) * vw / 320; + + tx = (psp->Flags & PSPF_MIRROR) ? ((160 - r.width) - (sx + r.left)) : (sx - (160 - r.left)); + x1 = tx * scalex + vw / 2; + if (x1 > vw) return false; // off the right side + rc.x1 = x1 + viewwindowx; + + + tx += r.width; + x2 = tx * scalex + vw / 2; + if (x2 < 0) return false; // off the left side + rc.x2 = x2 + viewwindowx; + + // killough 12/98: fix psprite positioning problem + ftexturemid = 100.f - sy - r.top; + + AWeapon * wi = player->ReadyWeapon; + if (wi && wi->YAdjust != 0) + { + float fYAd = wi->YAdjust; + if (screenblocks >= 11) + { + ftexturemid -= fYAd; + } + else + { + ftexturemid -= float(StatusBar->GetDisplacement()) * fYAd; + } + } + + scale = (SCREENHEIGHT*vw) / (SCREENWIDTH * 200.0f); + rc.y1 = viewwindowy + vh / 2 - (ftexturemid * scale); + rc.y2 = rc.y1 + (r.height * scale) + 1; + + + if (!(mirror) != !(psp->Flags & (PSPF_FLIP))) + { + rc.u2 = tex->GetSpriteUL(); + rc.v1 = tex->GetSpriteVT(); + rc.u1 = tex->GetSpriteUR(); + rc.v2 = tex->GetSpriteVB(); + } + else + { + rc.u1 = tex->GetSpriteUL(); + rc.v1 = tex->GetSpriteVT(); + rc.u2 = tex->GetSpriteUR(); + rc.v2 = tex->GetSpriteVB(); + } + rc.tex = tex; + return true; +} + diff --git a/src/hwrenderer/scene/hw_weapon.h b/src/hwrenderer/scene/hw_weapon.h index e384d35616..a78cf1c2a8 100644 --- a/src/hwrenderer/scene/hw_weapon.h +++ b/src/hwrenderer/scene/hw_weapon.h @@ -28,9 +28,20 @@ struct WeaponRenderStyle int OverrideShader; }; +struct WeaponRect +{ + FMaterial *tex; + float x1, y1; + float x2, y2; + float u1, v1; + float u2, v2; +}; + + bool isBright(DPSprite *psp); WeaponPosition GetWeaponPosition(player_t *player); FVector2 BobWeapon(WeaponPosition &weap, DPSprite *psp); WeaponLighting GetWeaponLighting(sector_t *viewsector, const DVector3 &pos, int FixedColormap, area_t in_area, const DVector3 &playerpos ); WeaponRenderStyle GetWeaponRenderStyle(DPSprite *psp, AActor *playermo); +bool GetWeaponRect(DPSprite *psp, float sx, float sy, player_t *player, WeaponRect &rc);