2010-11-20 10:37:14 +00:00
|
|
|
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
|
|
|
|
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
2018-03-21 14:53:29 +00:00
|
|
|
#include <engine/graphics.h>
|
2010-05-29 07:25:38 +00:00
|
|
|
#include <engine/shared/config.h>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <engine/textrender.h>
|
2022-06-17 17:26:59 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
#include <game/generated/client_data.h>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <game/generated/protocol.h>
|
2008-09-04 18:54:37 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <game/client/gameclient.h>
|
2022-05-29 16:33:38 +00:00
|
|
|
#include <game/client/prediction/entities/character.h>
|
2008-09-04 18:54:37 +00:00
|
|
|
|
2022-06-17 17:26:59 +00:00
|
|
|
#include "camera.h"
|
|
|
|
#include "controls.h"
|
|
|
|
#include "nameplates.h"
|
2018-03-13 20:55:47 +00:00
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
void CNamePlates::RenderNameplate(
|
|
|
|
const CNetObj_Character *pPrevChar,
|
|
|
|
const CNetObj_Character *pPlayerChar,
|
2020-09-26 19:41:58 +00:00
|
|
|
const CNetObj_PlayerInfo *pPlayerInfo)
|
2008-09-04 18:54:37 +00:00
|
|
|
{
|
2018-03-13 20:55:47 +00:00
|
|
|
int ClientID = pPlayerInfo->m_ClientID;
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2018-03-13 20:55:47 +00:00
|
|
|
vec2 Position;
|
2019-04-11 22:46:54 +00:00
|
|
|
if(ClientID >= 0 && ClientID < MAX_CLIENTS)
|
|
|
|
Position = m_pClient->m_aClients[ClientID].m_RenderPos;
|
2018-03-13 20:55:47 +00:00
|
|
|
else
|
2020-02-19 10:24:58 +00:00
|
|
|
Position = mix(vec2(pPrevChar->m_X, pPrevChar->m_Y), vec2(pPlayerChar->m_X, pPlayerChar->m_Y), Client()->IntraGameTick(g_Config.m_ClDummy));
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2020-06-25 12:56:23 +00:00
|
|
|
RenderNameplatePos(Position, pPlayerInfo, 1.0f);
|
|
|
|
}
|
|
|
|
|
2021-08-29 00:56:00 +00:00
|
|
|
void CNamePlates::RenderNameplatePos(vec2 Position, const CNetObj_PlayerInfo *pPlayerInfo, float Alpha, bool ForceAlpha)
|
2020-06-25 12:56:23 +00:00
|
|
|
{
|
|
|
|
int ClientID = pPlayerInfo->m_ClientID;
|
2020-06-24 17:01:01 +00:00
|
|
|
|
2019-07-16 20:34:18 +00:00
|
|
|
bool OtherTeam = m_pClient->IsOtherTeam(ClientID);
|
2014-01-24 22:11:33 +00:00
|
|
|
|
2011-01-04 12:11:01 +00:00
|
|
|
float FontSize = 18.0f + 20.0f * g_Config.m_ClNameplatesSize / 100.0f;
|
2015-06-29 00:06:27 +00:00
|
|
|
float FontSizeClan = 18.0f + 20.0f * g_Config.m_ClNameplatesClanSize / 100.0f;
|
2019-07-13 10:25:54 +00:00
|
|
|
|
2021-01-05 13:25:49 +00:00
|
|
|
TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_NO_FIRST_CHARACTER_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_LAST_CHARACTER_ADVANCE);
|
|
|
|
float YOffset = Position.y - 38;
|
|
|
|
ColorRGBA rgb = ColorRGBA(1.0f, 1.0f, 1.0f);
|
|
|
|
|
2022-02-11 13:03:16 +00:00
|
|
|
// render players' key presses
|
|
|
|
int ShowDirection = g_Config.m_ClShowDirection;
|
|
|
|
#if defined(CONF_VIDEORECORDER)
|
|
|
|
if(IVideo::Current())
|
|
|
|
ShowDirection = g_Config.m_ClVideoShowDirection;
|
|
|
|
#endif
|
|
|
|
if((pPlayerInfo->m_Local && ShowDirection == 2) || (!pPlayerInfo->m_Local && ShowDirection >= 1))
|
|
|
|
{
|
2022-02-19 12:31:34 +00:00
|
|
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
Graphics()->QuadsSetRotation(0);
|
|
|
|
|
2022-02-11 13:03:16 +00:00
|
|
|
const float ShowDirectionImgSize = 22.0f;
|
2022-02-15 10:59:07 +00:00
|
|
|
YOffset -= ShowDirectionImgSize;
|
|
|
|
vec2 ShowDirectionPos = vec2(Position.x - 11.0f, YOffset);
|
2022-02-11 13:03:16 +00:00
|
|
|
|
|
|
|
if(m_pClient->m_Snap.m_aCharacters[pPlayerInfo->m_ClientID].m_Cur.m_Direction == -1)
|
|
|
|
{
|
|
|
|
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_ARROW].m_Id);
|
|
|
|
Graphics()->QuadsSetRotation(pi);
|
|
|
|
Graphics()->RenderQuadContainerAsSprite(m_DirectionQuadContainerIndex, 0, ShowDirectionPos.x - 30.f, ShowDirectionPos.y);
|
|
|
|
}
|
|
|
|
else if(m_pClient->m_Snap.m_aCharacters[pPlayerInfo->m_ClientID].m_Cur.m_Direction == 1)
|
|
|
|
{
|
|
|
|
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_ARROW].m_Id);
|
|
|
|
Graphics()->RenderQuadContainerAsSprite(m_DirectionQuadContainerIndex, 0, ShowDirectionPos.x + 30.f, ShowDirectionPos.y);
|
|
|
|
}
|
|
|
|
if(m_pClient->m_Snap.m_aCharacters[pPlayerInfo->m_ClientID].m_Cur.m_Jumped & 1)
|
|
|
|
{
|
|
|
|
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_ARROW].m_Id);
|
|
|
|
Graphics()->QuadsSetRotation(pi * 3 / 2);
|
|
|
|
Graphics()->RenderQuadContainerAsSprite(m_DirectionQuadContainerIndex, 0, ShowDirectionPos.x, ShowDirectionPos.y);
|
|
|
|
}
|
|
|
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
Graphics()->QuadsSetRotation(0);
|
|
|
|
}
|
|
|
|
|
2008-09-04 18:54:37 +00:00
|
|
|
// render name plate
|
2022-02-19 12:31:34 +00:00
|
|
|
if((!pPlayerInfo->m_Local || g_Config.m_ClNameplatesOwn) && g_Config.m_ClNameplates)
|
2008-09-04 18:54:37 +00:00
|
|
|
{
|
|
|
|
float a = 1;
|
2010-05-29 07:25:38 +00:00
|
|
|
if(g_Config.m_ClNameplatesAlways == 0)
|
2021-07-12 09:43:56 +00:00
|
|
|
a = clamp(1 - powf(distance(m_pClient->m_Controls.m_TargetPos[g_Config.m_ClDummy], Position) / 200.0f, 16.0f), 0.0f, 1.0f);
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2018-08-03 21:40:03 +00:00
|
|
|
const char *pName = m_pClient->m_aClients[pPlayerInfo->m_ClientID].m_aName;
|
2018-03-13 20:55:47 +00:00
|
|
|
if(str_comp(pName, m_aNamePlates[ClientID].m_aName) != 0 || FontSize != m_aNamePlates[ClientID].m_NameTextFontSize)
|
|
|
|
{
|
|
|
|
mem_copy(m_aNamePlates[ClientID].m_aName, pName, sizeof(m_aNamePlates[ClientID].m_aName));
|
|
|
|
m_aNamePlates[ClientID].m_NameTextFontSize = FontSize;
|
|
|
|
|
|
|
|
if(m_aNamePlates[ClientID].m_NameTextContainerIndex != -1)
|
|
|
|
TextRender()->DeleteTextContainer(m_aNamePlates[ClientID].m_NameTextContainerIndex);
|
|
|
|
|
|
|
|
CTextCursor Cursor;
|
|
|
|
TextRender()->SetCursor(&Cursor, 0, 0, FontSize, TEXTFLAG_RENDER);
|
|
|
|
Cursor.m_LineWidth = -1;
|
|
|
|
|
2018-03-21 14:53:29 +00:00
|
|
|
// create nameplates at standard zoom
|
|
|
|
float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
|
|
|
|
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
|
2022-05-17 13:00:06 +00:00
|
|
|
RenderTools()->MapScreenToGroup(m_pClient->m_Camera.m_Center.x, m_pClient->m_Camera.m_Center.y, Layers()->GameGroup());
|
2019-06-28 18:23:01 +00:00
|
|
|
|
2020-07-15 19:10:13 +00:00
|
|
|
m_aNamePlates[ClientID].m_NameTextWidth = TextRender()->TextWidth(0, FontSize, pName, -1, -1.0f);
|
2019-06-28 18:23:01 +00:00
|
|
|
|
2018-03-13 20:55:47 +00:00
|
|
|
m_aNamePlates[ClientID].m_NameTextContainerIndex = TextRender()->CreateTextContainer(&Cursor, pName);
|
2018-03-21 14:53:29 +00:00
|
|
|
Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1);
|
2018-03-13 20:55:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(g_Config.m_ClNameplatesClan)
|
|
|
|
{
|
|
|
|
const char *pClan = m_pClient->m_aClients[ClientID].m_aClan;
|
|
|
|
if(str_comp(pClan, m_aNamePlates[ClientID].m_aClanName) != 0 || FontSizeClan != m_aNamePlates[ClientID].m_ClanNameTextFontSize)
|
|
|
|
{
|
|
|
|
mem_copy(m_aNamePlates[ClientID].m_aClanName, pClan, sizeof(m_aNamePlates[ClientID].m_aClanName));
|
|
|
|
m_aNamePlates[ClientID].m_ClanNameTextFontSize = FontSizeClan;
|
|
|
|
|
|
|
|
if(m_aNamePlates[ClientID].m_ClanNameTextContainerIndex != -1)
|
|
|
|
TextRender()->DeleteTextContainer(m_aNamePlates[ClientID].m_ClanNameTextContainerIndex);
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2018-03-13 20:55:47 +00:00
|
|
|
CTextCursor Cursor;
|
|
|
|
TextRender()->SetCursor(&Cursor, 0, 0, FontSizeClan, TEXTFLAG_RENDER);
|
|
|
|
Cursor.m_LineWidth = -1;
|
|
|
|
|
2018-03-21 14:53:29 +00:00
|
|
|
// create nameplates at standard zoom
|
|
|
|
float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
|
|
|
|
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
|
2022-05-17 13:00:06 +00:00
|
|
|
RenderTools()->MapScreenToGroup(m_pClient->m_Camera.m_Center.x, m_pClient->m_Camera.m_Center.y, Layers()->GameGroup());
|
2019-06-28 18:23:01 +00:00
|
|
|
|
2020-07-15 19:10:13 +00:00
|
|
|
m_aNamePlates[ClientID].m_ClanNameTextWidth = TextRender()->TextWidth(0, FontSizeClan, pClan, -1, -1.0f);
|
2019-07-03 10:29:42 +00:00
|
|
|
|
2018-03-13 20:55:47 +00:00
|
|
|
m_aNamePlates[ClientID].m_ClanNameTextContainerIndex = TextRender()->CreateTextContainer(&Cursor, pClan);
|
2018-03-21 14:53:29 +00:00
|
|
|
Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1);
|
2018-03-13 20:55:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
float tw = m_aNamePlates[ClientID].m_NameTextWidth;
|
|
|
|
if(g_Config.m_ClNameplatesTeamcolors && m_pClient->m_Teams.Team(ClientID))
|
2019-04-26 12:06:32 +00:00
|
|
|
rgb = color_cast<ColorRGBA>(ColorHSLA(m_pClient->m_Teams.Team(ClientID) / 64.0f, 1.0f, 0.75f));
|
2018-03-13 20:55:47 +00:00
|
|
|
|
2022-07-01 04:42:36 +00:00
|
|
|
ColorRGBA TColor;
|
|
|
|
ColorRGBA TOutlineColor;
|
2014-04-12 14:55:01 +00:00
|
|
|
|
2021-08-29 00:56:00 +00:00
|
|
|
if(OtherTeam && !ForceAlpha)
|
2014-01-24 22:11:33 +00:00
|
|
|
{
|
2022-07-01 04:42:36 +00:00
|
|
|
TOutlineColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.2f * g_Config.m_ClShowOthersAlpha / 100.0f);
|
|
|
|
TColor = ColorRGBA(rgb.r, rgb.g, rgb.b, g_Config.m_ClShowOthersAlpha / 100.0f);
|
2014-01-24 22:11:33 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-07-01 04:42:36 +00:00
|
|
|
TOutlineColor = ColorRGBA(0.0f, 0.0f, 0.0f, 0.5f * a);
|
|
|
|
TColor = ColorRGBA(rgb.r, rgb.g, rgb.b, a);
|
2014-01-24 22:11:33 +00:00
|
|
|
}
|
2020-09-26 19:41:58 +00:00
|
|
|
if(g_Config.m_ClNameplatesTeamcolors && m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS)
|
2010-12-15 12:31:27 +00:00
|
|
|
{
|
2018-03-13 20:55:47 +00:00
|
|
|
if(m_pClient->m_aClients[ClientID].m_Team == TEAM_RED)
|
2022-07-01 04:42:36 +00:00
|
|
|
TColor = ColorRGBA(1.0f, 0.5f, 0.5f, a);
|
2018-03-13 20:55:47 +00:00
|
|
|
else if(m_pClient->m_aClients[ClientID].m_Team == TEAM_BLUE)
|
2022-07-01 04:42:36 +00:00
|
|
|
TColor = ColorRGBA(0.7f, 0.7f, 1.0f, a);
|
2010-12-15 12:31:27 +00:00
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2022-07-01 04:42:36 +00:00
|
|
|
TOutlineColor.a *= Alpha;
|
|
|
|
TColor.a *= Alpha;
|
2020-06-25 12:56:23 +00:00
|
|
|
|
2018-03-13 20:55:47 +00:00
|
|
|
if(m_aNamePlates[ClientID].m_NameTextContainerIndex != -1)
|
2020-08-29 23:06:31 +00:00
|
|
|
{
|
2020-08-30 11:54:42 +00:00
|
|
|
YOffset -= FontSize;
|
2022-07-01 04:42:36 +00:00
|
|
|
TextRender()->RenderTextContainer(m_aNamePlates[ClientID].m_NameTextContainerIndex, TColor, TOutlineColor, Position.x - tw / 2.0f, YOffset);
|
2020-08-29 23:06:31 +00:00
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2015-06-21 22:34:10 +00:00
|
|
|
if(g_Config.m_ClNameplatesClan)
|
2015-06-21 22:44:26 +00:00
|
|
|
{
|
2020-08-30 11:54:42 +00:00
|
|
|
YOffset -= FontSizeClan;
|
2018-03-13 20:55:47 +00:00
|
|
|
if(m_aNamePlates[ClientID].m_ClanNameTextContainerIndex != -1)
|
2022-07-01 04:42:36 +00:00
|
|
|
TextRender()->RenderTextContainer(m_aNamePlates[ClientID].m_ClanNameTextContainerIndex, TColor, TOutlineColor, Position.x - m_aNamePlates[ClientID].m_ClanNameTextWidth / 2.0f, YOffset);
|
2020-08-29 23:06:31 +00:00
|
|
|
}
|
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
if(g_Config.m_ClNameplatesFriendMark && m_pClient->m_aClients[ClientID].m_Friend)
|
2020-08-29 23:06:31 +00:00
|
|
|
{
|
2020-08-30 11:54:42 +00:00
|
|
|
YOffset -= FontSize;
|
2020-09-26 19:41:58 +00:00
|
|
|
char aFriendMark[] = "♥";
|
2020-09-02 16:10:48 +00:00
|
|
|
TextRender()->TextColor(ColorRGBA(1.0f, 0.0f, 0.0f));
|
2020-09-26 19:41:58 +00:00
|
|
|
float XOffSet = TextRender()->TextWidth(0, FontSize, aFriendMark, -1, -1.0f) / 2.0f;
|
|
|
|
TextRender()->Text(0, Position.x - XOffSet, YOffset, FontSize, aFriendMark, -1.0f);
|
2015-06-21 22:44:26 +00:00
|
|
|
}
|
2015-06-21 22:34:10 +00:00
|
|
|
|
2020-05-30 10:37:42 +00:00
|
|
|
if(g_Config.m_Debug || g_Config.m_ClNameplatesIDs) // render client id when in debug as well
|
2008-09-04 18:54:37 +00:00
|
|
|
{
|
2020-08-30 11:54:42 +00:00
|
|
|
YOffset -= FontSize;
|
2010-05-29 07:25:38 +00:00
|
|
|
char aBuf[128];
|
2020-09-26 19:41:58 +00:00
|
|
|
str_format(aBuf, sizeof(aBuf), "%d", pPlayerInfo->m_ClientID);
|
|
|
|
float XOffset = TextRender()->TextWidth(0, FontSize, aBuf, -1, -1.0f) / 2.0f;
|
2020-05-30 10:37:42 +00:00
|
|
|
TextRender()->TextColor(rgb);
|
2020-09-26 19:41:58 +00:00
|
|
|
TextRender()->Text(0, Position.x - XOffset, YOffset, FontSize, aBuf, -1.0f);
|
2008-09-04 18:54:37 +00:00
|
|
|
}
|
2021-01-05 13:25:49 +00:00
|
|
|
}
|
2020-07-08 05:34:24 +00:00
|
|
|
|
2022-02-19 12:31:34 +00:00
|
|
|
if((g_Config.m_Debug || g_Config.m_ClNameplatesStrong) && g_Config.m_ClNameplates)
|
2021-01-05 13:25:49 +00:00
|
|
|
{
|
2022-03-14 12:25:47 +00:00
|
|
|
if(m_pClient->m_Snap.m_LocalClientID != -1 && m_pClient->m_Snap.m_aCharacters[pPlayerInfo->m_ClientID].m_HasExtendedData && m_pClient->m_Snap.m_aCharacters[m_pClient->m_Snap.m_LocalClientID].m_HasExtendedData)
|
2021-01-05 13:25:49 +00:00
|
|
|
{
|
2021-08-17 16:33:14 +00:00
|
|
|
CCharacter *pLocalChar = m_pClient->m_GameWorld.GetCharacterByID(m_pClient->m_Snap.m_LocalClientID);
|
|
|
|
CCharacter *pCharacter = m_pClient->m_GameWorld.GetCharacterByID(pPlayerInfo->m_ClientID);
|
|
|
|
if(pCharacter && pLocalChar)
|
2021-07-20 17:39:44 +00:00
|
|
|
{
|
2021-08-17 16:33:14 +00:00
|
|
|
if(pPlayerInfo->m_Local)
|
|
|
|
TextRender()->TextColor(rgb);
|
|
|
|
else
|
2021-08-13 22:48:49 +00:00
|
|
|
{
|
2021-08-27 12:54:05 +00:00
|
|
|
float ScaleX, ScaleY;
|
|
|
|
const float StrongWeakImgSize = 40.0f;
|
2021-08-17 16:33:14 +00:00
|
|
|
Graphics()->TextureClear();
|
2021-08-27 12:54:05 +00:00
|
|
|
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_STRONGWEAK].m_Id);
|
|
|
|
Graphics()->QuadsBegin();
|
|
|
|
ColorRGBA StrongWeakStatusColor;
|
|
|
|
int StrongWeakSpriteID;
|
2021-08-17 16:33:14 +00:00
|
|
|
if(pLocalChar->GetStrongWeakID() > pCharacter->GetStrongWeakID())
|
|
|
|
{
|
2021-08-27 12:54:05 +00:00
|
|
|
StrongWeakStatusColor = color_cast<ColorRGBA>(ColorHSLA(6401973));
|
|
|
|
StrongWeakSpriteID = SPRITE_HOOK_STRONG;
|
2021-08-17 16:33:14 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-08-27 12:54:05 +00:00
|
|
|
StrongWeakStatusColor = color_cast<ColorRGBA>(ColorHSLA(41131));
|
|
|
|
StrongWeakSpriteID = SPRITE_HOOK_WEAK;
|
2021-08-17 16:33:14 +00:00
|
|
|
}
|
2021-08-27 12:54:05 +00:00
|
|
|
Graphics()->SetColor(StrongWeakStatusColor);
|
|
|
|
RenderTools()->SelectSprite(StrongWeakSpriteID);
|
|
|
|
RenderTools()->GetSpriteScale(StrongWeakSpriteID, ScaleX, ScaleY);
|
|
|
|
TextRender()->TextColor(StrongWeakStatusColor);
|
|
|
|
|
|
|
|
YOffset -= StrongWeakImgSize * ScaleY;
|
|
|
|
RenderTools()->DrawSprite(Position.x, YOffset + (StrongWeakImgSize / 2.0f) * ScaleY, StrongWeakImgSize);
|
2021-08-17 16:33:14 +00:00
|
|
|
Graphics()->QuadsEnd();
|
2021-08-13 22:48:49 +00:00
|
|
|
}
|
2021-08-17 16:33:14 +00:00
|
|
|
if(g_Config.m_Debug || g_Config.m_ClNameplatesStrong == 2)
|
2021-08-13 22:48:49 +00:00
|
|
|
{
|
2021-08-27 12:54:05 +00:00
|
|
|
YOffset -= FontSize;
|
2021-08-17 16:33:14 +00:00
|
|
|
char aBuf[12];
|
|
|
|
str_format(aBuf, sizeof(aBuf), "%d", pCharacter->GetStrongWeakID());
|
|
|
|
float XOffset = TextRender()->TextWidth(0, FontSize, aBuf, -1, -1.0f) / 2.0f;
|
|
|
|
TextRender()->Text(0, Position.x - XOffset, YOffset, FontSize, aBuf, -1.0f);
|
2021-08-13 22:48:49 +00:00
|
|
|
}
|
2021-07-20 17:39:44 +00:00
|
|
|
}
|
2021-01-05 13:25:49 +00:00
|
|
|
}
|
2008-09-04 18:54:37 +00:00
|
|
|
}
|
2021-01-05 13:25:49 +00:00
|
|
|
|
|
|
|
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
|
|
|
TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor());
|
|
|
|
|
|
|
|
TextRender()->SetRenderFlags(0);
|
2008-09-04 18:54:37 +00:00
|
|
|
}
|
|
|
|
|
2010-05-29 07:25:38 +00:00
|
|
|
void CNamePlates::OnRender()
|
2008-09-04 18:54:37 +00:00
|
|
|
{
|
2022-02-19 12:31:34 +00:00
|
|
|
int ShowDirection = g_Config.m_ClShowDirection;
|
|
|
|
#if defined(CONF_VIDEORECORDER)
|
|
|
|
if(IVideo::Current())
|
|
|
|
ShowDirection = g_Config.m_ClVideoShowDirection;
|
|
|
|
#endif
|
|
|
|
if(!g_Config.m_ClNameplates && ShowDirection == 0)
|
2008-09-04 18:54:37 +00:00
|
|
|
return;
|
2008-09-23 08:42:38 +00:00
|
|
|
|
2022-03-22 16:20:21 +00:00
|
|
|
// get screen edges to avoid rendering offscreen
|
|
|
|
float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
|
|
|
|
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
|
|
|
|
// expand the edges to prevent popping in/out onscreen
|
2022-03-24 13:36:17 +00:00
|
|
|
//
|
|
|
|
// it is assumed that the nameplate and all its components fit into a 800x800 box placed directly above the tee
|
|
|
|
// this may need to be changed or calculated differently in the future
|
|
|
|
ScreenX0 -= 400;
|
|
|
|
ScreenX1 += 400;
|
|
|
|
//ScreenY0 -= 0;
|
|
|
|
ScreenY1 += 800;
|
2022-03-22 16:20:21 +00:00
|
|
|
|
2008-09-23 08:42:38 +00:00
|
|
|
for(int i = 0; i < MAX_CLIENTS; i++)
|
2008-09-04 18:54:37 +00:00
|
|
|
{
|
2020-10-15 13:35:00 +00:00
|
|
|
const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paPlayerInfos[i];
|
2020-06-25 12:56:23 +00:00
|
|
|
if(!pInfo)
|
|
|
|
{
|
2008-09-23 08:42:38 +00:00
|
|
|
continue;
|
2020-06-25 12:56:23 +00:00
|
|
|
}
|
2008-09-04 18:54:37 +00:00
|
|
|
|
2022-05-21 17:22:50 +00:00
|
|
|
vec2 *pRenderPos;
|
2022-04-12 21:30:26 +00:00
|
|
|
if(m_pClient->m_aClients[i].m_SpecCharPresent)
|
|
|
|
{
|
2022-05-21 17:22:50 +00:00
|
|
|
// Each player can also have a spec char whose nameplate is displayed independently
|
2022-04-12 21:30:26 +00:00
|
|
|
pRenderPos = &m_pClient->m_aClients[i].m_SpecChar;
|
2022-05-21 17:22:50 +00:00
|
|
|
// don't render offscreen
|
|
|
|
if(!(pRenderPos->x < ScreenX0) && !(pRenderPos->x > ScreenX1) && !(pRenderPos->y < ScreenY0) && !(pRenderPos->y > ScreenY1))
|
|
|
|
{
|
|
|
|
RenderNameplatePos(m_pClient->m_aClients[i].m_SpecChar, pInfo, 0.4f, true);
|
|
|
|
}
|
2022-04-12 21:30:26 +00:00
|
|
|
}
|
2022-05-21 17:22:50 +00:00
|
|
|
if(m_pClient->m_Snap.m_aCharacters[i].m_Active)
|
2008-09-23 08:42:38 +00:00
|
|
|
{
|
2022-05-21 17:22:50 +00:00
|
|
|
// Only render nameplates for active characters
|
|
|
|
pRenderPos = &m_pClient->m_aClients[i].m_RenderPos;
|
|
|
|
// don't render offscreen
|
|
|
|
if(!(pRenderPos->x < ScreenX0) && !(pRenderPos->x > ScreenX1) && !(pRenderPos->y < ScreenY0) && !(pRenderPos->y > ScreenY1))
|
|
|
|
{
|
|
|
|
RenderNameplate(
|
|
|
|
&m_pClient->m_Snap.m_aCharacters[i].m_Prev,
|
|
|
|
&m_pClient->m_Snap.m_aCharacters[i].m_Cur,
|
|
|
|
pInfo);
|
|
|
|
}
|
2008-09-04 18:54:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-03-13 20:55:47 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
void CNamePlates::SetPlayers(CPlayers *pPlayers)
|
2018-03-13 20:55:47 +00:00
|
|
|
{
|
|
|
|
m_pPlayers = pPlayers;
|
|
|
|
}
|
|
|
|
|
2018-03-21 14:53:29 +00:00
|
|
|
void CNamePlates::ResetNamePlates()
|
2018-03-13 20:55:47 +00:00
|
|
|
{
|
2020-10-26 14:14:07 +00:00
|
|
|
for(auto &NamePlate : m_aNamePlates)
|
2018-03-13 20:55:47 +00:00
|
|
|
{
|
2020-10-26 14:14:07 +00:00
|
|
|
if(NamePlate.m_NameTextContainerIndex != -1)
|
|
|
|
TextRender()->DeleteTextContainer(NamePlate.m_NameTextContainerIndex);
|
|
|
|
if(NamePlate.m_ClanNameTextContainerIndex != -1)
|
|
|
|
TextRender()->DeleteTextContainer(NamePlate.m_ClanNameTextContainerIndex);
|
2018-03-13 20:55:47 +00:00
|
|
|
|
2020-10-26 14:14:07 +00:00
|
|
|
NamePlate.Reset();
|
2018-03-13 20:55:47 +00:00
|
|
|
}
|
2018-03-21 14:53:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CNamePlates::OnWindowResize()
|
|
|
|
{
|
|
|
|
ResetNamePlates();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CNamePlates::OnInit()
|
|
|
|
{
|
|
|
|
ResetNamePlates();
|
2022-02-11 13:03:16 +00:00
|
|
|
|
2022-03-20 13:18:02 +00:00
|
|
|
// Quad for the direction arrows above the player
|
2022-02-11 13:03:16 +00:00
|
|
|
m_DirectionQuadContainerIndex = Graphics()->CreateQuadContainer(false);
|
2022-03-20 13:18:02 +00:00
|
|
|
RenderTools()->QuadContainerAddSprite(m_DirectionQuadContainerIndex, 0.f, 0.f, 22.f);
|
2022-02-11 13:03:16 +00:00
|
|
|
Graphics()->QuadContainerUpload(m_DirectionQuadContainerIndex);
|
2018-03-13 20:55:47 +00:00
|
|
|
}
|