//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "dynamicrect.h" // To handle scaling #include "materialsystem/imaterialsystem.h" #include "animdata.h" #include "Color.h" #include "gameuisystemmgr.h" #include "gameuidefinition.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" // Class factory for scripting. class CDynamicRectClassFactory : IGameUIGraphicClassFactory { public: CDynamicRectClassFactory() { Assert( g_pGameUISystemMgrImpl ); g_pGameUISystemMgrImpl->RegisterGraphicClassFactory( "rect", this ); } // Returns an instance of a graphic interface (keyvalues owned by caller) virtual CGameGraphic *CreateNewGraphicClass( KeyValues *kvRequest, CGameUIDefinition *pMenu ) { Assert( pMenu ); CDynamicRect *pNewGraphic = NULL; const char *pName = kvRequest->GetString( "name", NULL ); if ( pName ) { pNewGraphic = new CDynamicRect( pName ); // Rects are normally 0,0, doing this so we can see script created rects. pNewGraphic->SetScale( 100, 100 ); pMenu->AddGraphicToLayer( pNewGraphic, SUBLAYER_DYNAMIC ); // Now set the attributes. for ( KeyValues *arg = kvRequest->GetFirstSubKey(); arg != NULL; arg = arg->GetNextKey() ) { pNewGraphic->HandleScriptCommand( arg ); } } return pNewGraphic; } }; static CDynamicRectClassFactory g_CDynamicRectClassFactory; BEGIN_DMXELEMENT_UNPACK ( CDynamicRect ) DMXELEMENT_UNPACK_FIELD_UTLSTRING( "imagealias", "", m_ImageAlias ) END_DMXELEMENT_UNPACK( CDynamicRect, s_GameDynamicRectUnpack ) //----------------------------------------------------------------------------- // Constructor, destructor //----------------------------------------------------------------------------- CDynamicRect::CDynamicRect( const char *pName ) : CGameRect( pName ) { // The default maps to white pixel. m_ImageAlias = "defaultImageAlias"; } CDynamicRect::~CDynamicRect() { g_pGameUISystemMgrImpl->ReleaseImageAlias( m_ImageAlias ); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- bool CDynamicRect::Unserialize( CDmxElement *pGraphic ) { CGameRect::Unserialize( pGraphic ); pGraphic->UnpackIntoStructure( this, s_GameDynamicRectUnpack ); m_CurrentState = -1; g_pGameUISystemMgrImpl->InitImageAlias( m_ImageAlias ); g_pGameUISystemMgrImpl->LoadImageAliasTexture( m_ImageAlias, "vguiedit/pixel" ); return true; } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void CDynamicRect::UpdateRenderData( color32 parentColor, CUtlVector< RenderGeometryList_t > &renderGeometryLists, int firstListIndex ) { if ( !m_Geometry.m_bVisible ) return; m_Geometry.SetResultantColor( parentColor ); int i = renderGeometryLists[firstListIndex].AddToTail(); CRenderGeometry &renderGeometry = renderGeometryLists[firstListIndex][i]; // Now transform our array of positions into local graphic coord system. int nCount = m_Geometry.m_RelativePositions.Count(); for ( int i = 0; i < nCount; ++i ) { // Position Vector relativePosition( m_Geometry.m_RelativePositions[i].x, m_Geometry.m_RelativePositions[i].y, 0 ); Vector screenpos; VectorTransform( relativePosition, m_Geometry.m_RenderToScreen, screenpos ); renderGeometry.m_Positions.AddToTail( Vector2D( screenpos.x, screenpos.y ) );; // TexCoord Vector2D sheetTexCoords; g_pGameUISystemMgrImpl->TexCoordsToSheetTexCoords( m_ImageAlias, m_Geometry.m_TextureCoords[i], sheetTexCoords ); renderGeometry.m_TextureCoords.AddToTail( sheetTexCoords ); // Vertex Color renderGeometry.m_VertexColors.AddToTail( m_Geometry.m_VertexColors[i] ); } // Triangles nCount = m_Geometry.m_Triangles.Count(); for ( int i = 0; i < nCount; ++i ) { renderGeometry.m_Triangles.AddToTail( m_Geometry.m_Triangles[i] ); } // Anim Info renderGeometry.m_SheetSequenceNumber = m_Geometry.m_SheetSequenceNumber; renderGeometry.m_AnimationRate = m_Geometry.m_AnimationRate; renderGeometry.m_bAnimate = m_Geometry.m_bAnimate; renderGeometry.m_AnimStartTime = m_Geometry.m_AnimStartTime; // Set the image alias. This is so we can adjust texture coords if needed if // This rect's texture gets placed in a sheet. renderGeometry.m_pImageAlias = m_ImageAlias; // Now transform our array of positions into local graphic coord system. nCount = m_Geometry.m_RelativePositions.Count(); m_ScreenPositions.RemoveAll(); for ( int i = 0; i < nCount; ++i ) { // Position Vector relativePosition( m_Geometry.m_RelativePositions[i].x, m_Geometry.m_RelativePositions[i].y, 0 ); Vector screenpos; VectorTransform( relativePosition, m_Geometry.m_RenderToScreen, screenpos ); m_ScreenPositions.AddToTail( Vector2D( screenpos.x, screenpos.y ) ); } } KeyValues *CDynamicRect::HandleScriptCommand( KeyValues *args ) { char const *szCommand = args->GetName(); if ( !Q_stricmp( "SetAlias", szCommand ) ) { g_pGameUISystemMgrImpl->ReleaseImageAlias( m_ImageAlias ); m_ImageAlias = args->GetString( "alias", "defaultImageAlias" ); g_pGameUISystemMgrImpl->InitImageAlias( m_ImageAlias ); return NULL; } return CGameRect::HandleScriptCommand( args ); }