From a2ad543877c51138cbcd4c04b84d2980a00ce154 Mon Sep 17 00:00:00 2001 From: Alexander Akulich Date: Fri, 7 Jul 2023 17:40:04 +0300 Subject: [PATCH 1/3] CHud: Refactor weapons rendering (1/3) --- src/game/client/components/hud.cpp | 36 +++++++++++++----------------- src/game/client/components/hud.h | 7 +----- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index c0f8a80a03d..e6161e4f947 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -750,20 +750,16 @@ void CHud::PreparePlayerStateQuads() m_AirjumpEmptyOffset = Graphics()->QuadContainerAddQuads(m_HudQuadContainerIndex, Array, 10); // Quads for displaying weapons - float ScaleX, ScaleY; - const float HudWeaponScale = 0.25f; - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[WEAPON_HAMMER].m_pSpriteBody, ScaleX, ScaleY); - m_WeaponHammerOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, g_pData->m_Weapons.m_aId[WEAPON_HAMMER].m_VisualSize * ScaleX * HudWeaponScale, g_pData->m_Weapons.m_aId[WEAPON_HAMMER].m_VisualSize * ScaleY * HudWeaponScale); - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[WEAPON_GUN].m_pSpriteBody, ScaleX, ScaleY); - m_WeaponGunOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, g_pData->m_Weapons.m_aId[WEAPON_GUN].m_VisualSize * ScaleX * HudWeaponScale, g_pData->m_Weapons.m_aId[WEAPON_GUN].m_VisualSize * ScaleY * HudWeaponScale); - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[WEAPON_SHOTGUN].m_pSpriteBody, ScaleX, ScaleY); - m_WeaponShotgunOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, g_pData->m_Weapons.m_aId[WEAPON_SHOTGUN].m_VisualSize * ScaleX * HudWeaponScale, g_pData->m_Weapons.m_aId[WEAPON_SHOTGUN].m_VisualSize * ScaleY * HudWeaponScale); - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[WEAPON_GRENADE].m_pSpriteBody, ScaleX, ScaleY); - m_WeaponGrenadeOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, g_pData->m_Weapons.m_aId[WEAPON_GRENADE].m_VisualSize * ScaleX * HudWeaponScale, g_pData->m_Weapons.m_aId[WEAPON_GRENADE].m_VisualSize * ScaleY * HudWeaponScale); - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[WEAPON_LASER].m_pSpriteBody, ScaleX, ScaleY); - m_WeaponLaserOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, g_pData->m_Weapons.m_aId[WEAPON_LASER].m_VisualSize * ScaleX * HudWeaponScale, g_pData->m_Weapons.m_aId[WEAPON_LASER].m_VisualSize * ScaleY * HudWeaponScale); - RenderTools()->GetSpriteScale(g_pData->m_Weapons.m_aId[WEAPON_NINJA].m_pSpriteBody, ScaleX, ScaleY); - m_WeaponNinjaOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, g_pData->m_Weapons.m_aId[WEAPON_NINJA].m_VisualSize * ScaleX * HudWeaponScale, g_pData->m_Weapons.m_aId[WEAPON_NINJA].m_VisualSize * ScaleY * HudWeaponScale); + for(int Weapon = 0; Weapon < NUM_WEAPONS; ++Weapon) + { + const CDataWeaponspec &WeaponSpec = g_pData->m_Weapons.m_aId[Weapon]; + float ScaleX, ScaleY; + RenderTools()->GetSpriteScale(WeaponSpec.m_pSpriteBody, ScaleX, ScaleY); + constexpr float HudWeaponScale = 0.25f; + float Width = WeaponSpec.m_VisualSize * ScaleX * HudWeaponScale; + float Height = WeaponSpec.m_VisualSize * ScaleY * HudWeaponScale; + m_aWeaponOffset[Weapon] = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, Width, Height); + } // Quads for displaying capabilities m_EndlessJumpOffset = RenderTools()->QuadContainerAddSprite(m_HudQuadContainerIndex, 0.f, 0.f, 12.f, 12.f); @@ -888,7 +884,7 @@ void CHud::RenderPlayerState(const int ClientID) x -= 3; Graphics()->QuadsSetRotation(pi * 7 / 4); Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupHammer); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_WeaponHammerOffset, x, y); + Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_HAMMER], x, y); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); x += 16; @@ -901,7 +897,7 @@ void CHud::RenderPlayerState(const int ClientID) } Graphics()->QuadsSetRotation(pi * 7 / 4); Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupGun); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_WeaponGunOffset, x, y); + Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_GUN], x, y); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); x += 12; @@ -914,7 +910,7 @@ void CHud::RenderPlayerState(const int ClientID) } Graphics()->QuadsSetRotation(pi * 7 / 4); Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupShotgun); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_WeaponShotgunOffset, x, y); + Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_SHOTGUN], x, y); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); x += 12; @@ -927,7 +923,7 @@ void CHud::RenderPlayerState(const int ClientID) } Graphics()->QuadsSetRotation(pi * 7 / 4); Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupGrenade); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_WeaponGrenadeOffset, x, y); + Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_GRENADE], x, y); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); x += 12; @@ -940,7 +936,7 @@ void CHud::RenderPlayerState(const int ClientID) } Graphics()->QuadsSetRotation(pi * 7 / 4); Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupLaser); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_WeaponLaserOffset, x, y); + Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_LASER], x, y); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); x += 12; @@ -953,7 +949,7 @@ void CHud::RenderPlayerState(const int ClientID) } Graphics()->QuadsSetRotation(pi * 7 / 4); Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupNinja); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_WeaponNinjaOffset, x, y); + Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_NINJA], x, y); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); diff --git a/src/game/client/components/hud.h b/src/game/client/components/hud.h index 16f5f257efa..f292dd0b1c0 100644 --- a/src/game/client/components/hud.h +++ b/src/game/client/components/hud.h @@ -111,12 +111,7 @@ class CHud : public CComponent int m_FlagOffset; int m_AirjumpOffset; int m_AirjumpEmptyOffset; - int m_WeaponHammerOffset; - int m_WeaponGunOffset; - int m_WeaponShotgunOffset; - int m_WeaponGrenadeOffset; - int m_WeaponLaserOffset; - int m_WeaponNinjaOffset; + int m_aWeaponOffset[NUM_WEAPONS]; int m_EndlessJumpOffset; int m_EndlessHookOffset; int m_JetpackOffset; From ba7be6982dec0d9163dfc173bdfb9cb3c938ed72 Mon Sep 17 00:00:00 2001 From: Alexander Akulich Date: Fri, 7 Jul 2023 20:11:19 +0300 Subject: [PATCH 2/3] CHud::RenderPlayerState: Split ninja state rendering --- src/game/client/components/hud.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index e6161e4f947..fef787aa5e9 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -952,12 +952,14 @@ void CHud::RenderPlayerState(const int ClientID) Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_NINJA], x, y); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - + x += 12; + } + if(pCharacter->m_aWeapons[WEAPON_NINJA].m_Got) + { const int Max = g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000; float NinjaProgress = clamp(pCharacter->m_Ninja.m_ActivationTick + g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000 - Client()->GameTick(g_Config.m_ClDummy), 0, Max) / (float)Max; if(NinjaProgress > 0.0f && m_pClient->m_Snap.m_aCharacters[ClientID].m_HasExtendedDisplayInfo) { - x += 12; RenderNinjaBarPos(x, y - 12, 6.f, 24.f, NinjaProgress); } } From bf956c4c1ccbb8b4d6b68304753359d7a3697b5b Mon Sep 17 00:00:00 2001 From: Alexander Akulich Date: Fri, 7 Jul 2023 20:54:39 +0300 Subject: [PATCH 3/3] CHud::RenderPlayerState: Rework weapons rendering (+provide offsets) --- src/game/client/components/hud.cpp | 108 +++++++---------------------- 1 file changed, 26 insertions(+), 82 deletions(-) diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index fef787aa5e9..c32bbb17494 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -875,92 +875,36 @@ void CHud::RenderPlayerState(const int ClientID) (GameClient()->m_GameInfo.m_HudAmmo && g_Config.m_ClShowhudHealthAmmo ? 12 : 0)); // render weapons - if(pCharacter->m_aWeapons[WEAPON_HAMMER].m_Got) { - if(pPlayer->m_Weapon != WEAPON_HAMMER) + constexpr float aWeaponWidth[NUM_WEAPONS] = {16, 12, 12, 12, 12, 12}; + constexpr float aWeaponInitialOffset[NUM_WEAPONS] = {-3, -4, -1, -1, -2, -4}; + bool InitialOffsetAdded = false; + for(int Weapon = 0; Weapon < NUM_WEAPONS; ++Weapon) { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - } - x -= 3; - Graphics()->QuadsSetRotation(pi * 7 / 4); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupHammer); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_HAMMER], x, y); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - x += 16; - } - if(pCharacter->m_aWeapons[WEAPON_GUN].m_Got) - { - if(pPlayer->m_Weapon != WEAPON_GUN) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - } - Graphics()->QuadsSetRotation(pi * 7 / 4); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupGun); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_GUN], x, y); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - x += 12; - } - if(pCharacter->m_aWeapons[WEAPON_SHOTGUN].m_Got) - { - if(pPlayer->m_Weapon != WEAPON_SHOTGUN) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - } - Graphics()->QuadsSetRotation(pi * 7 / 4); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupShotgun); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_SHOTGUN], x, y); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - x += 12; - } - if(pCharacter->m_aWeapons[WEAPON_GRENADE].m_Got) - { - if(pPlayer->m_Weapon != WEAPON_GRENADE) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - } - Graphics()->QuadsSetRotation(pi * 7 / 4); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupGrenade); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_GRENADE], x, y); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - x += 12; - } - if(pCharacter->m_aWeapons[WEAPON_LASER].m_Got) - { - if(pPlayer->m_Weapon != WEAPON_LASER) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); - } - Graphics()->QuadsSetRotation(pi * 7 / 4); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupLaser); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_LASER], x, y); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - x += 12; - } - if(pCharacter->m_aWeapons[WEAPON_NINJA].m_Got) - { - if(pPlayer->m_Weapon != WEAPON_NINJA) - { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); + if(!pCharacter->m_aWeapons[Weapon].m_Got) + continue; + if(!InitialOffsetAdded) + { + x += aWeaponInitialOffset[Weapon]; + InitialOffsetAdded = true; + } + if(pPlayer->m_Weapon != Weapon) + Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); + Graphics()->QuadsSetRotation(pi * 7 / 4); + Graphics()->TextureSet(m_pClient->m_GameSkin.m_aSpritePickupWeapons[Weapon]); + Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[Weapon], x, y); + Graphics()->QuadsSetRotation(0); + Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); + x += aWeaponWidth[Weapon]; } - Graphics()->QuadsSetRotation(pi * 7 / 4); - Graphics()->TextureSet(m_pClient->m_GameSkin.m_SpritePickupNinja); - Graphics()->RenderQuadContainerAsSprite(m_HudQuadContainerIndex, m_aWeaponOffset[WEAPON_NINJA], x, y); - Graphics()->QuadsSetRotation(0); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - x += 12; - } - if(pCharacter->m_aWeapons[WEAPON_NINJA].m_Got) - { - const int Max = g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000; - float NinjaProgress = clamp(pCharacter->m_Ninja.m_ActivationTick + g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000 - Client()->GameTick(g_Config.m_ClDummy), 0, Max) / (float)Max; - if(NinjaProgress > 0.0f && m_pClient->m_Snap.m_aCharacters[ClientID].m_HasExtendedDisplayInfo) + if(pCharacter->m_aWeapons[WEAPON_NINJA].m_Got) { - RenderNinjaBarPos(x, y - 12, 6.f, 24.f, NinjaProgress); + const int Max = g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000; + float NinjaProgress = clamp(pCharacter->m_Ninja.m_ActivationTick + g_pData->m_Weapons.m_Ninja.m_Duration * Client()->GameTickSpeed() / 1000 - Client()->GameTick(g_Config.m_ClDummy), 0, Max) / (float)Max; + if(NinjaProgress > 0.0f && m_pClient->m_Snap.m_aCharacters[ClientID].m_HasExtendedDisplayInfo) + { + RenderNinjaBarPos(x, y - 12, 6.f, 24.f, NinjaProgress); + } } }