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
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;
|
|
}
|
|
|