//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ // // Purpose: // // $NoKeywords: $ //============================================================================= #include "hud.h" #include "cl_util.h" #include "cl_entity.h" #include "triangleapi.h" #include "overview.h" // these are included for the math functions #include "com_model.h" #include "studio_util.h" #pragma warning(disable: 4244) //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CHudOverview::Init() { gHUD.AddHudElem(this); m_iFlags |= HUD_ACTIVE; return 1; } //----------------------------------------------------------------------------- // Purpose: Loads new icons //----------------------------------------------------------------------------- int CHudOverview::VidInit() { m_hsprPlayer = gEngfuncs.pfnSPR_Load( "sprites/ring.spr" ); m_hsprViewcone = gEngfuncs.pfnSPR_Load( "sprites/camera.spr" ); return 1; } //----------------------------------------------------------------------------- // Purpose: // Input : flTime - // intermission - //----------------------------------------------------------------------------- int CHudOverview::Draw( float flTime ) { #if 0 // only draw in overview mode if( !gEngfuncs.Overview_GetOverviewState() ) return 1; // make sure we have player info //gViewPort->GetAllPlayersInfo(); gHUD.m_Scoreboard.GetAllPlayersInfo(); // calculate player size on the overview int x1, y1, x2, y2; float v0[3] = { 0.0f }, v1[3] = { 64.0f, 64.0f }; gEngfuncs.Overview_WorldToScreen( v0, &x1, &y1 ); gEngfuncs.Overview_WorldToScreen( v1, &x2, &y2 ); float scale = abs( x2 - x1 ); // loop through all the players and draw them on the map for( int i = 1; i < MAX_PLAYERS; i++ ) { cl_entity_t *pl = gEngfuncs.GetEntityByIndex( i ); if( pl && pl->player && pl->curstate.health > 0 && pl->curstate.solid != SOLID_NOT ) { int x, y, z = 0; float v[3] = { pl->origin[0], pl->origin[1], 0 }; gEngfuncs.Overview_WorldToScreen( v, &x, &y ); // hack in some team colors float r, g, bc; if( g_PlayerExtraInfo[i].teamnumber == 1 ) { r = 0.0f; g = 0.0f; bc = 1.0f; } else if( g_PlayerExtraInfo[i].teamnumber == 2 ) { r = 1.0f; g = 0.0f; bc = 0.0f; } else { // just use the default orange color if the team isn't set r = 1.0f; g = 0.7f; bc = 0.0f; } // set the current texture gEngfuncs.pTriAPI->SpriteTexture( (struct model_s *)gEngfuncs.GetSpritePointer( m_hsprPlayer ), 0 ); // additive render mode gEngfuncs.pTriAPI->RenderMode( kRenderTransAdd ); // no culling gEngfuncs.pTriAPI->CullFace( TRI_NONE ); // draw a square gEngfuncs.pTriAPI->Begin( TRI_QUADS ); // set the color to be that of the team gEngfuncs.pTriAPI->Color4f( r, g, bc, 1.0f ); // calculate rotational matrix vec3_t a, b, angles; float rmatrix[3][4]; // transformation matrix VectorCopy( pl->angles, angles ); angles[0] = 0.0f; angles[1] += 90.f; angles[1] = -angles[1]; angles[2] = 0.0f; AngleMatrix( angles, rmatrix ); a[2] = 0; a[0] = -scale; a[1] = -scale; VectorTransform( a, rmatrix, b ); gEngfuncs.pTriAPI->TexCoord2f( 0, 0 ); gEngfuncs.pTriAPI->Vertex3f( x + b[0], y + b[1], z ); a[0] = -scale; a[1] = scale; VectorTransform( a, rmatrix, b ); gEngfuncs.pTriAPI->TexCoord2f( 0, 1 ); gEngfuncs.pTriAPI->Vertex3f( x + b[0], y + b[1], z ); a[0] = scale; a[1] = scale; VectorTransform( a, rmatrix, b ); gEngfuncs.pTriAPI->TexCoord2f( 1, 1 ); gEngfuncs.pTriAPI->Vertex3f( x + b[0], y + b[1], z ); a[0] = scale; a[1] = -scale; VectorTransform( a, rmatrix, b ); gEngfuncs.pTriAPI->TexCoord2f( 1, 0 ); gEngfuncs.pTriAPI->Vertex3f( x + b[0], y + b[1], z ); // finish up gEngfuncs.pTriAPI->End(); gEngfuncs.pTriAPI->RenderMode( kRenderNormal ); // draw the players name and health underneath char string[256]; sprintf( string, "%s (%i%%)", g_PlayerInfoList[i].name, pl->curstate.health ); DrawConsoleString( x, y + ( 1.1 * scale ), string ); } } #endif return 1; } //----------------------------------------------------------------------------- // Purpose: called every time a server is connected to //----------------------------------------------------------------------------- void CHudOverview::InitHUDData() { //this block would force the spectator view to be on //gEngfuncs.Overview_SetDrawOverview( 1 ); //gEngfuncs.Overview_SetDrawInset( 0 ); }