mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2024-12-22 17:47:38 +08:00
278 lines
8.0 KiB
C++
278 lines
8.0 KiB
C++
//========= 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 );
|