Files
FC1/Editor/TVTrackPropsDialog.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

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() );
}