Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

321 lines
9.0 KiB

//========= Copyright © Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "gamegraphic.h"
#include "animdata.h"
#include "gameuisystemmgr.h"
#include "inputgameui.h"
#include "dmxloader/dmxelement.h"
#include "tier1/fmtstr.h"
#include "graphicgroup.h"
#include "gameuiscript.h"
// A list of script handles exposed by the system
static int32 g_iSerialHandle = 0x01000000;
static CUtlMap< int32, CGameGraphic * > g_mapScriptHandles( DefLessFunc( int32 ) );
//-----------------------------------------------------------------------------
// Constructor, destructor
//-----------------------------------------------------------------------------
CGameGraphic::CGameGraphic() :
m_iScriptHandle( ++g_iSerialHandle )
{
g_mapScriptHandles.InsertOrReplace( m_iScriptHandle, this );
m_pName = "";
m_pGroup = NULL;
m_bCanAcceptInput = false;
m_CurrentState = -1;
m_flAnimTime = DMETIME_ZERO;
}
CGameGraphic::~CGameGraphic()
{
if ( m_pGroup )
{
m_pGroup->RemoveFromGroup( this );
}
int nCount = m_Anims.Count();
for ( int i = 0; i < nCount; ++i )
{
delete m_Anims[i];
m_Anims[i] = NULL;
}
m_Anims.RemoveAll();
g_mapScriptHandles.Remove( m_iScriptHandle );
}
CGameGraphic * CGameGraphic::FromScriptHandle( int32 iScriptHandle )
{
unsigned short usIdx = g_mapScriptHandles.Find( iScriptHandle );
return ( usIdx == g_mapScriptHandles.InvalidIndex() ) ? NULL : g_mapScriptHandles.Element( usIdx );
}
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
DmeTime_t CGameGraphic::GetAnimationTimePassed()
{
if ( m_Geometry.m_bAnimate )
{
m_flAnimTime = g_pGameUISystemMgrImpl->GetTime() - m_Geometry.m_AnimStartTime;
}
return m_flAnimTime;
}
KeyValues * CGameGraphic::HandleScriptCommand( KeyValues *args )
{
char const *szCommand = args->GetName();
if ( !Q_stricmp( "SetCenter", szCommand ) )
{
SetCenter( args->GetFloat( "x" ), args->GetFloat( "y" ) );
return NULL;
}
else if ( !Q_stricmp( "SetScale", szCommand ) )
{
SetScale( args->GetFloat( "x" ), args->GetFloat( "y" ) );
return NULL;
}
else if ( !Q_stricmp( "SetRotation", szCommand ) )
{
m_Geometry.m_Rotation = args->GetFloat( "rotation", 0.0f );
return NULL;
}
else if ( !Q_stricmp( "SetVisible", szCommand ) )
{
SetVisible( args->GetBool( "visible", true ) );
return NULL;
}
else if ( !Q_stricmp( "GetVisible", szCommand ) )
{
return new KeyValues( "", "visible", GetVisible() ? 1 : 0 );
}
else if ( !Q_stricmp( "SetHorizGradient", szCommand ) )
{
m_Geometry.m_bHorizontalGradient = args->GetBool( "horizgradient", true );
return NULL;
}
else if ( !Q_stricmp( "SetColor", szCommand ) )
{
Color c = args->GetColor( "color", Color( 255, 255, 255, 255 ) );
color32 color;
color.r = c[0];
color.g = c[1];
color.b = c[2];
color.a = c[3];
SetColor( color );
return NULL;
}
else if ( !Q_stricmp( "SetState", szCommand ) )
{
SetState( args->GetString( "state" ), args->GetBool( "play", true ) );
SetAnimationTimePassed( DmeTime_t( args->GetFloat( "time" ) ) );
return NULL;
}
else if ( !Q_stricmp( "GetState", szCommand ) )
{
return new KeyValues( "", "state", GetState() );
}
else if ( !Q_stricmp( "IsDonePlaying", szCommand ) )
{
return new KeyValues( "", "done", IsDonePlaying() ? 1 : 0 );
}
DevWarning( "CGameGraphic::HandleScriptCommand for unknown command %s!\n", args->GetName() );
return NULL;
}
//-----------------------------------------------------------------------------
// If you don't want to use the clock, you can set the time yourself.
//----------------------------------------------------------------------------
void CGameGraphic::SetAnimationTimePassed( DmeTime_t time )
{
m_flAnimTime = time;
}
//-----------------------------------------------------------------------------
// Populate lists for rendering
//-----------------------------------------------------------------------------
void CGameGraphic::UpdateRenderData( color32 parentColor, CUtlVector< RenderGeometryList_t > &renderGeometryLists, int firstListIndex )
{
if ( !m_Geometry.m_bVisible )
return;
m_Geometry.SetResultantColor( parentColor );
m_Geometry.UpdateRenderData( renderGeometryLists, firstListIndex );
}
//-----------------------------------------------------------------------------
// Have to do this separately because extents are drawn as rects.
//-----------------------------------------------------------------------------
void CGameGraphic::DrawExtents( CUtlVector< RenderGeometryList_t > &renderGeometryLists, int firstListIndex )
{
Assert( !IsGroup() );
color32 extentLineColor = { 0, 255, 0, 255 };
m_Geometry.DrawExtents( renderGeometryLists, firstListIndex, extentLineColor );
}
//-----------------------------------------------------------------------------
// Populate lists for rendering
//-----------------------------------------------------------------------------
void CGameGraphic::UpdateRenderTransforms( const StageRenderInfo_t &stageRenderInfo )
{
m_Geometry.UpdateRenderTransforms( stageRenderInfo, GetGroup() );
}
//-----------------------------------------------------------------------------
// Return the index of the anim this state name maps to.
//-----------------------------------------------------------------------------
bool CGameGraphic::HasState( const char *pStateName )
{
return (GetStateIndex( pStateName ) != -1);
}
//-----------------------------------------------------------------------------
// Set the animation state of this graphic.
// Default is to start playing it. If it is called with startplaying false, it will stop it.
//-----------------------------------------------------------------------------
void CGameGraphic::SetState( const char *pStateName, bool bStartPlaying )
{
int newState = GetStateIndex( pStateName );
if ( ( newState != -1 ) && ( m_CurrentState != newState ) )
{
m_CurrentState = newState;
if ( bStartPlaying )
{
StartPlaying();
}
}
if ( !bStartPlaying )
{
StopPlaying();
}
}
//-----------------------------------------------------------------------------
// Return true if anim is done playing its current state.
//-----------------------------------------------------------------------------
bool CGameGraphic::IsDonePlaying()
{
if ( m_CurrentState == -1 )
return true;
return m_Anims[m_CurrentState]->IsDone( GetAnimationTimePassed() );
}
//-----------------------------------------------------------------------------
// Return the index of the anim this state name maps to.
//-----------------------------------------------------------------------------
int CGameGraphic::GetStateIndex( const char *pStateName )
{
for ( int i = 0; i < m_Anims.Count(); i++ )
{
if ( Q_stricmp( pStateName, m_Anims[i]->m_pStateName ) == 0 )
{
if ( Q_stricmp( m_Anims[i]->m_pAnimAlias, "" ) != 0 )
{
return GetStateIndex( m_Anims[i]->m_pAnimAlias );
}
else
{
return i;
}
}
}
return -1;
}
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
const char *CGameGraphic::GetState()
{
if ( m_CurrentState == -1 )
return "";
if ( Q_stricmp( m_Anims[m_CurrentState]->m_pAnimAlias, "" ) != 0 )
{
return m_Anims[m_CurrentState]->m_pAnimAlias;
}
else
{
return m_Anims[m_CurrentState]->m_pStateName;
}
}
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
void CGameGraphic::StartPlaying()
{
m_Geometry.m_bAnimate = true;
m_Geometry.m_AnimStartTime = g_pGameUISystemMgrImpl->GetTime();
}
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
void CGameGraphic::StopPlaying()
{
m_Geometry.m_bAnimate = false;
}
//-----------------------------------------------------------------------------
// for demo and unit tests
//-----------------------------------------------------------------------------
void CGameGraphic::AdvanceState()
{
StopPlaying();
int numStates = m_Anims.Count();
if ( numStates == 0 )
return;
int state = m_CurrentState;
state++;
if ( state > numStates -1 )
state = 0;
m_CurrentState = state;
}
//-----------------------------------------------------------------------------
// Is this the graphic with this name?
//-----------------------------------------------------------------------------
bool CGameGraphic::IsGraphicNamed( const char *pName )
{
if ( !Q_stricmp( m_pName.Get(), pName ) )
{
// Match.
return true;
}
return false;
}
//-----------------------------------------------------------------------------
// Does this graphic own a graphic with this name?
//-----------------------------------------------------------------------------
CGameGraphic *CGameGraphic::FindGraphicByName( const char *pName ) const
{
return NULL;
}