summaryrefslogtreecommitdiff
path: root/utils/hlfaceposer/choreoactorwidget.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/hlfaceposer/choreoactorwidget.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/hlfaceposer/choreoactorwidget.cpp')
-rw-r--r--utils/hlfaceposer/choreoactorwidget.cpp415
1 files changed, 415 insertions, 0 deletions
diff --git a/utils/hlfaceposer/choreoactorwidget.cpp b/utils/hlfaceposer/choreoactorwidget.cpp
new file mode 100644
index 0000000..aefe8e0
--- /dev/null
+++ b/utils/hlfaceposer/choreoactorwidget.cpp
@@ -0,0 +1,415 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//===========================================================================//
+#include <stdio.h>
+#include "hlfaceposer.h"
+#include "choreoactorwidget.h"
+#include "choreochannelwidget.h"
+#include "choreoactor.h"
+#include "choreoview.h"
+#include "choreowidgetdrawhelper.h"
+#include "mxBitmapButton.h"
+#include "choreoviewcolors.h"
+#include "choreochannel.h"
+#include "filesystem.h"
+#include "StudioModel.h"
+
+#define ACTOR_NAME_HEIGHT 26
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *actor -
+// *parent -
+// x -
+// y -
+// w -
+// h -
+// 0 -
+// 0 -
+//-----------------------------------------------------------------------------
+CActorBitmapButton::CActorBitmapButton( CChoreoActorWidget *actor, mxWindow *parent, int x, int y, int w, int h, int id /*= 0*/, const char *bitmap /*= 0*/ )
+: mxBitmapButton( parent, x, y, w, h, id, bitmap )
+{
+ m_pActor = actor;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CChoreoActorWidget *CActorBitmapButton::GetActor( void )
+{
+ return m_pActor;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CActorActiveCheckBox::CActorActiveCheckBox( CChoreoActorWidget *actor, mxWindow *parent, int x, int y, int w, int h, const char *label /*= 0*/, int id /*= 0*/ )
+ : mxCheckBox( parent, x, y, w, h, label, id )
+{
+ m_pActor = actor;
+}
+
+CChoreoActorWidget *CActorActiveCheckBox::GetActor( void )
+{
+ return m_pActor;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *parent -
+//-----------------------------------------------------------------------------
+CChoreoActorWidget::CChoreoActorWidget( CChoreoWidget *parent )
+: CChoreoWidget( parent )
+{
+ m_pParent = parent;
+
+ m_pActor = NULL;
+
+ m_bShowChannels = true;
+
+ m_btnOpen = new CActorBitmapButton( this, m_pView, 0, 0, 0, 0, IDC_CHANNELOPEN, "gfx/hlfaceposer/channelopen.bmp" );
+ m_btnClose = new CActorBitmapButton( this, m_pView, 0, 0, 0, 0, IDC_CHANNELCLOSE, "gfx/hlfaceposer/channelclose.bmp" );
+
+ ShowChannels( m_bShowChannels );
+
+ memset( m_rgCurrentSetting, 0, sizeof( m_rgCurrentSetting ) );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CChoreoActorWidget::~CChoreoActorWidget( void )
+{
+ for ( int i = 0 ; i < m_Channels.Size(); i++ )
+ {
+ CChoreoChannelWidget *c = m_Channels[ i ];
+ delete c;
+ }
+ m_Channels.RemoveAll();
+
+ delete m_btnOpen;
+ delete m_btnClose;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CChoreoActorWidget::GetShowChannels( void )
+{
+ return m_bShowChannels;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Switch modes
+// Input : show -
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::ShowChannels( bool show )
+{
+ m_bShowChannels = show;
+
+ m_btnOpen->setVisible( !m_bShowChannels );
+ m_btnClose->setVisible( m_bShowChannels );
+
+ m_pView->InvalidateLayout();
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::Create( void )
+{
+ // Create objects for children
+ Assert( m_pActor );
+
+ // Create objects for children
+ for ( int i = 0; i < m_pActor->GetNumChannels(); i++ )
+ {
+ CChoreoChannel *channel = m_pActor->GetChannel( i );
+ Assert( channel );
+ if ( !channel )
+ {
+ continue;
+ }
+
+ CChoreoChannelWidget *channelWidget = new CChoreoChannelWidget( this );
+ channelWidget->SetChannel( channel );
+ channelWidget->Create();
+
+ AddChannel( channelWidget );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : rc -
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::Layout( RECT& rc )
+{
+ setBounds( rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top );
+
+ int buttonSize = 16;
+ int ypos = rc.top + ( ACTOR_NAME_HEIGHT - buttonSize )/ 2;
+
+ m_btnOpen->setBounds( rc.left + 2, ypos, buttonSize, buttonSize );
+ m_btnClose->setBounds( rc.left + 2, ypos, buttonSize, buttonSize );
+
+ bool buttonsVisible = ( ypos > m_pView->GetStartRow() && ( ypos + buttonSize ) < m_pView->GetEndRow() ) ? true : false;
+
+ if ( !buttonsVisible )
+ {
+ m_btnOpen->setVisible( false );
+ m_btnClose->setVisible( false );
+ }
+ else
+ {
+ m_btnOpen->setVisible( !m_bShowChannels );
+ m_btnClose->setVisible( m_bShowChannels );
+ }
+
+ RECT rcChannels;
+ rcChannels = rc;
+ rcChannels.top += ACTOR_NAME_HEIGHT;
+
+ // Create objects for children
+ for ( int i = 0; i < m_Channels.Size(); i++ )
+ {
+ CChoreoChannelWidget *channel = m_Channels[ i ];
+ Assert( channel );
+ if ( !channel )
+ {
+ continue;
+ }
+
+ rcChannels.bottom = rcChannels.top + channel->GetItemHeight();
+
+ channel->Layout( rcChannels );
+
+ OffsetRect( &rcChannels, 0, channel->GetItemHeight() );
+
+ channel->setVisible( m_bShowChannels );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CChoreoActorWidget::GetItemHeight( void )
+{
+ int itemHeight = ACTOR_NAME_HEIGHT + 2;
+ if ( m_bShowChannels )
+ {
+ for ( int i = 0; i < m_Channels.Size(); i++ )
+ {
+ CChoreoChannelWidget *channel = m_Channels[ i ];
+ itemHeight += channel->GetItemHeight();
+ }
+ }
+ return itemHeight;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::redraw( CChoreoWidgetDrawHelper& drawHelper )
+{
+ if ( !getVisible() )
+ return;
+
+ CChoreoActor *actor = GetActor();
+ if ( !actor )
+ return;
+
+ RECT rcClient = getBounds();
+
+ if ( !actor->GetActive() )
+ {
+ RECT rcBg = rcClient;
+ rcBg.right = rcBg.left + m_pView->GetLabelWidth() ;
+ InflateRect( &rcBg, -3, -5 );
+
+ drawHelper.DrawFilledRect( RGB( 220, 220, 220 ), rcBg );
+ }
+
+ RECT rcText;
+
+ rcText.left = rcClient.left;
+ rcText.right = rcClient.left + m_pView->GetLabelWidth();
+ rcText.top = rcClient.top;
+ rcText.bottom = rcClient.top + ACTOR_NAME_HEIGHT;
+
+ drawHelper.DrawColoredLine( COLOR_CHOREO_ACTORLINE, PS_SOLID, 1, 0, rcText.top,
+ rcClient.right, rcText.top );
+
+ drawHelper.DrawColoredLine( COLOR_CHOREO_ACTORLINE, PS_SOLID, 1, 0, rcClient.bottom-2,
+ rcClient.right, rcClient.bottom-2 );
+ drawHelper.DrawColoredLine( RGB(200,206,255), PS_SOLID, 1, 0, rcClient.bottom-1,
+ rcClient.right, rcClient.bottom-1 );
+
+ drawHelper.DrawColoredLine( COLOR_CHOREO_DIVIDER, PS_SOLID, 1, rcText.right, rcClient.top,
+ rcText.right, rcClient.bottom-1 );
+
+ RECT rcName = rcText;
+
+ rcName.left += 18;
+ char n[ 512 ];
+ V_strcpy_safe( n, actor->GetName() );
+
+ drawHelper.DrawColoredText( "Arial",
+ m_pView->GetFontSize() + 5,
+ 1000,
+ actor->GetActive() ? COLOR_CHOREO_ACTORNAME : COLOR_CHOREO_ACTORNAME_INACTIVE,
+ rcName, n );
+
+ if ( !actor->GetActive() )
+ {
+ strcpy( n, "(inactive)" );
+
+ RECT rcInactive = rcName;
+ int len = drawHelper.CalcTextWidth( "Arial", m_pView->GetFontSize() - 2, 500, n );
+ rcInactive.left = rcInactive.right - len - 5;
+ rcInactive.top += 3;
+ rcInactive.bottom = rcInactive.top + m_pView->GetFontSize() - 2;
+
+ drawHelper.DrawColoredText( "Arial", m_pView->GetFontSize() - 2, 500,
+ COLOR_CHOREO_ACTORNAME_INACTIVE, rcInactive, n );
+ }
+
+ rcName.left -= 18;
+
+
+ if ( actor->GetFacePoserModelName()[0] )
+ {
+ int textWidth = drawHelper.CalcTextWidth( "Arial", m_pView->GetFontSize() + 5, 1000, actor->GetName() );
+ RECT rcModelName = rcName;
+ rcModelName.left += ( 14 + textWidth + 2 );
+
+ int fontsize = m_pView->GetFontSize() - 2;
+
+ char shortname[ 512 ];
+ Q_FileBase (actor->GetFacePoserModelName(), shortname, sizeof( shortname ) );
+ strcat( shortname, ".mdl" );
+
+ int len = drawHelper.CalcTextWidth( "Arial", fontsize, FW_NORMAL, shortname );
+
+ rcModelName.left = rcModelName.right - len - 5;
+
+ rcModelName.top = rcModelName.bottom - fontsize;
+ OffsetRect( &rcModelName, 0, -3 );
+ drawHelper.DrawColoredText( "Arial", fontsize, FW_NORMAL, COLOR_CHOREO_LIGHTTEXT, rcModelName, shortname );
+ }
+ if ( m_bShowChannels )
+ {
+ for ( int j = 0; j < GetNumChannels(); j++ )
+ {
+ CChoreoChannelWidget *channel = GetChannel( j );
+ if ( channel )
+ {
+ channel->redraw( drawHelper );
+ }
+
+ RECT rcChannel = channel->getBounds();
+
+ drawHelper.DrawColoredLine( COLOR_CHOREO_ACTORLINE, PS_SOLID, 1, rcText.right+1, rcChannel.top,
+ rcChannel.right, rcChannel.top );
+
+ drawHelper.DrawColoredLine( COLOR_CHOREO_ACTORLINE, PS_SOLID, 1, rcText.right+1, rcChannel.bottom,
+ rcChannel.right, rcChannel.bottom );
+
+ }
+ return;
+ }
+
+ OffsetRect( &rcName, m_pView->GetLabelWidth() + 10, 0 );
+ rcName.right = w();
+
+ char sz[ 256 ];
+ // count channels and events
+ int ev = 0;
+ for ( int i = 0; i < actor->GetNumChannels(); i++ )
+ {
+ CChoreoChannel *ch = actor->GetChannel( i );
+ if ( ch )
+ {
+ ev += ch->GetNumEvents();
+ }
+ }
+ sprintf( sz, "%i channels with %i events hidden", actor->GetNumChannels(), ev );
+ drawHelper.DrawColoredText( "Arial", m_pView->GetFontSize(), FW_NORMAL, COLOR_CHOREO_ACTORNAME, rcName, sz );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : CChoreoActor
+//-----------------------------------------------------------------------------
+CChoreoActor *CChoreoActorWidget::GetActor( void )
+{
+ return m_pActor;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *actor -
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::SetActor( CChoreoActor *actor )
+{
+ m_pActor = actor;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *channel -
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::AddChannel( CChoreoChannelWidget *channel )
+{
+ m_Channels.AddToTail( channel );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *channel -
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::RemoveChannel( CChoreoChannelWidget *channel )
+{
+ m_Channels.FindAndRemove( channel );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : num -
+// Output : CChoreoChannelWidget
+//-----------------------------------------------------------------------------
+CChoreoChannelWidget *CChoreoActorWidget::GetChannel( int num )
+{
+ return m_Channels[ num ];
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : int
+//-----------------------------------------------------------------------------
+int CChoreoActorWidget::GetNumChannels( void )
+{
+ return m_Channels.Size();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : float
+//-----------------------------------------------------------------------------
+float *CChoreoActorWidget::GetSettings( void )
+{
+ return m_rgCurrentSetting;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CChoreoActorWidget::ResetSettings( void )
+{
+ memset( m_rgCurrentSetting, 0, sizeof( m_rgCurrentSetting ) );
+}