Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

220 lines
4.8 KiB

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