summaryrefslogtreecommitdiff
path: root/game/client/replay/vgui/replaybrowserpreviewpanel.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/replay/vgui/replaybrowserpreviewpanel.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/replay/vgui/replaybrowserpreviewpanel.cpp')
-rw-r--r--game/client/replay/vgui/replaybrowserpreviewpanel.cpp301
1 files changed, 301 insertions, 0 deletions
diff --git a/game/client/replay/vgui/replaybrowserpreviewpanel.cpp b/game/client/replay/vgui/replaybrowserpreviewpanel.cpp
new file mode 100644
index 0000000..67297a4
--- /dev/null
+++ b/game/client/replay/vgui/replaybrowserpreviewpanel.cpp
@@ -0,0 +1,301 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+
+
+#if defined( REPLAY_ENABLED )
+
+#include "replaybrowserpreviewpanel.h"
+#include "replaybrowsermainpanel.h"
+#include "replaybrowsermovieplayerpanel.h"
+#include "replaybrowserlistitempanel.h"
+#include "replay/ireplaymovie.h"
+#include "replay/screenshot.h"
+#include "vgui/ISurface.h"
+#include "econ/econ_controls.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//-----------------------------------------------------------------------------
+
+CReplayPreviewPanelBase::CReplayPreviewPanelBase( Panel *pParent, QueryableReplayItemHandle_t hItem, IReplayItemManager *pItemManager )
+: EditablePanel( pParent, "PreviewPanel" ),
+ m_hItem( hItem ),
+ m_pItemManager( pItemManager )
+{
+ CGenericClassBasedReplay *pReplay = GetReplay();
+ IQueryableReplayItem *pItem = pItemManager->GetItem( hItem );
+
+ // Setup class image
+ char szImage[MAX_OSPATH];
+ m_pClassImage = new ImagePanel( this, "ClassImage" );
+ V_snprintf( szImage, sizeof( szImage ), "class_sel_sm_%s_%s", pReplay->GetMaterialFriendlyPlayerClass(), pReplay->GetPlayerTeam() ); // Cause default image to display
+ m_pClassImage->SetImage( szImage );
+
+ m_pInfoPanel = new vgui::EditablePanel( this, "InfoPanel" );
+
+ // Setup map label
+ const char *pMapName = pReplay->m_szMapName;
+ const char *pUnderscore = V_strstr( pMapName, "_" );
+ if ( pUnderscore )
+ {
+ pMapName = pUnderscore + 1;
+ }
+ m_pMapLabel = new CExLabel( m_pInfoPanel, "MapLabel", pMapName );
+
+ // Setup record date/time
+ const CReplayTime &RecordTime = pItem->GetItemDate();
+ int nDay, nMonth, nYear;
+ RecordTime.GetDate( nDay, nMonth, nYear );
+ int nHour, nMin, nSec;
+ RecordTime.GetTime( nHour, nMin, nSec );
+ const wchar_t *pDateAndTime = CReplayTime::GetLocalizedDate( g_pVGuiLocalize, nDay, nMonth, nYear, &nHour, &nMin, &nSec );
+
+ // Setup date / time label
+ m_pDateTimeLabel = new CExLabel( m_pInfoPanel, "DateTimeLabel", pDateAndTime );
+
+ // Setup info labels
+ for ( int i = 0; i < NUM_INFO_LABELS; ++i )
+ {
+ for ( int j = 0; j < 2; ++j )
+ {
+ m_pReplayInfoLabels[i][j] = new CExLabel( m_pInfoPanel, VarArgs("Label%d_%d", i, j), "" );
+ }
+ }
+ m_pReplayInfoLabels[ LABEL_PLAYED_AS ][1]->SetText( pReplay->GetPlayerClass() );
+ m_pReplayInfoLabels[ LABEL_KILLED_BY ][1]->SetText( pReplay->WasKilled() ? pReplay->GetKillerName() : "#Replay_NoKiller" );
+ m_pReplayInfoLabels[ LABEL_LIFE_LENGTH ][1]->SetText( CReplayTime::FormatTimeString( (int)pItem->GetItemLength() ) );
+}
+
+CReplayPreviewPanelBase::~CReplayPreviewPanelBase()
+{
+}
+
+void CReplayPreviewPanelBase::ApplySchemeSettings( IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ LoadControlSettings( "resource/ui/replaybrowser/previewpanel.res", "GAME" );
+
+#if !defined( TF_CLIENT_DLL )
+ m_pClassImage->SetVisible( false );
+#endif
+}
+
+void CReplayPreviewPanelBase::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ CGenericClassBasedReplay *pReplay = GetReplay();
+ if ( !pReplay )
+ return;
+
+ int nWide = XRES(18);
+ int nTall = YRES(18);
+ int nScreenshotH = 0; // Represents the height of the screenshot OR the "no screenshot" label
+ LayoutView( nWide, nTall, nScreenshotH );
+ int iInfoHeight = m_pInfoPanel->GetTall();
+ nTall += iInfoHeight;
+
+ if ( m_pClassImage )
+ {
+ int w, h;
+ m_pClassImage->GetImage()->GetContentSize( w, h );
+ float s = ShoudlUseLargeClassImage() ? 1.25f : 1.0f;
+ int nClassTall = s*h;
+ m_pClassImage->SetSize( s*w, nClassTall );
+ m_pClassImage->SetShouldScaleImage( true );
+ m_pClassImage->SetScaleAmount( s );
+
+ // The panel should be at least as tall as the height of the screenshot
+ // (or "no screenshot" label) and the class image.
+ if ( nTall < nClassTall )
+ {
+ nTall = nClassTall;
+ }
+ m_pClassImage->SetPos( XRES(9), nTall - nClassTall );
+ }
+
+ const int nLabelX = m_pClassImage->GetWide() + XRES( 18 );
+ int iInfoWidth = nWide - nLabelX;
+ m_pMapLabel->SetSize( iInfoWidth, m_pMapLabel->GetTall() );
+ m_pDateTimeLabel->SetSize( iInfoWidth, m_pMapLabel->GetTall() );
+ m_pInfoPanel->SetBounds( nLabelX, nTall - iInfoHeight, iInfoWidth, iInfoHeight );
+
+ nTall += YRES(9);
+
+ SetSize( nWide, nTall );
+}
+
+void CReplayPreviewPanelBase::LayoutView( int &nWide, int &nTall, int &nCurY )
+{
+ nWide = XRES( 188 );
+ nTall = YRES(9);
+ nCurY = nTall;
+}
+
+CGenericClassBasedReplay *CReplayPreviewPanelBase::GetReplay()
+{
+ return ToGenericClassBasedReplay( m_pItemManager->GetItem( m_hItem )->GetItemReplay() );
+}
+
+ReplayHandle_t CReplayPreviewPanelBase::GetReplayHandle()
+{
+ return GetReplay()->GetHandle();
+}
+
+//-----------------------------------------------------------------------------
+
+CReplayPreviewPanelSlideshow::CReplayPreviewPanelSlideshow( Panel *pParent, QueryableReplayItemHandle_t hReplay, IReplayItemManager *pItemManager )
+: BaseClass( pParent, hReplay, pItemManager ),
+ m_pScreenshotPanel( NULL )
+{
+ // Setup screenshot slideshow panel
+ CGenericClassBasedReplay *pReplay = GetReplay();
+ const int nScreenshotCount = pReplay->GetScreenshotCount();
+ if ( nScreenshotCount )
+ {
+ m_pScreenshotPanel = new CReplayScreenshotSlideshowPanel( this, "ScreenshotSlideshowPanel", hReplay );
+
+ // Set pretty quick transition times based on the screenshot count
+ m_pScreenshotPanel->SetInterval( ( nScreenshotCount == 2 ) ? 3.0f : 2.0f );
+ m_pScreenshotPanel->SetTransitionTime( 0.5f );
+ }
+
+ // Setup the no screenshot label
+ m_pNoScreenshotLabel = new CExLabel( this, "NoScreenshotLabel", "#Replay_NoScreenshot" );
+ m_pNoScreenshotLabel->SetVisible( false );
+}
+
+void CReplayPreviewPanelSlideshow::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ m_pNoScreenshotLabel->SizeToContents();
+ m_pNoScreenshotLabel->SetWide( GetWide() );
+}
+
+void CReplayPreviewPanelSlideshow::LayoutView( int &nWide, int &nTall, int &nCurY )
+{
+ if ( m_pScreenshotPanel )
+ {
+ // Use the dimensions from the first screenshot to figure out the scale, even though the dimensions
+ // may vary if the user changed resolutions during gameplay
+ CGenericClassBasedReplay *pReplay = GetReplay();
+ const CReplayScreenshot *pScreenshot = pReplay->GetScreenshot( 0 );
+ int nScreenshotW = pScreenshot->m_nWidth;
+ int nScreenshotH = pScreenshot->m_nHeight;
+
+ // Scale the screenshot if it's too big for the current resolution
+ float flScreenshotScale = 1.0f;
+ int nMaxScreenshotWidth = ScreenWidth() / 3;
+ if ( nScreenshotW > nMaxScreenshotWidth )
+ {
+ flScreenshotScale = (float)nMaxScreenshotWidth / pScreenshot->m_nWidth;
+ nScreenshotW = nMaxScreenshotWidth;
+ }
+ nCurY = nScreenshotH * flScreenshotScale;
+
+ m_pScreenshotPanel->GetImagePanel()->SetShouldScaleImage( true );
+ m_pScreenshotPanel->GetImagePanel()->SetScaleAmount( flScreenshotScale );
+
+ nWide += nScreenshotW;
+ nTall += nCurY;
+
+ m_pScreenshotPanel->SetBounds( (nWide - nScreenshotW) * 0.5, YRES(9), nScreenshotW, nCurY );
+ }
+ else
+ {
+ int w, h;
+ m_pNoScreenshotLabel->SetContentAlignment( Label::a_center );
+ m_pNoScreenshotLabel->GetContentSize( w, h );
+ nTall += YRES( 20 );
+ m_pNoScreenshotLabel->SetBounds( 0, nTall, w, h );
+ nTall += YRES( 20 );
+ m_pNoScreenshotLabel->SetVisible( true );
+
+ nWide += XRES( 213 ); // Default width (maps to 640 on 1920x1200)
+ nTall += h;
+ nCurY = nTall;
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+CReplayPreviewPanelMovie::CReplayPreviewPanelMovie( Panel *pParent, QueryableReplayItemHandle_t hItem, IReplayItemManager *pItemManager )
+: BaseClass( pParent, hItem, pItemManager ),
+ m_pMoviePlayerPanel( NULL )
+{
+ m_flCreateTime = gpGlobals->realtime;
+
+ ivgui()->AddTickSignal( GetVPanel(), 10 );
+}
+
+CReplayPreviewPanelMovie::~CReplayPreviewPanelMovie()
+{
+ ivgui()->RemoveTickSignal( GetVPanel() );
+}
+
+void CReplayPreviewPanelMovie::OnTick()
+{
+ if ( gpGlobals->realtime >= m_flCreateTime + 0.5f )
+ {
+ if ( !m_pMoviePlayerPanel )
+ {
+ m_pMoviePlayerPanel = new CMoviePlayerPanel( this, "MoviePlayer", GetReplayMovie()->GetMovieFilename() );
+ InvalidateLayout( true, false );
+ }
+
+ if ( !m_pMoviePlayerPanel->IsPlaying() )
+ {
+ m_pMoviePlayerPanel->SetLooping( true );
+ m_pMoviePlayerPanel->Play();
+ }
+ }
+}
+
+IReplayMovie* CReplayPreviewPanelMovie::GetReplayMovie()
+{
+ return static_cast< IReplayMovie * >( m_pItemManager->GetItem( m_hItem ) );
+}
+
+void CReplayPreviewPanelMovie::LayoutView( int &nWide, int &nTall, int &nCurY )
+{
+ // Get frame dimensions
+ int nFrameWidth, nFrameHeight;
+ IReplayMovie* pReplayMovie = GetReplayMovie();
+ pReplayMovie->GetFrameDimensions( nFrameWidth, nFrameHeight );
+
+ int nScaledWidth = nFrameWidth;
+ int nScaledHeight = nFrameHeight;
+
+ // Scale the screenshot if it's too big for the current resolution
+ float flScale = 1.0f;
+ int nMaxWidth = ScreenWidth() / 3;
+ if ( nFrameWidth > nMaxWidth )
+ {
+ flScale = (float)nMaxWidth / nFrameWidth;
+ nScaledWidth = nMaxWidth;
+ nScaledHeight = nFrameHeight * flScale;
+ }
+
+ nWide += nScaledWidth;
+ nTall += nScaledHeight;
+ nCurY = nTall;
+
+ // Layout movie player panel if it's ready
+ if ( m_pMoviePlayerPanel )
+ {
+ m_pMoviePlayerPanel->SetBounds( 9, 9, nScaledWidth, nScaledHeight );
+ m_pMoviePlayerPanel->SetEnabled( true );
+ m_pMoviePlayerPanel->SetVisible( true );
+ m_pMoviePlayerPanel->SetZPos( 101 );
+ }
+}
+
+#endif \ No newline at end of file