983 lines
27 KiB
C++
983 lines
27 KiB
C++
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Crytek Engine Source File.
|
|
// Copyright (C), Crytek Studios, 2002.
|
|
// -------------------------------------------------------------------------
|
|
// File name: trackviewdialog.cpp
|
|
// Version: v1.00
|
|
// Created: 24/4/2002 by Timur.
|
|
// Compilers: Visual C++ 7.0
|
|
// Description: CTrackViewDialog Implementation file.
|
|
// -------------------------------------------------------------------------
|
|
// History:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "TrackViewDialog.h"
|
|
|
|
#include "ViewPane.h"
|
|
#include "StringDlg.h"
|
|
#include "TVSequenceProps.h"
|
|
#include "ViewManager.h"
|
|
#include "AnimationContext.h"
|
|
#include "AnimationSerializer.h"
|
|
|
|
#include "Objects\ObjectManager.h"
|
|
|
|
#include "IMovieSystem.h"
|
|
// CTrackViewDialog dialog
|
|
|
|
IMPLEMENT_DYNAMIC(CTrackViewDialog, CToolbarDialog)
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Movie Callback.
|
|
//////////////////////////////////////////////////////////////////////////
|
|
class CMovieCallback : public IMovieCallback
|
|
{
|
|
private:
|
|
CTrackViewDialog *m_pDlg;
|
|
public:
|
|
CMovieCallback(CTrackViewDialog *pDlg)
|
|
{
|
|
m_pDlg=pDlg;
|
|
}
|
|
private:
|
|
void OnAddNode() {};
|
|
void OnRemoveNode() { if (m_pDlg && (!m_pDlg->m_bReloading)) m_pDlg->ReloadSequences(); }
|
|
void OnChangeNode() { if (m_pDlg && (!m_pDlg->m_bReloading)) m_pDlg->ReloadSequences(); }
|
|
void OnRegisterNodeCallback() {};
|
|
void OnUnregisterNodeCallback() {};
|
|
void OnSetCamera( const SCameraParams &Params ) { if (m_pDlg) m_pDlg->OnSetCamera(Params); };
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
CString CTrackViewDialog::m_currSequenceName;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
CTrackViewDialog::CTrackViewDialog(CWnd* pParent /*=NULL*/)
|
|
: CToolbarDialog(CTrackViewDialog::IDD, pParent)
|
|
{
|
|
m_currSequence = 0;
|
|
m_bRecord = false;
|
|
m_bAutoRecord = false;
|
|
m_bPause = false;
|
|
m_bPlay = false;
|
|
m_bReloading=false;
|
|
m_pMovieCallback=new CMovieCallback(this);
|
|
m_fLastTime=-1.0f;
|
|
ZeroStruct(m_defaulCameraObjectId);
|
|
m_movieSystem = 0;
|
|
m_fAutoRecordStep = 0.5f;
|
|
}
|
|
|
|
CTrackViewDialog::~CTrackViewDialog()
|
|
{
|
|
delete m_pMovieCallback;
|
|
}
|
|
|
|
void CTrackViewDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CToolbarDialog::DoDataExchange(pDX);
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTrackViewDialog, CToolbarDialog)
|
|
// ON_WM_CREATE()
|
|
ON_WM_SIZE()
|
|
ON_CBN_SELENDOK( IDC_SEQUENCES,OnChangeSequence )
|
|
ON_COMMAND( ID_TV_PREVKEY,OnGoToPrevKey )
|
|
ON_COMMAND( ID_TV_NEXTKEY,OnGoToNextKey )
|
|
ON_COMMAND( ID_TV_ADDKEY,OnAddKey )
|
|
ON_COMMAND( ID_TV_DELKEY,OnDelKey )
|
|
ON_COMMAND( ID_TV_MOVEKEY,OnMoveKey )
|
|
ON_COMMAND( ID_TV_SLIDEKEY,OnSlideKey )
|
|
ON_COMMAND( ID_TV_SCALEKEY,OnScaleKey )
|
|
ON_COMMAND( ID_TV_ADD_SEQUENCE,OnAddSequence )
|
|
ON_COMMAND( ID_TV_DEL_SEQUENCE,OnDelSequence )
|
|
ON_COMMAND( ID_TV_EDIT_SEQUENCE,OnEditSequence )
|
|
ON_COMMAND( ID_TV_RECORD,OnRecord )
|
|
ON_COMMAND( ID_TV_RECORD_AUTO,OnAutoRecord )
|
|
ON_COMMAND( ID_TV_JUMPSTART,OnGoToStart)
|
|
ON_COMMAND( ID_TV_JUMPEND,OnGoToEnd)
|
|
ON_COMMAND( ID_TV_PLAY,OnPlay )
|
|
ON_COMMAND( ID_TV_STOP,OnStop )
|
|
ON_COMMAND( ID_TV_PAUSE,OnPause )
|
|
ON_COMMAND( ID_PLAY_LOOP, OnLoop)
|
|
ON_COMMAND( ID_TV_COPYPASTEKEYS,OnCopyPasteKeys)
|
|
ON_COMMAND( ID_TV_EXPORT_SEQUENCE,OnExportSequence )
|
|
ON_COMMAND( ID_TV_IMPORT_SEQUENCE,OnImportSequence )
|
|
ON_COMMAND( ID_ADDNODE,OnAddSelectedNode )
|
|
ON_COMMAND( ID_ADDSCENETRACK,OnAddSceneTrack )
|
|
ON_UPDATE_COMMAND_UI(ID_TV_RECORD, OnUpdateRecord)
|
|
ON_UPDATE_COMMAND_UI(ID_TV_RECORD_AUTO, OnUpdateRecordAuto)
|
|
ON_UPDATE_COMMAND_UI(ID_TV_PLAY, OnUpdatePlay)
|
|
ON_UPDATE_COMMAND_UI(ID_TV_PAUSE, OnUpdatePause)
|
|
ON_UPDATE_COMMAND_UI(ID_PLAY_LOOP, OnUpdateLoop)
|
|
ON_UPDATE_COMMAND_UI(ID_TV_COPYPASTEKEYS, OnUpdateCopyPasteKeys)
|
|
ON_UPDATE_COMMAND_UI(ID_ADDNODE, OnAddSelectedNodeUpdate )
|
|
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
|
|
ON_WM_SETFOCUS()
|
|
ON_WM_DESTROY()
|
|
// ON_WM_PAINT()
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
// CTrackViewDialog message handlers
|
|
void CTrackViewDialog::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CToolbarDialog::OnSize(nType, cx, cy);
|
|
|
|
if (m_wndSplitter.GetSafeHwnd())
|
|
{
|
|
CRect rc;
|
|
GetClientRect(&rc);
|
|
m_wndSplitter.MoveWindow(&rc,FALSE);
|
|
}
|
|
RecalcLayout();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnToolbarDropDown(NMHDR *pnhdr, LRESULT *plr)
|
|
{
|
|
CRect rc;
|
|
CPoint pos;
|
|
GetCursorPos( &pos );
|
|
NMTOOLBAR* pnmtb = (NMTOOLBAR*)pnhdr;
|
|
m_cDlgToolBar.GetToolBarCtrl().GetRect( pnmtb->iItem,rc );
|
|
ClientToScreen( rc );
|
|
pos.x = rc.left;
|
|
pos.y = rc.bottom;
|
|
|
|
// Switch on button command id's.
|
|
switch (pnmtb->iItem)
|
|
{
|
|
case ID_TV_PLAY:
|
|
OnPlayMenu(pos);
|
|
break;
|
|
case ID_TV_RECORD_AUTO:
|
|
OnRecordMenu(pos);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
*plr = TBDDRET_DEFAULT;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnRecordMenu( CPoint pos )
|
|
{
|
|
struct SScales
|
|
{
|
|
const char *pszText;
|
|
float fScale;
|
|
};
|
|
SScales Scales[]={
|
|
{" 1 sec ", 1.0f},
|
|
{"1/2 sec", 1.0f/2},
|
|
{"1/5 sec", 1.0f/5},
|
|
{"1/10 sec", 1.0f/10},
|
|
{"1/25 sec", 1.0f/25},
|
|
{"1/50 sec", 1.0f/50},
|
|
{"1/100 sec", 1.0f/100},
|
|
};
|
|
int nScales=sizeof(Scales)/sizeof(SScales);
|
|
CMenu menu;
|
|
menu.CreatePopupMenu();
|
|
for (int i=0;i<nScales;i++)
|
|
{
|
|
int flags = 0;
|
|
if (m_fAutoRecordStep == Scales[i].fScale)
|
|
flags |= MF_CHECKED;
|
|
menu.AppendMenu(MF_STRING|flags, i+1, Scales[i].pszText);
|
|
}
|
|
int cmd = menu.TrackPopupMenu( TPM_RETURNCMD|TPM_LEFTALIGN|TPM_LEFTBUTTON,pos.x,pos.y,this );
|
|
if (cmd >= 1 && cmd <= nScales)
|
|
m_fAutoRecordStep = Scales[cmd-1].fScale;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnPlayMenu( CPoint pos )
|
|
{
|
|
struct SScales
|
|
{
|
|
const char *pszText;
|
|
float fScale;
|
|
};
|
|
SScales Scales[]={
|
|
{" 2 ", 2.0f},
|
|
{" 1 ", 1.0f},
|
|
{"1/2", 0.5f},
|
|
{"1/4", 0.25f},
|
|
{"1/8", 0.125f},
|
|
};
|
|
int nScales=sizeof(Scales)/sizeof(SScales);
|
|
CMenu menu;
|
|
menu.CreatePopupMenu();
|
|
for (int i=0;i<nScales;i++)
|
|
{
|
|
menu.AppendMenu(MF_STRING, i+1, Scales[i].pszText);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
menu.AppendMenu(MF_SEPARATOR);
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int flags = 0;
|
|
if (GetIEditor()->GetAnimation()->IsPlayingToAVI())
|
|
flags |= MF_CHECKED;
|
|
menu.AppendMenu(MF_STRING|flags, 100, _T("Encode to AVI") );
|
|
if (!m_aviFile.IsEmpty())
|
|
{
|
|
menu.AppendMenu(MF_SEPARATOR);
|
|
menu.AppendMenu(MF_STRING|MF_GRAYED, 102, m_aviFile );
|
|
}
|
|
|
|
int cmd = menu.TrackPopupMenu( TPM_RETURNCMD|TPM_LEFTALIGN|TPM_LEFTBUTTON,pos.x,pos.y,this );
|
|
if (cmd >= 1 && cmd <= nScales && cmd < 100)
|
|
GetIEditor()->GetAnimation()->SetTimeScale(Scales[cmd-1].fScale);
|
|
|
|
switch (cmd)
|
|
{
|
|
case 100:
|
|
{
|
|
if (!GetIEditor()->GetAnimation()->IsPlayingToAVI())
|
|
{
|
|
if (CFileUtil::SelectSaveFile( "AVI Files (*.avi)|*.avi","avi","",m_aviFile ))
|
|
{
|
|
GetIEditor()->GetAnimation()->PlayToAVI( true,m_aviFile );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GetIEditor()->GetAnimation()->PlayToAVI( false );
|
|
}
|
|
}
|
|
break;
|
|
case 101:
|
|
{
|
|
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
BOOL CTrackViewDialog::OnInitDialog()
|
|
{
|
|
GetIEditor()->RegisterDocListener(this);
|
|
|
|
CToolbarDialog::OnInitDialog();
|
|
|
|
CRect rc;
|
|
InitToolbar();
|
|
|
|
// Resize the toolbar
|
|
GetClientRect(rc);
|
|
m_cDlgToolBar.SetWindowPos(NULL, 0, 0, rc.right, 70, SWP_NOZORDER);
|
|
|
|
// TODO: Remove this if you don't want tool tips or a resizeable toolbar
|
|
m_cDlgToolBar.SetBarStyle(m_cDlgToolBar.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY);
|
|
|
|
// Create splitter and track view controls.
|
|
GetClientRect(rc);
|
|
rc.right /= 2;
|
|
m_wndNodes.Create( WS_VISIBLE|WS_CHILD| TVS_FULLROWSELECT|TVS_HASBUTTONS|TVS_HASLINES|TVS_SHOWSELALWAYS|TVS_LINESATROOT,rc,this,1 );
|
|
|
|
// Create key tracks dialog.
|
|
m_wndKeys.Create( NULL,NULL,WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_HSCROLL,rc,this,2 );
|
|
m_wndKeys.SetTimeRange( 0,20 );
|
|
m_wndKeys.SetTimeScale( 100 );
|
|
m_wndKeys.SetCurrTime( 1 );
|
|
m_wndKeys.SetTrackDialog( &m_wndTrackProps );
|
|
|
|
// Create track graph dialog.
|
|
//m_wndGraph.Create( NULL,NULL,WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_HSCROLL,rc,this,2 );
|
|
//m_wndGraph.SetTimeRange( 0,20 );
|
|
//m_wndGraph.SetTimeScale( 100 );
|
|
//m_wndGraph.SetCurrTime( 1 );
|
|
//m_wndGraph.SetTrackDialog( &m_wndTrackProps );
|
|
|
|
|
|
m_wndSpline.Create( NULL,NULL,WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED|LBS_WANTKEYBOARDINPUT|LBS_DISABLENOSCROLL|WS_HSCROLL,rc,this,3 );
|
|
m_wndSpline.SetTimeRange( 0,20 );
|
|
m_wndSpline.SetTimeScale( 100 );
|
|
m_wndSpline.SetCurrTime( 1 );
|
|
|
|
//m_wndNodes.SetKeyListCtrl( &m_wndGraph );
|
|
m_wndNodes.SetKeyListCtrl( &m_wndKeys );
|
|
|
|
|
|
m_wndNodes.SetItemHeight( 16 );
|
|
|
|
GetClientRect(rc);
|
|
m_wndSplitter.CreateStatic( this,1,2 );
|
|
m_wndSplitter.SetPane( 0,0,&m_wndNodes, CSize(150, 100) );
|
|
m_wndSplitter.SetPane( 0,1,&m_wndKeys, CSize(300, 100) );
|
|
//m_wndSplitter.SetPane( 0,1,&m_wndGraph, CSize(300, 100) );
|
|
m_wndSplitter.MoveWindow(&rc, TRUE);
|
|
|
|
RecalcLayout();
|
|
InitSequences();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
IMovieSystem* CTrackViewDialog::GetMovieSystem()
|
|
{
|
|
if (m_movieSystem)
|
|
{
|
|
return m_movieSystem;
|
|
}
|
|
m_movieSystem = GetIEditor()->GetMovieSystem();
|
|
if (m_movieSystem)
|
|
m_movieSystem->SetCallback(m_pMovieCallback);
|
|
return m_movieSystem;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::InitToolbar()
|
|
{
|
|
// Create the toolbar
|
|
m_cDlgToolBar.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_WRAPABLE,
|
|
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
|
|
m_cDlgToolBar.LoadToolBar24(IDR_TRACKVIEW);
|
|
m_cDlgToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_ADDKEY),TBBS_CHECKGROUP );
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_MOVEKEY),TBBS_CHECKGROUP );
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_SLIDEKEY),TBBS_CHECKGROUP );
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_SCALEKEY),TBBS_CHECKGROUP );
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_RECORD),TBBS_CHECKBOX );
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_RECORD_AUTO),TBBS_CHECKBOX );
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_PLAY),TBBS_CHECKBOX );
|
|
m_cDlgToolBar.SetButtonStyle( m_cDlgToolBar.CommandToIndex(ID_TV_PAUSE),TBBS_CHECKBOX );
|
|
int nIndex=m_cDlgToolBar.CommandToIndex(ID_TV_PLAY);
|
|
m_cDlgToolBar.SetButtonStyle(nIndex, m_cDlgToolBar.GetButtonStyle(nIndex) | TBSTYLE_DROPDOWN);
|
|
nIndex=m_cDlgToolBar.CommandToIndex(ID_TV_RECORD_AUTO);
|
|
m_cDlgToolBar.SetButtonStyle(nIndex, m_cDlgToolBar.GetButtonStyle(nIndex) | TBSTYLE_DROPDOWN);
|
|
m_cDlgToolBar.CalcFixedLayout(0,TRUE);
|
|
|
|
// Initially move operation is enabled.
|
|
m_cDlgToolBar.GetToolBarCtrl().CheckButton( ID_TV_MOVEKEY,TRUE );
|
|
|
|
m_bRecord = false;
|
|
m_bPause = false;
|
|
m_bPlay = false;
|
|
|
|
|
|
|
|
RecalcLayout();
|
|
|
|
CRect rc(0,0,0,0);
|
|
int index;
|
|
index = m_cDlgToolBar.CommandToIndex(ID_TV_SEQUENCE);
|
|
m_cDlgToolBar.SetButtonInfo(index, ID_TV_SEQUENCE, TBBS_SEPARATOR, 200);
|
|
m_cDlgToolBar.GetItemRect(index, &rc);
|
|
rc.top++;
|
|
rc.bottom += 400;
|
|
m_sequences.Create( WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_SORT,rc,this,IDC_SEQUENCES );
|
|
m_sequences.SetFont( CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)) );
|
|
m_sequences.SetParent( &m_cDlgToolBar );
|
|
|
|
rc.SetRect(0,0,0,0);
|
|
index = m_cDlgToolBar.CommandToIndex(ID_TV_CURSORPOS);
|
|
m_cDlgToolBar.SetButtonInfo(index, ID_TV_CURSORPOS, TBBS_SEPARATOR, 60);
|
|
m_cDlgToolBar.GetItemRect(index, &rc);
|
|
rc.top++;
|
|
m_CursorPos.Create("0.000", WS_CHILD|WS_VISIBLE|SS_CENTER|SS_CENTERIMAGE|SS_SUNKEN,rc,this,IDC_STATIC);
|
|
m_CursorPos.SetFont( CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)) );
|
|
m_CursorPos.SetParent( &m_cDlgToolBar );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::InitSequences()
|
|
{
|
|
CRect rc;
|
|
int index;
|
|
index = m_cDlgToolBar.CommandToIndex(ID_TV_SEQUENCE);
|
|
m_cDlgToolBar.SetButtonInfo(index, ID_TV_SEQUENCE, TBBS_SEPARATOR, 200);
|
|
m_cDlgToolBar.GetItemRect(index, &rc);
|
|
// Expand the rectangle
|
|
rc.left += 2;
|
|
rc.bottom += 400;
|
|
m_sequences.MoveWindow( rc );
|
|
|
|
ReloadSequences();
|
|
}
|
|
|
|
void CTrackViewDialog::InvalidateTrackList()
|
|
{
|
|
if (m_wndTrackProps.m_hWnd)
|
|
{
|
|
m_wndTrackProps.ReloadKey();
|
|
}
|
|
if (m_wndKeys.m_hWnd)
|
|
m_wndKeys.Invalidate();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
static void AddTrack( IAnimNode *node )
|
|
{
|
|
ITcbKey key;
|
|
ZeroStruct(key);
|
|
|
|
IAnimBlock *anim = node->GetAnimBlock();
|
|
if (!anim)
|
|
return;
|
|
|
|
IAnimTrack *track = anim->GetTrack(APARAM_POS);
|
|
if (!track)
|
|
return;
|
|
|
|
track->SetNumKeys( 10 );
|
|
for (int i = 0; i < track->GetNumKeys(); i++)
|
|
{
|
|
key.time = (frand()+1)/2.0f * 20;
|
|
key.SetFloat( (frand()) * 100 );
|
|
track->SetKey(i,&key);
|
|
}
|
|
|
|
track->SortKeys();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::Update()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
float fTime=ac->GetTime();
|
|
m_wndKeys.SetCurrTime(fTime);
|
|
if (fTime!=m_fLastTime)
|
|
{
|
|
m_fLastTime=fTime;
|
|
char sText[16];
|
|
sprintf(sText, "%1.3f", fTime);
|
|
m_CursorPos.SetWindowText(sText);
|
|
}
|
|
|
|
// Check movie camera.
|
|
//GetIEditor()->GetMovieSystem()->GetCameraParams(
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnGoToPrevKey()
|
|
{
|
|
CTrackViewNodes::SItemInfo *pItemInfo=m_wndNodes.GetSelectedNode();
|
|
if ((!pItemInfo) || (!pItemInfo->node))
|
|
return;
|
|
std::vector<IAnimTrack*> vecTracks;
|
|
if (!pItemInfo->track)
|
|
{
|
|
for (int i=0;i<pItemInfo->node->GetAnimBlock()->GetTrackCount();i++)
|
|
{
|
|
IAnimTrack *pTrack=NULL;
|
|
int type;
|
|
if (pItemInfo->node->GetAnimBlock()->GetTrackInfo(i,type,&pTrack))
|
|
vecTracks.push_back(pTrack);
|
|
}
|
|
}else
|
|
{
|
|
vecTracks.push_back(pItemInfo->track);
|
|
}
|
|
float fClosestKeyTime=-1.0f;
|
|
float fClosestDist=1E8;
|
|
float fCurrTime=GetIEditor()->GetAnimation()->GetTime();
|
|
for (std::vector<IAnimTrack*>::iterator It=vecTracks.begin();It!=vecTracks.end();++It)
|
|
{
|
|
IAnimTrack *pTrack=(*It);
|
|
for (int i=0;i<pTrack->GetNumKeys();i++)
|
|
{
|
|
float fKeyTime=pTrack->GetKeyTime(i);
|
|
float fKeyDist=fCurrTime-fKeyTime;
|
|
if ((fKeyDist>0.0f) && (fKeyDist<fClosestDist))
|
|
{
|
|
fClosestDist=fKeyDist;
|
|
fClosestKeyTime=pTrack->GetKeyTime(i);
|
|
}
|
|
}
|
|
}
|
|
if (fClosestKeyTime>=0.0f)
|
|
GetIEditor()->GetAnimation()->SetTime(fClosestKeyTime);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnGoToNextKey()
|
|
{
|
|
CTrackViewNodes::SItemInfo *pItemInfo=m_wndNodes.GetSelectedNode();
|
|
if ((!pItemInfo) || (!pItemInfo->node))
|
|
return;
|
|
std::vector<IAnimTrack*> vecTracks;
|
|
if (!pItemInfo->track)
|
|
{
|
|
for (int i=0;i<pItemInfo->node->GetAnimBlock()->GetTrackCount();i++)
|
|
{
|
|
IAnimTrack *pTrack=NULL;
|
|
int type;
|
|
if (pItemInfo->node->GetAnimBlock()->GetTrackInfo(i,type,&pTrack))
|
|
vecTracks.push_back(pTrack);
|
|
}
|
|
}else
|
|
{
|
|
vecTracks.push_back(pItemInfo->track);
|
|
}
|
|
float fClosestKeyTime=-1.0f;
|
|
float fClosestDist=1E8;
|
|
float fCurrTime=GetIEditor()->GetAnimation()->GetTime();
|
|
for (std::vector<IAnimTrack*>::iterator It=vecTracks.begin();It!=vecTracks.end();++It)
|
|
{
|
|
IAnimTrack *pTrack=(*It);
|
|
for (int i=0;i<pTrack->GetNumKeys();i++)
|
|
{
|
|
float fKeyTime=pTrack->GetKeyTime(i);
|
|
float fKeyDist=fKeyTime-fCurrTime;
|
|
if ((fKeyDist>0.0f) && (fKeyDist<fClosestDist))
|
|
{
|
|
fClosestDist=fKeyDist;
|
|
fClosestKeyTime=pTrack->GetKeyTime(i);
|
|
}
|
|
}
|
|
}
|
|
if (fClosestKeyTime>=0.0f)
|
|
GetIEditor()->GetAnimation()->SetTime(fClosestKeyTime);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnAddKey()
|
|
{
|
|
m_wndKeys.SetMouseActionMode( TVMODE_ADDKEY );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnDelKey()
|
|
{
|
|
m_wndKeys.DelSelectedKeys();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnMoveKey()
|
|
{
|
|
m_wndKeys.SetMouseActionMode( TVMODE_MOVEKEY );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnSlideKey()
|
|
{
|
|
m_wndKeys.SetMouseActionMode( TVMODE_SLIDEKEY );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnScaleKey()
|
|
{
|
|
m_wndKeys.SetMouseActionMode( TVMODE_SCALEKEY );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnAddSequence()
|
|
{
|
|
CStringDlg dlg( "New Sequence" );
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
CUndo undo("Add Sequence");
|
|
CString seq = dlg.GetString();
|
|
if (!seq.IsEmpty() && !GetIEditor()->GetMovieSystem()->FindSequence(seq))
|
|
{
|
|
IAnimSequence *sequence = GetIEditor()->GetMovieSystem()->CreateSequence(seq);
|
|
m_sequences.AddString( seq );
|
|
SetCurrentSequence( sequence );
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::ReloadSequences()
|
|
{
|
|
if (!GetMovieSystem())
|
|
return;
|
|
|
|
if (m_wndTrackProps.m_hWnd)
|
|
{
|
|
m_wndTrackProps.DestroyWindow();
|
|
}
|
|
|
|
m_bReloading=true;
|
|
GetIEditor()->GetAnimation()->SetRecording( false );
|
|
ISequenceIt *It= GetMovieSystem()->GetSequences();
|
|
m_sequences.ResetContent();
|
|
IAnimSequence *seq=It->first();
|
|
while (seq)
|
|
{
|
|
m_sequences.AddString( seq->GetName() );
|
|
seq=It->next();
|
|
}
|
|
// Select current sequence.
|
|
|
|
m_currSequence = 0;
|
|
if (!m_currSequenceName.IsEmpty())
|
|
{
|
|
IAnimSequence *seq = GetMovieSystem()->FindSequence(m_currSequenceName);
|
|
SetCurrentSequence( seq );
|
|
}
|
|
if (!m_currSequence && m_sequences.GetCount() > 0)
|
|
{
|
|
m_sequences.SetCurSel(0);
|
|
m_sequences.GetLBText(0,m_currSequenceName);
|
|
IAnimSequence *seq = GetMovieSystem()->FindSequence(m_currSequenceName);
|
|
SetCurrentSequence( seq );
|
|
}
|
|
It->Release();
|
|
m_bReloading=false;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnDelSequence()
|
|
{
|
|
//CString str;
|
|
//str.Format(
|
|
if (AfxMessageBox( "Delete current sequence?",MB_YESNO|MB_ICONQUESTION ) == IDYES)
|
|
{
|
|
int sel = m_sequences.GetCurSel();
|
|
CString seq;
|
|
m_sequences.GetLBText(sel,seq);
|
|
m_sequences.DeleteString(sel);
|
|
|
|
if (m_sequences.GetCount() > 0)
|
|
{
|
|
m_sequences.SetCurSel(0);
|
|
}
|
|
OnChangeSequence();
|
|
|
|
IAnimSequence *sequence = GetMovieSystem()->FindSequence(seq);
|
|
if (sequence)
|
|
GetMovieSystem()->RemoveSequence(sequence);
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnEditSequence()
|
|
{
|
|
// Edit current sequence.
|
|
if (!m_currSequence)
|
|
return;
|
|
|
|
CTVSequenceProps dlg( m_currSequence,this );
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
// Sequence updated.
|
|
ReloadSequences();
|
|
}
|
|
m_wndKeys.Invalidate();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnChangeSequence()
|
|
{
|
|
int sel = m_sequences.GetCurSel();
|
|
if (sel == LB_ERR)
|
|
{
|
|
SetCurrentSequence( 0 );
|
|
return;
|
|
}
|
|
CString name;
|
|
m_sequences.GetLBText( sel,name );
|
|
// Display current sequence.
|
|
IAnimSequence *seq = GetMovieSystem()->FindSequence(name);
|
|
if (seq != m_currSequence)
|
|
{
|
|
SetCurrentSequence( seq );
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::SetCurrentSequence( IAnimSequence *curr )
|
|
{
|
|
if (curr)
|
|
{
|
|
m_currSequence = curr;
|
|
GetIEditor()->GetAnimation()->SetSequence( m_currSequence );
|
|
m_currSequenceName = curr->GetName();
|
|
|
|
m_wndNodes.SetSequence( m_currSequence );
|
|
Range timeRange = m_currSequence->GetTimeRange();
|
|
m_wndKeys.SetTimeRange( timeRange.start,timeRange.end );
|
|
m_wndKeys.SetStartMarker( timeRange.start );
|
|
m_wndKeys.SetEndMarker( timeRange.end );
|
|
|
|
m_sequences.SelectString(-1,m_currSequenceName);
|
|
}
|
|
else
|
|
{
|
|
m_currSequence = curr;
|
|
GetIEditor()->GetAnimation()->SetSequence( 0 );
|
|
m_currSequenceName = "";
|
|
m_wndNodes.SetSequence( 0 );
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnRecord()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
ac->SetRecording( !ac->IsRecording() );
|
|
m_wndKeys.Invalidate();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnAutoRecord()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
ac->SetAutoRecording( !ac->IsRecording(),m_fAutoRecordStep );
|
|
m_wndKeys.Invalidate();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnGoToStart()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
ac->SetTime(ac->GetMarkers().start);
|
|
ac->SetPlaying( false );
|
|
ac->SetRecording( false );
|
|
|
|
// Restore default camera in view.
|
|
GetIEditor()->GetViewManager()->SetCameraObjectId( m_defaulCameraObjectId );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnGoToEnd()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
ac->SetTime(ac->GetMarkers().end);
|
|
ac->SetPlaying( false );
|
|
ac->SetRecording( false );
|
|
|
|
// Restore default camera in view.
|
|
GetIEditor()->GetViewManager()->SetCameraObjectId( m_defaulCameraObjectId );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnPlay()
|
|
{
|
|
m_defaulCameraObjectId = GetIEditor()->GetViewManager()->GetCameraObjectId();
|
|
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
if (!ac->IsPlaying())
|
|
ac->SetPlaying( true );
|
|
else
|
|
ac->SetPlaying( false );
|
|
|
|
// Set current camera params.
|
|
OnSetCamera( GetMovieSystem()->GetCameraParams() );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnStop()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
if (ac->IsPlaying())
|
|
ac->SetPlaying( false );
|
|
else
|
|
OnGoToStart();
|
|
ac->SetRecording( false );
|
|
|
|
// Restore default camera in view.
|
|
GetIEditor()->GetViewManager()->SetCameraObjectId( m_defaulCameraObjectId );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnPause()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
if (ac->IsPaused())
|
|
ac->Resume();
|
|
else
|
|
ac->Pause();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnLoop()
|
|
{
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
ac->SetLoopMode(!ac->IsLoopMode());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnCopyPasteKeys()
|
|
{
|
|
if (!m_wndKeys.CopyPasteKeys())
|
|
AfxMessageBox("Copying of keys failed.", MB_ICONEXCLAMATION | MB_OK);
|
|
}
|
|
|
|
void CTrackViewDialog::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
//CToolbarDialog::OnSetFocus(pOldWnd);
|
|
|
|
if (AfxGetMainWnd())
|
|
AfxGetMainWnd()->SetFocus();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnUpdateRecord( CCmdUI* pCmdUI )
|
|
{
|
|
if (GetIEditor()->GetAnimation()->IsRecordMode())
|
|
pCmdUI->SetCheck(TRUE);
|
|
else
|
|
pCmdUI->SetCheck(FALSE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnUpdateRecordAuto( CCmdUI* pCmdUI )
|
|
{
|
|
if (GetIEditor()->GetAnimation()->IsAutoRecording())
|
|
pCmdUI->SetCheck(TRUE);
|
|
else
|
|
pCmdUI->SetCheck(FALSE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnUpdatePlay( CCmdUI* pCmdUI )
|
|
{
|
|
if (GetIEditor()->GetAnimation()->IsPlayMode())
|
|
pCmdUI->SetCheck(TRUE);
|
|
else
|
|
pCmdUI->SetCheck(FALSE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnUpdatePause( CCmdUI* pCmdUI )
|
|
{
|
|
if (GetIEditor()->GetAnimation()->IsPaused())
|
|
pCmdUI->SetCheck(TRUE);
|
|
else
|
|
pCmdUI->SetCheck(FALSE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnUpdateLoop( CCmdUI* pCmdUI )
|
|
{
|
|
if (GetIEditor()->GetAnimation()->IsLoopMode())
|
|
pCmdUI->SetCheck(TRUE);
|
|
else
|
|
pCmdUI->SetCheck(FALSE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnUpdateCopyPasteKeys( CCmdUI* pCmdUI )
|
|
{
|
|
pCmdUI->Enable(m_wndKeys.CanCopyPasteKeys());
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnNewDocument()
|
|
{
|
|
SetCurrentSequence(NULL);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnLoadDocument()
|
|
{
|
|
ReloadSequences();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnMissionChange()
|
|
{
|
|
ReloadSequences();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnCloseDocument()
|
|
{
|
|
SetCurrentSequence(NULL);
|
|
}
|
|
|
|
void CTrackViewDialog::OnDestroy()
|
|
{
|
|
CToolbarDialog::OnDestroy();
|
|
|
|
GetIEditor()->UnregisterDocListener(this);
|
|
if (GetMovieSystem())
|
|
GetMovieSystem()->SetCallback(NULL);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnAddSelectedNode()
|
|
{
|
|
if (!m_currSequence)
|
|
return;
|
|
|
|
m_wndNodes.AddSelectedNodes();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnAddSceneTrack()
|
|
{
|
|
if (!m_currSequence)
|
|
return;
|
|
|
|
m_wndNodes.AddSceneNodes();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnAddSelectedNodeUpdate( CCmdUI* pCmdUI )
|
|
{
|
|
if (GetIEditor()->GetSelection()->IsEmpty() || !m_currSequence)
|
|
pCmdUI->Enable(FALSE);
|
|
else
|
|
pCmdUI->Enable(TRUE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnExportSequence()
|
|
{
|
|
if (m_currSequence)
|
|
{
|
|
CString fileName;
|
|
if (CFileUtil::SelectSaveFile( "Sequences (*.seq)|*.seq||","seq",GetIEditor()->GetLevelFolder(),fileName ))
|
|
{
|
|
CAnimationSerializer as;
|
|
as.SaveSequence( m_currSequence,fileName );
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnImportSequence()
|
|
{
|
|
CAnimationSerializer as;
|
|
|
|
std::vector<CString> files;
|
|
if (CFileUtil::SelectFiles( "Sequences (*.seq)|*.seq|All Files|*.*||",GetIEditor()->GetLevelFolder(),files ))
|
|
{
|
|
IAnimSequence *seq = NULL;
|
|
CUndo undo("Import Sequence");
|
|
for (int i = 0; i < files.size(); i++)
|
|
{
|
|
CAnimationSerializer as;
|
|
seq = as.LoadSequence( files[i] );
|
|
}
|
|
if (seq)
|
|
{
|
|
ReloadSequences();
|
|
SetCurrentSequence(seq);
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewDialog::OnSetCamera( const SCameraParams &camParams )
|
|
{
|
|
if (m_bReloading)
|
|
return;
|
|
|
|
// Only switch camera when in Play mode.
|
|
CAnimationContext *ac = GetIEditor()->GetAnimation();
|
|
if (!ac->IsPlaying())
|
|
return;
|
|
|
|
GUID camObjId = GUID_NULL;
|
|
if (camParams.cameraNode)
|
|
{
|
|
CBaseObject *obj = GetIEditor()->GetObjectManager()->FindAnimNodeOwner(camParams.cameraNode);
|
|
if (obj)
|
|
camObjId = obj->GetId();
|
|
}
|
|
// Switch camera in active rendering view.
|
|
GetIEditor()->GetViewManager()->SetCameraObjectId( camObjId );
|
|
}
|