|
|
//========= 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
|