176 lines
4.1 KiB
C++
176 lines
4.1 KiB
C++
/***
|
|
*
|
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
|
*
|
|
* This product contains software technology licensed from Id
|
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* Use, distribution, and modification of this source code and/or resulting
|
|
* object code is restricted to non-commercial enhancements to products from
|
|
* Valve LLC. All other use, distribution, or modification is prohibited
|
|
* without written permission from Valve LLC.
|
|
*
|
|
****/
|
|
//
|
|
// hud_redraw.cpp
|
|
//
|
|
#include <math.h>
|
|
#include "hud.h"
|
|
#include "cl_util.h"
|
|
#include "triangleapi.h"
|
|
|
|
#include <string.h>
|
|
#define MAX_LOGO_FRAMES 56
|
|
|
|
int grgLogoFrame[MAX_LOGO_FRAMES] =
|
|
{
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 12, 11, 10, 9, 8, 14, 15,
|
|
16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
|
29, 29, 29, 29, 29, 28, 27, 26, 25, 24, 30, 31
|
|
};
|
|
|
|
|
|
extern int g_iVisibleMouse;
|
|
|
|
float HUD_GetFOV( void );
|
|
|
|
extern cvar_t *sensitivity;
|
|
|
|
// Think
|
|
void CHud::Think(void)
|
|
{
|
|
int newfov;
|
|
HUDLIST *pList = m_pHudList;
|
|
|
|
while (pList)
|
|
{
|
|
if (pList->p->m_iFlags & HUD_ACTIVE)
|
|
pList->p->Think();
|
|
pList = pList->pNext;
|
|
}
|
|
|
|
newfov = HUD_GetFOV();
|
|
if ( newfov == 0 )
|
|
{
|
|
m_iFOV = default_fov->value;
|
|
}
|
|
else
|
|
{
|
|
m_iFOV = newfov;
|
|
}
|
|
|
|
// the clients fov is actually set in the client data update section of the hud
|
|
|
|
// Set a new sensitivity
|
|
if ( m_iFOV == default_fov->value )
|
|
{
|
|
// reset to saved sensitivity
|
|
m_flMouseSensitivity = 0;
|
|
}
|
|
else
|
|
{
|
|
// set a new sensitivity that is proportional to the change from the FOV default
|
|
m_flMouseSensitivity = sensitivity->value * ((float)newfov / (float)default_fov->value) * CVAR_GET_FLOAT("zoom_sensitivity_ratio");
|
|
}
|
|
|
|
// think about default fov
|
|
if ( m_iFOV == 0 )
|
|
{ // only let players adjust up in fov, and only if they are not overriden by something else
|
|
m_iFOV = max( default_fov->value, 90 );
|
|
}
|
|
|
|
}
|
|
|
|
// Redraw
|
|
// step through the local data, placing the appropriate graphics & text as appropriate
|
|
// returns 1 if they've changed, 0 otherwise
|
|
int CHud :: Redraw( float flTime, int intermission )
|
|
{
|
|
m_fOldTime = m_flTime; // save time of previous redraw
|
|
m_flTime = flTime;
|
|
m_flTimeDelta = (double)m_flTime - m_fOldTime;
|
|
static int m_flShotTime = 0;
|
|
|
|
// Clock was reset, reset delta
|
|
if ( m_flTimeDelta < 0 )
|
|
m_flTimeDelta = 0;
|
|
|
|
// Bring up the scoreboard during intermission
|
|
/*if (gViewPort)
|
|
{
|
|
if ( m_iIntermission && !intermission )
|
|
{
|
|
// Have to do this here so the scoreboard goes away
|
|
m_iIntermission = intermission;
|
|
gViewPort->HideCommandMenu();
|
|
gViewPort->HideScoreBoard();
|
|
gViewPort->UpdateSpectatorPanel();
|
|
}
|
|
else if ( !m_iIntermission && intermission )
|
|
{
|
|
m_iIntermission = intermission;
|
|
gViewPort->HideCommandMenu();
|
|
gViewPort->HideVGUIMenu();
|
|
gViewPort->ShowScoreBoard();
|
|
gViewPort->UpdateSpectatorPanel();
|
|
|
|
// Take a screenshot if the client's got the cvar set
|
|
if ( CVAR_GET_FLOAT( "hud_takesshots" ) != 0 )
|
|
m_flShotTime = flTime + 1.0; // Take a screenshot in a second
|
|
}
|
|
}*/
|
|
|
|
if (m_flShotTime && m_flShotTime < flTime)
|
|
{
|
|
gEngfuncs.pfnClientCmd("snapshot\n");
|
|
m_flShotTime = 0;
|
|
}
|
|
|
|
m_iIntermission = intermission;
|
|
|
|
if ( m_pCvarDraw->value )
|
|
{
|
|
HUDLIST *pList = m_pHudList;
|
|
|
|
while (pList)
|
|
{
|
|
if ( !intermission )
|
|
{
|
|
if ( (pList->p->m_iFlags & HUD_ACTIVE) && !(m_iHideHUDDisplay & HIDEHUD_ALL) )
|
|
pList->p->Draw(flTime);
|
|
}
|
|
else
|
|
{ // it's an intermission, so only draw hud elements that are set to draw during intermissions
|
|
if ( pList->p->m_iFlags & HUD_INTERMISSION )
|
|
pList->p->Draw( flTime );
|
|
}
|
|
|
|
pList = pList->pNext;
|
|
}
|
|
}
|
|
|
|
// are we in demo mode? do we need to draw the logo in the top corner?
|
|
if (m_iLogo)
|
|
{
|
|
int x, y, i;
|
|
|
|
if (m_hsprLogo == 0)
|
|
m_hsprLogo = LoadSprite("sprites/%d_logo.spr");
|
|
|
|
SPR_Set(m_hsprLogo, 250, 250, 250 );
|
|
|
|
x = SPR_Width(m_hsprLogo, 0);
|
|
x = ScreenWidth - x;
|
|
y = SPR_Height(m_hsprLogo, 0)/2;
|
|
|
|
// Draw the logo at 20 fps
|
|
int iFrame = (int)(flTime * 20) % MAX_LOGO_FRAMES;
|
|
i = grgLogoFrame[iFrame] - 1;
|
|
|
|
SPR_DrawAdditive(i, x, y, NULL);
|
|
}
|
|
|
|
return 1;
|
|
}
|