diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/client/vgui_video.cpp | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/client/vgui_video.cpp')
| -rw-r--r-- | mp/src/game/client/vgui_video.cpp | 844 |
1 files changed, 422 insertions, 422 deletions
diff --git a/mp/src/game/client/vgui_video.cpp b/mp/src/game/client/vgui_video.cpp index f22dc275..3badea3f 100644 --- a/mp/src/game/client/vgui_video.cpp +++ b/mp/src/game/client/vgui_video.cpp @@ -1,423 +1,423 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: VGUI panel which can play back video, in-engine
-//
-//=============================================================================
-
-#include "cbase.h"
-#include <vgui/IVGui.h>
-#include "vgui/IInput.h"
-#include <vgui/ISurface.h>
-#include "ienginevgui.h"
-#include "iclientmode.h"
-#include "vgui_video.h"
-#include "engine/IEngineSound.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-
-VideoPanel::VideoPanel( unsigned int nXPos, unsigned int nYPos, unsigned int nHeight, unsigned int nWidth, bool allowAlternateMedia ) :
- BaseClass( NULL, "VideoPanel" ),
- m_VideoMaterial( NULL ),
- m_nPlaybackWidth( 0 ),
- m_nPlaybackHeight( 0 ),
- m_bAllowAlternateMedia( allowAlternateMedia )
-{
- vgui::VPANEL pParent = enginevgui->GetPanel( PANEL_GAMEUIDLL );
- SetParent( pParent );
- SetVisible( false );
-
- // Must be passed in, off by default
- m_szExitCommand[0] = '\0';
-
- m_bBlackBackground = true;
-
- SetKeyBoardInputEnabled( true );
- SetMouseInputEnabled( false );
-
- SetProportional( false );
- SetVisible( true );
- SetPaintBackgroundEnabled( false );
- SetPaintBorderEnabled( false );
-
- // Set us up
- SetTall( nHeight );
- SetWide( nWidth );
- SetPos( nXPos, nYPos );
-
- SetScheme(vgui::scheme()->LoadSchemeFromFile( "resource/VideoPanelScheme.res", "VideoPanelScheme"));
- LoadControlSettings("resource/UI/VideoPanel.res");
-}
-
-//-----------------------------------------------------------------------------
-// Properly shutdown out materials
-//-----------------------------------------------------------------------------
-VideoPanel::~VideoPanel( void )
-{
- SetParent( (vgui::Panel *) NULL );
-
- // Shut down this video, destroy the video material
- if ( g_pVideo != NULL && m_VideoMaterial != NULL )
- {
- g_pVideo->DestroyVideoMaterial( m_VideoMaterial );
- m_VideoMaterial = NULL;
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Begins playback of a movie
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool VideoPanel::BeginPlayback( const char *pFilename )
-{
- // Who the heck hacked this in?
-#ifdef _X360
- XVIDEO_MODE videoMode;
- XGetVideoMode( &videoMode );
-
- // for 50Hz PAL, load a 25Hz version of the ep1_recap movie.
- if( ( videoMode.RefreshRate < 59.0f ) && ( Q_stricmp( pFilename, "media/ep1_recap.bik" ) == 0 ) )
- {
- pFilename = "media/ep1_recap_25fps.bik";
- }
-#endif
-
- // need working video services
- if ( g_pVideo == NULL )
- return false;
-
- // Create a new video material
- if ( m_VideoMaterial != NULL )
- {
- g_pVideo->DestroyVideoMaterial( m_VideoMaterial );
- m_VideoMaterial = NULL;
- }
-
- m_VideoMaterial = g_pVideo->CreateVideoMaterial( "VideoMaterial", pFilename, "GAME",
- VideoPlaybackFlags::DEFAULT_MATERIAL_OPTIONS,
- VideoSystem::DETERMINE_FROM_FILE_EXTENSION, m_bAllowAlternateMedia );
-
- if ( m_VideoMaterial == NULL )
- return false;
-
- // We want to be the sole audio source
- // FIXME: This may not always be true!
- enginesound->NotifyBeginMoviePlayback();
-
- int nWidth, nHeight;
- m_VideoMaterial->GetVideoImageSize( &nWidth, &nHeight );
- m_VideoMaterial->GetVideoTexCoordRange( &m_flU, &m_flV );
- m_pMaterial = m_VideoMaterial->GetMaterial();
-
-
- float flFrameRatio = ( (float) GetWide() / (float) GetTall() );
- float flVideoRatio = ( (float) nWidth / (float) nHeight );
-
- if ( flVideoRatio > flFrameRatio )
- {
- m_nPlaybackWidth = GetWide();
- m_nPlaybackHeight = ( GetWide() / flVideoRatio );
- }
- else if ( flVideoRatio < flFrameRatio )
- {
- m_nPlaybackWidth = ( GetTall() * flVideoRatio );
- m_nPlaybackHeight = GetTall();
- }
- else
- {
- m_nPlaybackWidth = GetWide();
- m_nPlaybackHeight = GetTall();
- }
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void VideoPanel::Activate( void )
-{
- MoveToFront();
- RequestFocus();
- SetVisible( true );
- SetEnabled( true );
-
- vgui::surface()->SetMinimized( GetVPanel(), false );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void VideoPanel::DoModal( void )
-{
- MakePopup();
- Activate();
-
- vgui::input()->SetAppModalSurface( GetVPanel() );
- vgui::surface()->RestrictPaintToSinglePanel( GetVPanel() );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void VideoPanel::OnKeyCodeTyped( vgui::KeyCode code )
-{
- if ( code == KEY_ESCAPE )
- {
- OnClose();
- }
- else
- {
- BaseClass::OnKeyCodeTyped( code );
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Handle keys that should cause us to close
-//-----------------------------------------------------------------------------
-void VideoPanel::OnKeyCodePressed( vgui::KeyCode code )
-{
- // These keys cause the panel to shutdown
- if ( code == KEY_ESCAPE ||
- code == KEY_BACKQUOTE ||
- code == KEY_SPACE ||
- code == KEY_ENTER ||
- code == KEY_XBUTTON_A ||
- code == KEY_XBUTTON_B ||
- code == KEY_XBUTTON_X ||
- code == KEY_XBUTTON_Y ||
- code == KEY_XBUTTON_START ||
- code == KEY_XBUTTON_BACK )
- {
- OnClose();
- }
- else
- {
- BaseClass::OnKeyCodePressed( code );
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void VideoPanel::OnClose( void )
-{
- enginesound->NotifyEndMoviePlayback();
- BaseClass::OnClose();
-
- if ( vgui::input()->GetAppModalSurface() == GetVPanel() )
- {
- vgui::input()->ReleaseAppModalSurface();
- }
-
- vgui::surface()->RestrictPaintToSinglePanel( NULL );
-
- // Fire an exit command if we're asked to do so
- if ( m_szExitCommand[0] )
- {
- engine->ClientCmd( m_szExitCommand );
- }
-
- SetVisible( false );
- MarkForDeletion();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void VideoPanel::GetPanelPos( int &xpos, int &ypos )
-{
- xpos = ( (float) ( GetWide() - m_nPlaybackWidth ) / 2 );
- ypos = ( (float) ( GetTall() - m_nPlaybackHeight ) / 2 );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Update and draw the frame
-//-----------------------------------------------------------------------------
-void VideoPanel::Paint( void )
-{
- BaseClass::Paint();
-
- if ( m_VideoMaterial == NULL )
- return;
-
- if ( m_VideoMaterial->Update() == false )
- {
- // Issue a close command
- OnVideoOver();
- OnClose();
- }
-
- // Sit in the "center"
- int xpos, ypos;
- GetPanelPos( xpos, ypos );
-
- // Black out the background (we could omit drawing under the video surface, but this is straight-forward)
- if ( m_bBlackBackground )
- {
- vgui::surface()->DrawSetColor( 0, 0, 0, 255 );
- vgui::surface()->DrawFilledRect( 0, 0, GetWide(), GetTall() );
- }
-
- // Draw the polys to draw this out
- CMatRenderContextPtr pRenderContext( materials );
-
- pRenderContext->MatrixMode( MATERIAL_VIEW );
- pRenderContext->PushMatrix();
- pRenderContext->LoadIdentity();
-
- pRenderContext->MatrixMode( MATERIAL_PROJECTION );
- pRenderContext->PushMatrix();
- pRenderContext->LoadIdentity();
-
- pRenderContext->Bind( m_pMaterial, NULL );
-
- CMeshBuilder meshBuilder;
- IMesh* pMesh = pRenderContext->GetDynamicMesh( true );
- meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );
-
- float flLeftX = xpos;
- float flRightX = xpos + (m_nPlaybackWidth-1);
-
- float flTopY = ypos;
- float flBottomY = ypos + (m_nPlaybackHeight-1);
-
- // Map our UVs to cut out just the portion of the video we're interested in
- float flLeftU = 0.0f;
- float flTopV = 0.0f;
-
- // We need to subtract off a pixel to make sure we don't bleed
- float flRightU = m_flU - ( 1.0f / (float) m_nPlaybackWidth );
- float flBottomV = m_flV - ( 1.0f / (float) m_nPlaybackHeight );
-
- // Get the current viewport size
- int vx, vy, vw, vh;
- pRenderContext->GetViewport( vx, vy, vw, vh );
-
- // map from screen pixel coords to -1..1
- flRightX = FLerp( -1, 1, 0, vw, flRightX );
- flLeftX = FLerp( -1, 1, 0, vw, flLeftX );
- flTopY = FLerp( 1, -1, 0, vh ,flTopY );
- flBottomY = FLerp( 1, -1, 0, vh, flBottomY );
-
- float alpha = ((float)GetFgColor()[3]/255.0f);
-
- for ( int corner=0; corner<4; corner++ )
- {
- bool bLeft = (corner==0) || (corner==3);
- meshBuilder.Position3f( (bLeft) ? flLeftX : flRightX, (corner & 2) ? flBottomY : flTopY, 0.0f );
- meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f );
- meshBuilder.TexCoord2f( 0, (bLeft) ? flLeftU : flRightU, (corner & 2) ? flBottomV : flTopV );
- meshBuilder.TangentS3f( 0.0f, 1.0f, 0.0f );
- meshBuilder.TangentT3f( 1.0f, 0.0f, 0.0f );
- meshBuilder.Color4f( 1.0f, 1.0f, 1.0f, alpha );
- meshBuilder.AdvanceVertex();
- }
-
- meshBuilder.End();
- pMesh->Draw();
-
- pRenderContext->MatrixMode( MATERIAL_VIEW );
- pRenderContext->PopMatrix();
-
- pRenderContext->MatrixMode( MATERIAL_PROJECTION );
- pRenderContext->PopMatrix();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Create and playback a video in a panel
-// Input : nWidth - Width of panel (in pixels)
-// nHeight - Height of panel
-// *pVideoFilename - Name of the file to play
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool VideoPanel_Create( unsigned int nXPos, unsigned int nYPos,
- unsigned int nWidth, unsigned int nHeight,
- const char *pVideoFilename,
- const char *pExitCommand /*= NULL*/)
-{
- // Create the base video panel
- VideoPanel *pVideoPanel = new VideoPanel( nXPos, nYPos, nHeight, nWidth, false );
- if ( pVideoPanel == NULL )
- return false;
-
- // Set the command we'll call (if any) when the video is interrupted or completes
- pVideoPanel->SetExitCommand( pExitCommand );
-
- // Start it going
- if ( pVideoPanel->BeginPlayback( pVideoFilename ) == false )
- {
- delete pVideoPanel;
- return false;
- }
-
- // Take control
- pVideoPanel->DoModal();
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Used to launch a video playback (Debug) -
-// user must include file extension
-//-----------------------------------------------------------------------------
-
-CON_COMMAND( playvideo, "Plays a video: <filename> [width height]" )
-{
- if ( args.ArgC() < 2 )
- return;
-
- unsigned int nScreenWidth = Q_atoi( args[2] );
- unsigned int nScreenHeight = Q_atoi( args[3] );
-
- char strFullpath[MAX_PATH];
- Q_strncpy( strFullpath, "media/", MAX_PATH ); // Assume we must play out of the media directory
- char strFilename[MAX_PATH];
- Q_StripExtension( args[1], strFilename, MAX_PATH );
- Q_strncat( strFullpath, args[1], MAX_PATH );
-
- if ( nScreenWidth == 0 )
- {
- nScreenWidth = ScreenWidth();
- }
-
- if ( nScreenHeight == 0 )
- {
- nScreenHeight = ScreenHeight();
- }
-
- // Create the panel and go!
- if ( VideoPanel_Create( 0, 0, nScreenWidth, nScreenHeight, strFullpath ) == false )
- {
- Warning( "Unable to play video: %s\n", strFullpath );
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Used to launch a video playback and fire a command on completion
-//-----------------------------------------------------------------------------
-
-CON_COMMAND( playvideo_exitcommand, "Plays a video and fires and exit command when it is stopped or finishes: <filename> <exit command>" )
-{
- if ( args.ArgC() < 2 )
- return;
-
- unsigned int nScreenWidth = ScreenWidth();
- unsigned int nScreenHeight = ScreenHeight();
-
- char strFullpath[MAX_PATH];
- Q_strncpy( strFullpath, "media/", MAX_PATH ); // Assume we must play out of the media directory
- char strFilename[MAX_PATH];
- Q_StripExtension( args[1], strFilename, MAX_PATH );
- Q_strncat( strFullpath, args[1], MAX_PATH );
-
- char *pExitCommand = Q_strstr( args.GetCommandString(), args[2] );
-
- // Create the panel and go!
- if ( VideoPanel_Create( 0, 0, nScreenWidth, nScreenHeight, strFullpath, pExitCommand ) == false )
- {
- Warning( "Unable to play video: %s\n", strFullpath );
- engine->ClientCmd( pExitCommand );
- }
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: VGUI panel which can play back video, in-engine +// +//============================================================================= + +#include "cbase.h" +#include <vgui/IVGui.h> +#include "vgui/IInput.h" +#include <vgui/ISurface.h> +#include "ienginevgui.h" +#include "iclientmode.h" +#include "vgui_video.h" +#include "engine/IEngineSound.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + + +VideoPanel::VideoPanel( unsigned int nXPos, unsigned int nYPos, unsigned int nHeight, unsigned int nWidth, bool allowAlternateMedia ) : + BaseClass( NULL, "VideoPanel" ), + m_VideoMaterial( NULL ), + m_nPlaybackWidth( 0 ), + m_nPlaybackHeight( 0 ), + m_bAllowAlternateMedia( allowAlternateMedia ) +{ + vgui::VPANEL pParent = enginevgui->GetPanel( PANEL_GAMEUIDLL ); + SetParent( pParent ); + SetVisible( false ); + + // Must be passed in, off by default + m_szExitCommand[0] = '\0'; + + m_bBlackBackground = true; + + SetKeyBoardInputEnabled( true ); + SetMouseInputEnabled( false ); + + SetProportional( false ); + SetVisible( true ); + SetPaintBackgroundEnabled( false ); + SetPaintBorderEnabled( false ); + + // Set us up + SetTall( nHeight ); + SetWide( nWidth ); + SetPos( nXPos, nYPos ); + + SetScheme(vgui::scheme()->LoadSchemeFromFile( "resource/VideoPanelScheme.res", "VideoPanelScheme")); + LoadControlSettings("resource/UI/VideoPanel.res"); +} + +//----------------------------------------------------------------------------- +// Properly shutdown out materials +//----------------------------------------------------------------------------- +VideoPanel::~VideoPanel( void ) +{ + SetParent( (vgui::Panel *) NULL ); + + // Shut down this video, destroy the video material + if ( g_pVideo != NULL && m_VideoMaterial != NULL ) + { + g_pVideo->DestroyVideoMaterial( m_VideoMaterial ); + m_VideoMaterial = NULL; + } +} + +//----------------------------------------------------------------------------- +// Purpose: Begins playback of a movie +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool VideoPanel::BeginPlayback( const char *pFilename ) +{ + // Who the heck hacked this in? +#ifdef _X360 + XVIDEO_MODE videoMode; + XGetVideoMode( &videoMode ); + + // for 50Hz PAL, load a 25Hz version of the ep1_recap movie. + if( ( videoMode.RefreshRate < 59.0f ) && ( Q_stricmp( pFilename, "media/ep1_recap.bik" ) == 0 ) ) + { + pFilename = "media/ep1_recap_25fps.bik"; + } +#endif + + // need working video services + if ( g_pVideo == NULL ) + return false; + + // Create a new video material + if ( m_VideoMaterial != NULL ) + { + g_pVideo->DestroyVideoMaterial( m_VideoMaterial ); + m_VideoMaterial = NULL; + } + + m_VideoMaterial = g_pVideo->CreateVideoMaterial( "VideoMaterial", pFilename, "GAME", + VideoPlaybackFlags::DEFAULT_MATERIAL_OPTIONS, + VideoSystem::DETERMINE_FROM_FILE_EXTENSION, m_bAllowAlternateMedia ); + + if ( m_VideoMaterial == NULL ) + return false; + + // We want to be the sole audio source + // FIXME: This may not always be true! + enginesound->NotifyBeginMoviePlayback(); + + int nWidth, nHeight; + m_VideoMaterial->GetVideoImageSize( &nWidth, &nHeight ); + m_VideoMaterial->GetVideoTexCoordRange( &m_flU, &m_flV ); + m_pMaterial = m_VideoMaterial->GetMaterial(); + + + float flFrameRatio = ( (float) GetWide() / (float) GetTall() ); + float flVideoRatio = ( (float) nWidth / (float) nHeight ); + + if ( flVideoRatio > flFrameRatio ) + { + m_nPlaybackWidth = GetWide(); + m_nPlaybackHeight = ( GetWide() / flVideoRatio ); + } + else if ( flVideoRatio < flFrameRatio ) + { + m_nPlaybackWidth = ( GetTall() * flVideoRatio ); + m_nPlaybackHeight = GetTall(); + } + else + { + m_nPlaybackWidth = GetWide(); + m_nPlaybackHeight = GetTall(); + } + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void VideoPanel::Activate( void ) +{ + MoveToFront(); + RequestFocus(); + SetVisible( true ); + SetEnabled( true ); + + vgui::surface()->SetMinimized( GetVPanel(), false ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void VideoPanel::DoModal( void ) +{ + MakePopup(); + Activate(); + + vgui::input()->SetAppModalSurface( GetVPanel() ); + vgui::surface()->RestrictPaintToSinglePanel( GetVPanel() ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void VideoPanel::OnKeyCodeTyped( vgui::KeyCode code ) +{ + if ( code == KEY_ESCAPE ) + { + OnClose(); + } + else + { + BaseClass::OnKeyCodeTyped( code ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Handle keys that should cause us to close +//----------------------------------------------------------------------------- +void VideoPanel::OnKeyCodePressed( vgui::KeyCode code ) +{ + // These keys cause the panel to shutdown + if ( code == KEY_ESCAPE || + code == KEY_BACKQUOTE || + code == KEY_SPACE || + code == KEY_ENTER || + code == KEY_XBUTTON_A || + code == KEY_XBUTTON_B || + code == KEY_XBUTTON_X || + code == KEY_XBUTTON_Y || + code == KEY_XBUTTON_START || + code == KEY_XBUTTON_BACK ) + { + OnClose(); + } + else + { + BaseClass::OnKeyCodePressed( code ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void VideoPanel::OnClose( void ) +{ + enginesound->NotifyEndMoviePlayback(); + BaseClass::OnClose(); + + if ( vgui::input()->GetAppModalSurface() == GetVPanel() ) + { + vgui::input()->ReleaseAppModalSurface(); + } + + vgui::surface()->RestrictPaintToSinglePanel( NULL ); + + // Fire an exit command if we're asked to do so + if ( m_szExitCommand[0] ) + { + engine->ClientCmd( m_szExitCommand ); + } + + SetVisible( false ); + MarkForDeletion(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void VideoPanel::GetPanelPos( int &xpos, int &ypos ) +{ + xpos = ( (float) ( GetWide() - m_nPlaybackWidth ) / 2 ); + ypos = ( (float) ( GetTall() - m_nPlaybackHeight ) / 2 ); +} + +//----------------------------------------------------------------------------- +// Purpose: Update and draw the frame +//----------------------------------------------------------------------------- +void VideoPanel::Paint( void ) +{ + BaseClass::Paint(); + + if ( m_VideoMaterial == NULL ) + return; + + if ( m_VideoMaterial->Update() == false ) + { + // Issue a close command + OnVideoOver(); + OnClose(); + } + + // Sit in the "center" + int xpos, ypos; + GetPanelPos( xpos, ypos ); + + // Black out the background (we could omit drawing under the video surface, but this is straight-forward) + if ( m_bBlackBackground ) + { + vgui::surface()->DrawSetColor( 0, 0, 0, 255 ); + vgui::surface()->DrawFilledRect( 0, 0, GetWide(), GetTall() ); + } + + // Draw the polys to draw this out + CMatRenderContextPtr pRenderContext( materials ); + + pRenderContext->MatrixMode( MATERIAL_VIEW ); + pRenderContext->PushMatrix(); + pRenderContext->LoadIdentity(); + + pRenderContext->MatrixMode( MATERIAL_PROJECTION ); + pRenderContext->PushMatrix(); + pRenderContext->LoadIdentity(); + + pRenderContext->Bind( m_pMaterial, NULL ); + + CMeshBuilder meshBuilder; + IMesh* pMesh = pRenderContext->GetDynamicMesh( true ); + meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); + + float flLeftX = xpos; + float flRightX = xpos + (m_nPlaybackWidth-1); + + float flTopY = ypos; + float flBottomY = ypos + (m_nPlaybackHeight-1); + + // Map our UVs to cut out just the portion of the video we're interested in + float flLeftU = 0.0f; + float flTopV = 0.0f; + + // We need to subtract off a pixel to make sure we don't bleed + float flRightU = m_flU - ( 1.0f / (float) m_nPlaybackWidth ); + float flBottomV = m_flV - ( 1.0f / (float) m_nPlaybackHeight ); + + // Get the current viewport size + int vx, vy, vw, vh; + pRenderContext->GetViewport( vx, vy, vw, vh ); + + // map from screen pixel coords to -1..1 + flRightX = FLerp( -1, 1, 0, vw, flRightX ); + flLeftX = FLerp( -1, 1, 0, vw, flLeftX ); + flTopY = FLerp( 1, -1, 0, vh ,flTopY ); + flBottomY = FLerp( 1, -1, 0, vh, flBottomY ); + + float alpha = ((float)GetFgColor()[3]/255.0f); + + for ( int corner=0; corner<4; corner++ ) + { + bool bLeft = (corner==0) || (corner==3); + meshBuilder.Position3f( (bLeft) ? flLeftX : flRightX, (corner & 2) ? flBottomY : flTopY, 0.0f ); + meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f ); + meshBuilder.TexCoord2f( 0, (bLeft) ? flLeftU : flRightU, (corner & 2) ? flBottomV : flTopV ); + meshBuilder.TangentS3f( 0.0f, 1.0f, 0.0f ); + meshBuilder.TangentT3f( 1.0f, 0.0f, 0.0f ); + meshBuilder.Color4f( 1.0f, 1.0f, 1.0f, alpha ); + meshBuilder.AdvanceVertex(); + } + + meshBuilder.End(); + pMesh->Draw(); + + pRenderContext->MatrixMode( MATERIAL_VIEW ); + pRenderContext->PopMatrix(); + + pRenderContext->MatrixMode( MATERIAL_PROJECTION ); + pRenderContext->PopMatrix(); +} + +//----------------------------------------------------------------------------- +// Purpose: Create and playback a video in a panel +// Input : nWidth - Width of panel (in pixels) +// nHeight - Height of panel +// *pVideoFilename - Name of the file to play +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool VideoPanel_Create( unsigned int nXPos, unsigned int nYPos, + unsigned int nWidth, unsigned int nHeight, + const char *pVideoFilename, + const char *pExitCommand /*= NULL*/) +{ + // Create the base video panel + VideoPanel *pVideoPanel = new VideoPanel( nXPos, nYPos, nHeight, nWidth, false ); + if ( pVideoPanel == NULL ) + return false; + + // Set the command we'll call (if any) when the video is interrupted or completes + pVideoPanel->SetExitCommand( pExitCommand ); + + // Start it going + if ( pVideoPanel->BeginPlayback( pVideoFilename ) == false ) + { + delete pVideoPanel; + return false; + } + + // Take control + pVideoPanel->DoModal(); + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: Used to launch a video playback (Debug) - +// user must include file extension +//----------------------------------------------------------------------------- + +CON_COMMAND( playvideo, "Plays a video: <filename> [width height]" ) +{ + if ( args.ArgC() < 2 ) + return; + + unsigned int nScreenWidth = Q_atoi( args[2] ); + unsigned int nScreenHeight = Q_atoi( args[3] ); + + char strFullpath[MAX_PATH]; + Q_strncpy( strFullpath, "media/", MAX_PATH ); // Assume we must play out of the media directory + char strFilename[MAX_PATH]; + Q_StripExtension( args[1], strFilename, MAX_PATH ); + Q_strncat( strFullpath, args[1], MAX_PATH ); + + if ( nScreenWidth == 0 ) + { + nScreenWidth = ScreenWidth(); + } + + if ( nScreenHeight == 0 ) + { + nScreenHeight = ScreenHeight(); + } + + // Create the panel and go! + if ( VideoPanel_Create( 0, 0, nScreenWidth, nScreenHeight, strFullpath ) == false ) + { + Warning( "Unable to play video: %s\n", strFullpath ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Used to launch a video playback and fire a command on completion +//----------------------------------------------------------------------------- + +CON_COMMAND( playvideo_exitcommand, "Plays a video and fires and exit command when it is stopped or finishes: <filename> <exit command>" ) +{ + if ( args.ArgC() < 2 ) + return; + + unsigned int nScreenWidth = ScreenWidth(); + unsigned int nScreenHeight = ScreenHeight(); + + char strFullpath[MAX_PATH]; + Q_strncpy( strFullpath, "media/", MAX_PATH ); // Assume we must play out of the media directory + char strFilename[MAX_PATH]; + Q_StripExtension( args[1], strFilename, MAX_PATH ); + Q_strncat( strFullpath, args[1], MAX_PATH ); + + char *pExitCommand = Q_strstr( args.GetCommandString(), args[2] ); + + // Create the panel and go! + if ( VideoPanel_Create( 0, 0, nScreenWidth, nScreenHeight, strFullpath, pExitCommand ) == false ) + { + Warning( "Unable to play video: %s\n", strFullpath ); + engine->ClientCmd( pExitCommand ); + } }
\ No newline at end of file |