summaryrefslogtreecommitdiff
path: root/game/client/replay/vgui/replaybrowsermovieplayerpanel.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/replaybrowsermovieplayerpanel.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/replaybrowsermovieplayerpanel.cpp')
-rw-r--r--game/client/replay/vgui/replaybrowsermovieplayerpanel.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/game/client/replay/vgui/replaybrowsermovieplayerpanel.cpp b/game/client/replay/vgui/replaybrowsermovieplayerpanel.cpp
new file mode 100644
index 0000000..f273369
--- /dev/null
+++ b/game/client/replay/vgui/replaybrowsermovieplayerpanel.cpp
@@ -0,0 +1,220 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//=======================================================================================//
+
+#include "cbase.h"
+
+#if defined( REPLAY_ENABLED )
+
+#include "replaybrowsermovieplayerpanel.h"
+#include "vgui/IVGui.h"
+#include "vgui/IInput.h"
+#include "engine/IEngineSound.h"
+#include "iclientmode.h"
+
+//-----------------------------------------------------------------------------
+
+using namespace vgui;
+
+//-----------------------------------------------------------------------------
+
+CMoviePlayerPanel::CMoviePlayerPanel( Panel *pParent, const char *pName, const char *pMovieFilename )
+: CReplayBasePanel( pParent, pName ),
+ m_flCurFrame( 0.0f ),
+ m_flLastTime( 0.0f ),
+ m_nLastMouseXPos( 0 ),
+ m_bPlaying( false ),
+ m_bLooping( false ),
+ m_bFullscreen( false ),
+ m_bMouseOverScrub( false ),
+ m_pOldParent( NULL ),
+ m_pVideoMaterial( NULL )
+{
+ if ( g_pVideo )
+ {
+ m_pVideoMaterial = g_pVideo->CreateVideoMaterial( pMovieFilename, pMovieFilename, "GAME" );
+ if ( m_pVideoMaterial )
+ {
+ m_pMaterial = m_pVideoMaterial->GetMaterial();
+ m_pMaterial->AddRef();
+ m_nNumFrames = m_pVideoMaterial->GetFrameCount();
+
+ }
+ }
+
+ ivgui()->AddTickSignal( GetVPanel(), 0 );
+}
+
+CMoviePlayerPanel::~CMoviePlayerPanel()
+{
+ FreeMaterial();
+
+ ivgui()->RemoveTickSignal( GetVPanel() );
+}
+
+void CMoviePlayerPanel::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ GetPosRelativeToAncestor( NULL, m_nGlobalPos[0], m_nGlobalPos[1] );
+
+ if ( m_bFullscreen )
+ {
+ // Cache parent
+ m_pOldParent = GetParent();
+ GetBounds( m_aOldBounds[0], m_aOldBounds[1], m_aOldBounds[2], m_aOldBounds[3] );
+
+ // Adjust parent for fullscreen mode
+ SetParent( g_pClientMode->GetViewport() );
+
+ // Adjust bounds for fullscreen
+ SetBounds( 0, 0, ScreenWidth(), ScreenHeight() );
+ }
+ else if ( m_pOldParent )
+ {
+ // Restore old parent/bounds
+ SetParent( m_pOldParent );
+ SetBounds( m_aOldBounds[0], m_aOldBounds[1], m_aOldBounds[2], m_aOldBounds[3] );
+ }
+}
+
+void CMoviePlayerPanel::OnMousePressed( MouseCode code )
+{
+// ToggleFullscreen();
+}
+
+void CMoviePlayerPanel::SetScrubOnMouseOverMode( bool bOn )
+{
+ if ( bOn )
+ {
+ m_bPlaying = false;
+ }
+
+ m_bMouseOverScrub = bOn;
+}
+
+void CMoviePlayerPanel::Play()
+{
+ m_bPlaying = true;
+ m_flLastTime = gpGlobals->realtime;
+
+ enginesound->NotifyBeginMoviePlayback();
+}
+
+void CMoviePlayerPanel::FreeMaterial()
+{
+ if ( m_pVideoMaterial )
+ {
+ if ( g_pVideo )
+ {
+ g_pVideo->DestroyVideoMaterial( m_pVideoMaterial );
+ }
+
+ m_pVideoMaterial = NULL;
+ }
+
+ if ( m_pMaterial )
+ {
+ m_pMaterial->Release();
+ m_pMaterial = NULL;
+ }
+}
+
+void CMoviePlayerPanel::OnTick()
+{
+ if ( !IsEnabled() )
+ return;
+
+ if ( m_bMouseOverScrub )
+ {
+ int nMouseX, nMouseY;
+ input()->GetCursorPos( nMouseX, nMouseY );
+ if ( IsWithin( nMouseX, nMouseY ) &&
+ nMouseX != m_nLastMouseXPos )
+ {
+ float flPercent = (float)( nMouseX - m_nGlobalPos[0] ) / GetWide();
+ m_flCurFrame = flPercent * ( m_nNumFrames - 1 );
+ m_nLastMouseXPos = nMouseX;
+ }
+ }
+ else if ( m_bPlaying )
+ {
+ float flElapsed = gpGlobals->realtime - m_flLastTime;
+ m_flLastTime = gpGlobals->realtime;
+
+ m_flCurFrame += flElapsed * m_pVideoMaterial->GetVideoFrameRate().GetFPS();
+ // Loop if necessary
+ if ( m_flCurFrame >= m_nNumFrames )
+ {
+ if ( m_bLooping )
+ {
+ m_flCurFrame = m_flCurFrame - m_nNumFrames;
+ }
+ else
+ {
+ // Don't go past last frame
+ m_flCurFrame = m_nNumFrames - 1;
+ }
+ }
+ }
+
+ m_pVideoMaterial->SetFrame( m_flCurFrame );
+
+// Msg( "frame: %f / %i\n", m_flCurFrame, m_nNumFrames );
+}
+
+void CMoviePlayerPanel::Paint()
+{
+ if ( m_pVideoMaterial == NULL )
+ return;
+
+ // Get panel position/dimensions
+ int x,y;
+ int w,h;
+ GetPosRelativeToAncestor( NULL, x, y );
+ GetSize( w,h );
+
+ CMatRenderContextPtr pRenderContext( materials );
+ pRenderContext->Bind( m_pMaterial );
+
+ IMesh* pMesh = pRenderContext->GetDynamicMesh( true );
+
+ float flMinU = 0.0f, flMinV = 0.0f;
+ float flMaxU, flMaxV;
+ m_pVideoMaterial->GetVideoTexCoordRange( &flMaxU, &flMaxV );
+
+ CMeshBuilder meshBuilder;
+ meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );
+
+ meshBuilder.Position3f( x, y, 0.0f );
+ meshBuilder.TexCoord2f( 0, flMinU, flMinV );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3f( x + w, y, 0.0f );
+ meshBuilder.TexCoord2f( 0, flMaxU, flMinV );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3f( x + w, y + h, 0.0f );
+ meshBuilder.TexCoord2f( 0, flMaxU, flMaxV );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3f( x, y + h, 0.0f );
+ meshBuilder.TexCoord2f( 0, flMinU, flMaxV );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+}
+
+void CMoviePlayerPanel::ToggleFullscreen()
+{
+ m_bFullscreen = !m_bFullscreen;
+
+ InvalidateLayout( false, false );
+}
+
+#endif \ No newline at end of file