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.
277 lines
7.7 KiB
277 lines
7.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
|
|
#include "cbase.h" |
|
#include "vgui/IInput.h" |
|
#include <vgui/IVGui.h> |
|
#include "commentary_modelviewer.h" |
|
#include "iclientmode.h" |
|
#include "baseviewport.h" |
|
|
|
DECLARE_BUILD_FACTORY( CCommentaryModelPanel ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
CCommentaryModelPanel::CCommentaryModelPanel( vgui::Panel *parent, const char *name ) : CModelPanel( parent, name ) |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
CCommentaryModelViewer::CCommentaryModelViewer(IViewPort *pViewPort) : Frame(NULL, PANEL_COMMENTARY_MODELVIEWER ) |
|
{ |
|
m_pViewPort = pViewPort; |
|
m_pModelPanel = NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
CCommentaryModelViewer::~CCommentaryModelViewer() |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::ApplySchemeSettings( vgui::IScheme *pScheme ) |
|
{ |
|
BaseClass::ApplySchemeSettings( pScheme ); |
|
|
|
LoadControlSettings( "Resource/UI/CommentaryModelViewer.res" ); |
|
|
|
m_pModelPanel = dynamic_cast<CCommentaryModelPanel*>( FindChildByName( "modelpanel" ) ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::PerformLayout( void ) |
|
{ |
|
int w,h; |
|
GetParent()->GetSize( w, h ); |
|
SetBounds(0,0,w,h); |
|
|
|
if ( m_pModelPanel ) |
|
{ |
|
m_pModelPanel->SetBounds(0,0,w,h); |
|
} |
|
|
|
BaseClass::PerformLayout(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::SetModel( const char *pszName, const char *pszAttached ) |
|
{ |
|
if ( !m_pModelPanel ) |
|
return; |
|
|
|
m_pModelPanel->SwapModel( pszName, pszAttached ); |
|
|
|
m_flYawSpeed = 0; |
|
m_flZoomSpeed = 0; |
|
m_bTranslating = false; |
|
|
|
m_vecResetPos = m_pModelPanel->m_pModelInfo->m_vecOriginOffset; |
|
m_vecResetAngles = m_pModelPanel->m_pModelInfo->m_vecAbsAngles; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::ShowPanel(bool bShow) |
|
{ |
|
if ( BaseClass::IsVisible() == bShow ) |
|
return; |
|
|
|
if ( bShow ) |
|
{ |
|
Activate(); |
|
SetMouseInputEnabled( true ); |
|
} |
|
else |
|
{ |
|
SetVisible( false ); |
|
SetMouseInputEnabled( false ); |
|
} |
|
|
|
m_pViewPort->ShowBackGround( bShow ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::OnCommand( const char *command ) |
|
{ |
|
if ( Q_stricmp( command, "vguicancel" ) ) |
|
{ |
|
engine->ClientCmd( const_cast<char *>( command ) ); |
|
} |
|
|
|
Close(); |
|
m_pViewPort->ShowBackGround( false ); |
|
|
|
BaseClass::OnCommand( command ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::OnKeyCodePressed( vgui::KeyCode code ) |
|
{ |
|
if ( code == KEY_ENTER ) |
|
{ |
|
Close(); |
|
m_pViewPort->ShowBackGround( false ); |
|
} |
|
else if ( code == KEY_SPACE ) |
|
{ |
|
m_bTranslating = !m_bTranslating; |
|
} |
|
else if ( code == KEY_R ) |
|
{ |
|
m_pModelPanel->m_pModelInfo->m_vecOriginOffset = m_vecResetPos; |
|
m_pModelPanel->m_pModelInfo->m_vecAbsAngles = m_vecResetAngles; |
|
m_flYawSpeed = 0; |
|
m_flZoomSpeed = 0; |
|
|
|
m_pModelPanel->ZoomToFrameDistance(); |
|
} |
|
else |
|
{ |
|
BaseClass::OnKeyCodePressed( code ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::OnThink( void ) |
|
{ |
|
HandleMovementInput(); |
|
|
|
BaseClass::OnThink(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCommentaryModelViewer::HandleMovementInput( void ) |
|
{ |
|
bool bLeftDown = input()->IsKeyDown(KEY_LEFT); |
|
bool bRightDown = input()->IsKeyDown(KEY_RIGHT); |
|
bool bForwardDown = input()->IsKeyDown(KEY_UP); |
|
bool bBackDown = input()->IsKeyDown(KEY_DOWN); |
|
|
|
float flAccel = 0.05; |
|
|
|
// Rotation around Z |
|
if ( bLeftDown ) |
|
{ |
|
if ( m_flYawSpeed > 0 ) |
|
{ |
|
m_flYawSpeed = 0; |
|
} |
|
m_flYawSpeed = MAX(m_flYawSpeed-flAccel, -3.0); |
|
} |
|
else if ( bRightDown ) |
|
{ |
|
if ( m_flYawSpeed < 0 ) |
|
{ |
|
m_flYawSpeed = 0; |
|
} |
|
m_flYawSpeed = MIN(m_flYawSpeed+flAccel, 3.0); |
|
} |
|
if ( m_flYawSpeed != 0 ) |
|
{ |
|
if ( m_bTranslating ) |
|
{ |
|
m_pModelPanel->m_pModelInfo->m_vecOriginOffset.y = clamp( m_pModelPanel->m_pModelInfo->m_vecOriginOffset.y + m_flYawSpeed, -100.f, 100.f ); |
|
} |
|
else |
|
{ |
|
m_pModelPanel->m_pModelInfo->m_vecAbsAngles.y = anglemod( m_pModelPanel->m_pModelInfo->m_vecAbsAngles.y + m_flYawSpeed ); |
|
} |
|
|
|
if ( !bLeftDown && !bRightDown ) |
|
{ |
|
m_flYawSpeed = ( m_flYawSpeed > 0 ) ? MAX(0,m_flYawSpeed-0.1) : MIN(0,m_flYawSpeed+0.1); |
|
} |
|
} |
|
|
|
// Zooming |
|
if ( bForwardDown ) |
|
{ |
|
if ( m_flZoomSpeed > 0 ) |
|
{ |
|
m_flZoomSpeed = 0; |
|
} |
|
m_flZoomSpeed = MAX(m_flZoomSpeed-flAccel, -3.0); |
|
} |
|
else if ( bBackDown ) |
|
{ |
|
if ( m_flZoomSpeed < 0 ) |
|
{ |
|
m_flZoomSpeed = 0; |
|
} |
|
m_flZoomSpeed = MIN(m_flZoomSpeed+flAccel, 3.0); |
|
} |
|
if ( m_flZoomSpeed != 0 ) |
|
{ |
|
if ( m_bTranslating ) |
|
{ |
|
m_pModelPanel->m_pModelInfo->m_vecOriginOffset.z = clamp( m_pModelPanel->m_pModelInfo->m_vecOriginOffset.z + m_flZoomSpeed, -100.f, 300.f ); |
|
} |
|
else |
|
{ |
|
float flZoomMin = m_pModelPanel->m_flFrameDistance * 0.75; |
|
float flZoomMax = m_pModelPanel->m_flFrameDistance * 1.5; |
|
m_pModelPanel->m_pModelInfo->m_vecOriginOffset.x = clamp( m_pModelPanel->m_pModelInfo->m_vecOriginOffset.x + m_flZoomSpeed, flZoomMin, flZoomMax ); |
|
} |
|
|
|
if ( !bForwardDown && !bBackDown ) |
|
{ |
|
m_flZoomSpeed = ( m_flZoomSpeed > 0 ) ? MAX(0,m_flZoomSpeed-0.1) : MIN(0,m_flZoomSpeed+0.1); |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CommentaryShowModelViewer( const CCommand &args ) |
|
{ |
|
if ( args.ArgC() < 2 ) |
|
{ |
|
ConMsg( "Usage: commentary_showmodelviewer <model name> <optional attached model name>\n" ); |
|
return; |
|
} |
|
|
|
CBaseViewport *pViewport = dynamic_cast<CBaseViewport *>( g_pClientMode->GetViewport() ); |
|
if ( pViewport ) |
|
{ |
|
IViewPortPanel *pCommentaryPanel = pViewport->FindPanelByName( PANEL_COMMENTARY_MODELVIEWER ); |
|
if ( !pCommentaryPanel ) |
|
{ |
|
pCommentaryPanel = pViewport->CreatePanelByName( PANEL_COMMENTARY_MODELVIEWER ); |
|
pViewport->AddNewPanel( pCommentaryPanel, "PANEL_COMMENTARY_MODELVIEWER" ); |
|
} |
|
|
|
if ( pCommentaryPanel ) |
|
{ |
|
//((CCommentaryModelViewer*)pCommentaryPanel)->InvalidateLayout( false, true ); |
|
((CCommentaryModelViewer*)pCommentaryPanel)->SetModel( args[1], args[2] ); |
|
pViewport->ShowPanel( pCommentaryPanel, true ); |
|
} |
|
} |
|
} |
|
|
|
ConCommand commentary_showmodelviewer( "commentary_showmodelviewer", CommentaryShowModelViewer, "Display the commentary model viewer. Usage: commentary_showmodelviewer <model name> <optional attached model name>", FCVAR_NONE );
|
|
|