368 lines
8.9 KiB
C++
368 lines
8.9 KiB
C++
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Crytek Engine Source File.
|
|
// Copyright (C), Crytek Studios, 2002.
|
|
// -------------------------------------------------------------------------
|
|
// File name: tvtrackpropsdialog.cpp
|
|
// Version: v1.00
|
|
// Created: 28/5/2002 by Timur.
|
|
// Compilers: Visual Studio.NET
|
|
// Description:
|
|
// -------------------------------------------------------------------------
|
|
// History:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "TVTrackPropsDialog.h"
|
|
#include "TVSelectKeyDialog.h"
|
|
#include "TVSoundKeyDialog.h"
|
|
#include "TVEventKeyDialog.h"
|
|
#include "TVCharacterKeyDialog.h"
|
|
#include "TVExprKeyDialog.h"
|
|
#include "TVConsoleKeyDialog.h"
|
|
#include "TVMusicKeyDialog.h"
|
|
#include "AnimationContext.h"
|
|
#include "IMovieSystem.h"
|
|
|
|
// CTVTrackPropsDialog dialog
|
|
|
|
IMPLEMENT_DYNAMIC(CTVTrackPropsDialog, CDialog)
|
|
CTVTrackPropsDialog::CTVTrackPropsDialog(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CTVTrackPropsDialog::IDD, pParent)
|
|
{
|
|
m_track = 0;
|
|
m_node = 0;
|
|
m_key = -1;
|
|
m_currentDlg = -1;
|
|
}
|
|
|
|
CTVTrackPropsDialog::~CTVTrackPropsDialog()
|
|
{
|
|
}
|
|
|
|
void CTVTrackPropsDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Control(pDX, IDC_PREVNEXT, m_keySpinBtn);
|
|
DDX_Control(pDX, IDC_KEYNUM, m_keynum);
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTVTrackPropsDialog, CDialog)
|
|
ON_NOTIFY(UDN_DELTAPOS, IDC_PREVNEXT, OnDeltaposPrevnext)
|
|
ON_EN_UPDATE(IDC_TIME, OnUpdateTime)
|
|
ON_BN_CLICKED(IDC_CONSTANT, OnBnClickedConstant)
|
|
ON_BN_CLICKED(IDC_CYCLE, OnBnClickedCycle)
|
|
ON_BN_CLICKED(IDC_LOOP, OnBnClickedLoop)
|
|
ON_WM_DESTROY()
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
// CTVTrackPropsDialog message handlers
|
|
|
|
BOOL CTVTrackPropsDialog::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
m_time.Create( this,IDC_TIME );
|
|
m_time.SetRange( -10000,10000 );
|
|
|
|
m_keySpinBtn.SetPos(0);
|
|
m_keySpinBtn.SetBuddy( &m_keynum );
|
|
m_keySpinBtn.SetRange( -10000,10000 );
|
|
|
|
CRect rc;
|
|
CWnd *keyPropsWnd = GetDlgItem(IDC_KEY);
|
|
if (keyPropsWnd)
|
|
{
|
|
keyPropsWnd->GetWindowRect(rc);
|
|
ScreenToClient(rc);
|
|
}
|
|
|
|
SKeyDlgInfo DlgInfo;
|
|
|
|
DlgInfo.pDlg=new CTVEventKeyDialog;
|
|
DlgInfo.pDlg->Create( CTVEventKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_EVENT);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
DlgInfo.pDlg=new CTcbKeyDialog;
|
|
DlgInfo.pDlg->Create( CTcbKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_TCB_FLOAT);
|
|
DlgInfo.Tracks.push_back(ATRACK_TCB_VECTOR);
|
|
DlgInfo.Tracks.push_back(ATRACK_TCB_QUAT);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
DlgInfo.pDlg=new CTVSelectKeyDialog;
|
|
DlgInfo.pDlg->Create( CTVSelectKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_SELECT);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
DlgInfo.pDlg=new CTVSoundKeyDialog;
|
|
DlgInfo.pDlg->Create( CTVSoundKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_SOUND);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
DlgInfo.pDlg=new CTVCharacterKeyDialog;
|
|
DlgInfo.pDlg->Create( CTVCharacterKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_CHARACTER);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
DlgInfo.pDlg=new CTVExprKeyDialog;
|
|
DlgInfo.pDlg->Create( CTVExprKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_EXPRESSION);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
DlgInfo.pDlg=new CTVConsoleKeyDialog;
|
|
DlgInfo.pDlg->Create( CTVConsoleKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_CONSOLE);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
DlgInfo.pDlg=new CTVMusicKeyDialog;
|
|
DlgInfo.pDlg->Create( CTVMusicKeyDialog::IDD,this );
|
|
DlgInfo.pDlg->MoveWindow( rc );
|
|
DlgInfo.pDlg->ShowWindow( SW_HIDE );
|
|
DlgInfo.Tracks.clear();
|
|
DlgInfo.Tracks.push_back(ATRACK_MUSIC);
|
|
m_KeyDlg.push_back(DlgInfo);
|
|
|
|
/*
|
|
m_dlgTcb.Create( CTcbKeyDialog::IDD,this );
|
|
m_dlgTcb.MoveWindow( rc );
|
|
m_dlgTcb.ShowWindow( SW_HIDE );
|
|
|
|
m_dlgEntity.Create( CTVEntityKeyDialog::IDD,this );
|
|
m_dlgEntity.MoveWindow( rc );
|
|
m_dlgEntity.ShowWindow( SW_HIDE );
|
|
*/
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTVTrackPropsDialog::SetKey( IAnimNode *node,int paramId,IAnimTrack *track,int nkey )
|
|
{
|
|
assert( track );
|
|
|
|
m_currentDlg = -1;
|
|
EAnimTrackType trType = track->GetType();
|
|
for (int i=0;i<(int)m_KeyDlg.size();i++)
|
|
{
|
|
IKeyDlg *pDlg=m_KeyDlg[i].pDlg;
|
|
SKeyDlgInfo::TTracks::iterator It=std::find(m_KeyDlg[i].Tracks.begin(), m_KeyDlg[i].Tracks.end(), trType);
|
|
if (It!=m_KeyDlg[i].Tracks.end())
|
|
{
|
|
m_currentDlg = i;
|
|
pDlg->ShowWindow(SW_SHOW);
|
|
}
|
|
else
|
|
pDlg->ShowWindow(SW_HIDE);
|
|
}
|
|
/*switch (trType)
|
|
{
|
|
case ATRACK_TCB_FLOAT:
|
|
case ATRACK_TCB_VECTOR:
|
|
case ATRACK_TCB_QUAT:
|
|
m_dlgTcb.ShowWindow( SW_SHOW );
|
|
m_dlgEntity.ShowWindow( SW_HIDE );
|
|
break;
|
|
case ATRACK_ENTITY:
|
|
m_dlgTcb.ShowWindow( SW_HIDE );
|
|
m_dlgEntity.ShowWindow( SW_SHOW );
|
|
break;
|
|
default:
|
|
m_dlgTcb.ShowWindow( SW_HIDE );
|
|
m_dlgEntity.ShowWindow( SW_HIDE );
|
|
}*/
|
|
|
|
m_track = track;
|
|
m_node = node;
|
|
m_key = nkey;
|
|
|
|
CString title;
|
|
title = node->GetName();
|
|
title += "\\";
|
|
|
|
IAnimBlock *ablock = node->GetAnimBlock();
|
|
if (ablock)
|
|
{
|
|
IAnimNode::SParamInfo info;
|
|
if (node->GetParamInfo( paramId,info ))
|
|
{
|
|
title += info.name;
|
|
}
|
|
}
|
|
|
|
if (IsWindow(m_hWnd))
|
|
{
|
|
SetCurrKey(nkey);
|
|
|
|
// Set track properties.
|
|
if (m_track->GetFlags() & ATRACK_LOOP)
|
|
{
|
|
CheckDlgButton( IDC_CONSTANT,BST_UNCHECKED );
|
|
CheckDlgButton( IDC_CYCLE,BST_UNCHECKED );
|
|
CheckDlgButton( IDC_LOOP,BST_CHECKED );
|
|
}
|
|
else if (m_track->GetFlags() & ATRACK_CYCLE)
|
|
{
|
|
CheckDlgButton( IDC_CONSTANT,BST_UNCHECKED );
|
|
CheckDlgButton( IDC_CYCLE,BST_CHECKED );
|
|
CheckDlgButton( IDC_LOOP,BST_UNCHECKED );
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton( IDC_CONSTANT,BST_CHECKED );
|
|
CheckDlgButton( IDC_CYCLE,BST_UNCHECKED );
|
|
CheckDlgButton( IDC_LOOP,BST_UNCHECKED );
|
|
}
|
|
}
|
|
}
|
|
|
|
void CTVTrackPropsDialog::OnDeltaposPrevnext(NMHDR *pNMHDR, LRESULT *pResult)
|
|
{
|
|
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
|
|
|
|
if (!m_track)
|
|
return;
|
|
|
|
int nkey = m_key + pNMUpDown->iDelta;
|
|
if (nkey < 0)
|
|
nkey = m_track->GetNumKeys()-1;
|
|
if (nkey > m_track->GetNumKeys()-1)
|
|
nkey = 0;
|
|
|
|
SetCurrKey( nkey );
|
|
|
|
*pResult = 1;
|
|
}
|
|
|
|
void CTVTrackPropsDialog::OnUpdateTime()
|
|
{
|
|
if (!m_track)
|
|
return;
|
|
|
|
if (m_key < 0 || m_key >= m_track->GetNumKeys())
|
|
return;
|
|
|
|
float time = m_time.GetValue();
|
|
m_track->SetKeyTime( m_key,time );
|
|
m_track->SortKeys();
|
|
|
|
int k = m_track->FindKey( time );
|
|
if (k != m_key)
|
|
{
|
|
SetCurrKey( k );
|
|
}
|
|
GetIEditor()->GetAnimation()->ForceAnimation();
|
|
}
|
|
|
|
void CTVTrackPropsDialog::SetCurrKey( int nkey )
|
|
{
|
|
m_key = nkey;
|
|
m_keySpinBtn.SetRange( 1,m_track->GetNumKeys() );
|
|
m_keySpinBtn.SetPos( nkey+1 );
|
|
|
|
if (m_key >= 0 && m_key < m_track->GetNumKeys())
|
|
{
|
|
m_time.SetValue( m_track->GetKeyTime(nkey) );
|
|
for (int i=0;i<(int)m_KeyDlg.size();i++)
|
|
{
|
|
IKeyDlg *pDlg=m_KeyDlg[i].pDlg;
|
|
if (pDlg->IsWindowVisible())
|
|
pDlg->SetKey(m_node, m_track, nkey);
|
|
}
|
|
/*
|
|
if (m_dlgTcb.IsWindowVisible())
|
|
m_dlgTcb.SetKey( m_node,m_track,nkey );
|
|
if (m_dlgEntity.IsWindowVisible())
|
|
m_dlgEntity.SetKey( m_node,m_track,nkey );*/
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTVTrackPropsDialog::OnCancel()
|
|
{
|
|
DestroyWindow();
|
|
}
|
|
|
|
void CTVTrackPropsDialog::OnBnClickedConstant()
|
|
{
|
|
if (m_track)
|
|
m_track->SetFlags( m_track->GetFlags() & ~(ATRACK_LOOP|ATRACK_CYCLE) );
|
|
}
|
|
|
|
void CTVTrackPropsDialog::OnBnClickedCycle()
|
|
{
|
|
if (m_track)
|
|
{
|
|
m_track->SetFlags( m_track->GetFlags() & ~(ATRACK_LOOP|ATRACK_CYCLE) );
|
|
m_track->SetFlags( m_track->GetFlags() | ATRACK_CYCLE );
|
|
}
|
|
}
|
|
|
|
void CTVTrackPropsDialog::OnBnClickedLoop()
|
|
{
|
|
if (m_track)
|
|
{
|
|
m_track->SetFlags( m_track->GetFlags() & ~(ATRACK_LOOP|ATRACK_CYCLE) );
|
|
m_track->SetFlags( m_track->GetFlags() | ATRACK_LOOP );
|
|
}
|
|
}
|
|
|
|
void CTVTrackPropsDialog::OnDestroy()
|
|
{
|
|
CDialog::OnDestroy();
|
|
|
|
m_track = 0;
|
|
m_node = 0;
|
|
m_key = -1;
|
|
|
|
for (int i=0;i<(int)m_KeyDlg.size();i++)
|
|
{
|
|
delete m_KeyDlg[i].pDlg;
|
|
}
|
|
m_KeyDlg.clear();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTVTrackPropsDialog::ReloadKey()
|
|
{
|
|
if (m_currentDlg < 0)
|
|
return;
|
|
|
|
IKeyDlg *keyDlg = m_KeyDlg[m_currentDlg].pDlg;
|
|
|
|
if (!keyDlg->CanReloadKey())
|
|
return;
|
|
|
|
IAnimNode *node = keyDlg->GetNode();
|
|
IAnimTrack *track = keyDlg->GetTrack();
|
|
if (!node || !track)
|
|
return;
|
|
int paramId = node->FindTrack(track);
|
|
|
|
SetKey( node,paramId,track,keyDlg->GetKey() );
|
|
} |