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.
415 lines
12 KiB
415 lines
12 KiB
//========= 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 ) ); |
|
}
|
|
|