DragonNest/Client/EtCutSceneTool/cwxActionTimeLinePanel.cpp

704 lines
20 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include <wx/wx.h>
#include "cwxActionTimeLinePanel.h"
#include "ToolData.h"
#include "cwxPropertyPanel.h"
#include "CommandSet.h"
#include "RTCutSceneMakerFrame.h"
#include "cwxRenderPanel.h"
#include "RTCutSceneRenderer.h"
BEGIN_EVENT_TABLE( cwxActionTimeLinePanel, wxPanel )
EVT_MOUSE_EVENTS( cwxActionTimeLinePanel::OnMouseEvent )
EVT_MENU( POPUP_COPY, cwxActionTimeLinePanel::OnMenuCopy )
EVT_MENU( POPUP_PASTE, cwxActionTimeLinePanel::OnMenuPaste )
EVT_MENU( POPUP_SNAP_ACTION, cwxActionTimeLinePanel::OnMenuSnapAction )
EVT_MENU( POPUP_REMOVE_ACTION, cwxActionTimeLinePanel::OnMenuRemoveAction )
EVT_TIMELINE_ACTION_SELECT( ACTION_TIMELINE_ID, cwxActionTimeLinePanel::OnTLObjectSelect )
EVT_TIMELINE_ACTION_MOVE( ACTION_TIMELINE_ID, cwxActionTimeLinePanel::OnTLObjectMove )
EVT_TIMELINE_ACTION_RESIZE( ACTION_TIMELINE_ID, cwxActionTimeLinePanel::OnTLObjectResize )
EVT_TIMELINE_AXIS_EVENT( ACTION_TIMELINE_ID, cwxActionTimeLinePanel::OnTLAxisEvent )
// <20>˾<EFBFBD> <20>޴<EFBFBD>
//EVT_CONTEXT_MENU( cwxActionTimeLinePanel::OnContextMenu )
END_EVENT_TABLE()
cwxActionTimeLinePanel::cwxActionTimeLinePanel( wxWindow* pParent, wxWindowID id ) : wxPanel( pParent, id ),
m_pTopSizer( NULL ),
m_pTimeLine( NULL ),
m_iOriEditMode( CToolData::EM_EDIT )
{
m_pTimeLine = new cwxTimeLineCtrl( this, ACTION_TIMELINE_ID );
m_pTopSizer = new wxBoxSizer( wxVERTICAL );
m_pTopSizer->Add( m_pTimeLine, 1, wxALL|wxALIGN_CENTER|wxEXPAND, 2 );
this->SetSizer( m_pTopSizer );
m_pTopSizer->Fit( this );
m_pTopSizer->SetSizeHints( this );
TOOL_DATA.SetActionTimeLine( m_pTimeLine );
m_pTimeLine->SetViewScale( 6.0f );
}
cwxActionTimeLinePanel::~cwxActionTimeLinePanel(void)
{
}
bool cwxActionTimeLinePanel::Enable( bool bEnable /* = true */ )
{
m_pTimeLine->Enable( bEnable );
return true;
}
void cwxActionTimeLinePanel::OnTLObjectSelect( cwxTLObjectSelectEvent& TLSelectEvent )
{
TOOL_DATA.SetSelectedObjectID( TLSelectEvent.GetObjectID() );
TOOL_DATA.SetSelectedObjectUseType( TLSelectEvent.GetObjectUseType() );
cwxPropertyPanel* pPropertyPanel = TOOL_DATA.GetPropertyPanel();
pPropertyPanel->OnTLActionSelect();
}
void cwxActionTimeLinePanel::OnTLObjectMove( cwxTLObjectMoveEvent& TLMoveEvent )
{
int iSelectedObjectID = TLMoveEvent.GetObjectID();// TOOL_DATA.GetSelectedActionID();
int iObjectUseType = TOOL_DATA.GetSelectedObjectUseType();
switch( iObjectUseType )
{
case CToolData::ACTION:
{
const ActionInfo* pActionInfo = TOOL_DATA.GetActionInfoByID( iSelectedObjectID );
ActionInfo NewActionInfo = *pActionInfo;
NewActionInfo.fStartTime = TLMoveEvent.GetActionStartTime();
CActionPropChange ActionPropChange( &TOOL_DATA, &NewActionInfo );
TOOL_DATA.RunCommand( &ActionPropChange );
}
break;
case CToolData::KEY:
{
const KeyInfo* pKeyInfo = TOOL_DATA.GetKeyInfoByID( iSelectedObjectID );
KeyInfo NewKeyInfo = *pKeyInfo;
NewKeyInfo.fStartTime = TLMoveEvent.GetActionStartTime();
CKeyPropChange KeyPropChange( &TOOL_DATA, &NewKeyInfo );
TOOL_DATA.RunCommand( &KeyPropChange );
}
break;
case CToolData::SUBKEY:
{
const KeyInfo* pKeyInfo = TOOL_DATA.GetKeyInfoByID( iSelectedObjectID );
KeyInfo NewKeyInfo = *pKeyInfo;
vector<SubKey>::iterator iterBegin = NewKeyInfo.vlMoveKeys.begin();
vector<SubKey>::iterator iter = iterBegin;
vector<SubKey>::iterator iterFind = find( NewKeyInfo.vlMoveKeys.begin(), NewKeyInfo.vlMoveKeys.end(), iSelectedObjectID );
assert( NewKeyInfo.vlMoveKeys.end() != iter );
float fSubKeyStart = TLMoveEvent.GetActionStartTime();
for( iter; iter != iterFind; ++iter )
fSubKeyStart -= iterBegin->fTimeLength;
if( fSubKeyStart < 0.0f )
{
fSubKeyStart = 0.0f;
//iter = iterBegin;
//for( iter; iter != NewKeyInfo.vlMoveKeys.end(); ++iter )
// iter->fT
}
NewKeyInfo.fStartTime = fSubKeyStart;
//NewKeyInfo.fStartTime = NewKeyInfo.fTimeLength - (fSubKeyStart + iter->fTimeLength);
//NewKeyInfo.fStartTime = TLMoveEvent.GetActionStartInUnit();
CKeyPropChange KeyPropChange( &TOOL_DATA, &NewKeyInfo );
TOOL_DATA.RunCommand( &KeyPropChange );
}
break;
}
}
void cwxActionTimeLinePanel::OnTLObjectResize( cwxTLObjectResizeEvent& TLResizeEvent )
{
int iSelectedObjectID = TLResizeEvent.GetObjectID();//TOOL_DATA.GetSelectedActionID();
int iObjectUseType = TOOL_DATA.GetSelectedObjectUseType();
if( CToolData::ACTION == iObjectUseType )
{
const ActionInfo* pActionInfo = TOOL_DATA.GetActionInfoByID( iSelectedObjectID );
ActionInfo NewActionInfo = *pActionInfo;
NewActionInfo.fStartTime = TLResizeEvent.GetActionStartInUnit();
NewActionInfo.fTimeLength = TLResizeEvent.GetNewWidthInUnit();
CActionPropChange ActionPropChange( &TOOL_DATA, &NewActionInfo );
TOOL_DATA.RunCommand( &ActionPropChange );
}
else
{
const KeyInfo* pKeyInfo = TOOL_DATA.GetKeyInfoByID( iSelectedObjectID );
KeyInfo NewKeyInfo = *pKeyInfo;
NewKeyInfo.fStartTime = TLResizeEvent.GetActionStartInUnit();
NewKeyInfo.fTimeLength = TLResizeEvent.GetNewWidthInUnit();
CKeyPropChange KeyPropChange( &TOOL_DATA, &NewKeyInfo );
TOOL_DATA.RunCommand( &KeyPropChange );
}
}
void cwxActionTimeLinePanel::OnTLAxisEvent( cwxTLAxisEvent& TLAxisEvent )
{
CRTCutSceneRenderer* pRenderer = TOOL_DATA.GetRenderer();
CRTCutSceneMakerFrame* pMainFrame = static_cast<CRTCutSceneMakerFrame*>(TOOL_DATA.GetMainFrame());
cwxRenderPanel* pRenderPanel = pMainFrame->GetRenderPanel();
if( TLAxisEvent.OnLBDown() )
{
m_iOriEditMode = TOOL_DATA.GetEditMode();
TOOL_DATA.SetEditMode( CToolData::EM_FREE_TIME );
pRenderer->SetMode( IRenderBase::FREE_TIME_MODE );
TOOL_DATA.SetLocalTime( GetNowTime() );
}
else
if( TLAxisEvent.OnLBUp() )
{
TOOL_DATA.SetEditMode( m_iOriEditMode );
if( CToolData::EM_EDIT == m_iOriEditMode )
pRenderer->SetMode( IRenderBase::EDITOR_MODE );//pRenderPanel->StopPlay();
else
if( CToolData::EM_PLAY == m_iOriEditMode )
{
pRenderer->SetMode( IRenderBase::PLAY_MODE );
}
}
else
if( TLAxisEvent.IsAxisMove() && TLAxisEvent.IsLBDown() )
{
TOOL_DATA.SetLocalTime( GetNowTime() );
}
}
void cwxActionTimeLinePanel::_PopupContextMenu( int iXPos, int iYPos )
{
//long iSelected = m_pListRegisteredRes->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
//int iSelected = TOOL_DATA.GetSelectedActionID();
int iSelected = m_pTimeLine->GetSelectedObjectID();
wxMenu Menu;
wxMenuItem* pCopyItem = Menu.Append( POPUP_COPY, wxT("&Copy") ); // <20><><EFBFBD>õ<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>־<EFBFBD><D6BE><EFBFBD> Ȱ<><C8B0>ȭ <20><>.
wxMenuItem* pPasteItem = Menu.Append( POPUP_PASTE, wxT("&Paste") ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> Ȱ<><C8B0>ȭ <20><>.
Menu.AppendSeparator();
wxMenuItem* pSnapItem = Menu.Append( POPUP_SNAP_ACTION, wxT("&Snap") );
Menu.AppendSeparator();
wxMenuItem* pRemoveItem = Menu.Append( POPUP_REMOVE_ACTION, wxT("&Remove") );
if( wxNOT_FOUND == iSelected )
{
pCopyItem->Enable( false );
pSnapItem->Enable( false );
pRemoveItem->Enable( false );
}
// <20><><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD>
int iNowOnOverYIndex = m_pTimeLine->GetYLineIndex();
bool bAction = iNowOnOverYIndex % 2 == 0;
if( bAction )
pPasteItem->Enable( TOOL_DATA.IsActionCopied() );
else
pPasteItem->Enable( TOOL_DATA.IsKeyCopied() ); // ¦<><C2A6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<><C5B0>
PopupMenu( &Menu, iXPos, iYPos );
}
//void cwxActionTimeLinePanel::OnContextMenu( wxContextMenuEvent& ContextEvent )
//{
// wxPoint Point = ContextEvent.GetPosition();
//
// if( -1 == Point.x && -1 == Point.y )
// {
// wxSize Size = GetSize();
// Point.x = Size.x / 2;
// Point.y = Size.y / 2;
// }
// else
// {
// Point = ScreenToClient( Point );
// }
//
// _PopupContextMenu( Point.x, Point.y );
//}
void cwxActionTimeLinePanel::OnMouseEvent( wxMouseEvent& MouseEvent )
{
if( MouseEvent.RightUp() )
_PopupContextMenu( MouseEvent.GetX(), MouseEvent.GetY() );
//MouseEvent.
}
void cwxActionTimeLinePanel::OnMenuCopy( wxCommandEvent& MenuEvent )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><20>־<EFBFBD><D6BE>δ<EFBFBD> Ŀ<>ǵ<EFBFBD>
int iSelectedObjectID = m_pTimeLine->GetSelectedObjectID();
int iSelectedUseType = m_pTimeLine->GetSelectedObjectUseType();
CCopyToClipboard* pCopyToClipboard = NULL;
switch( iSelectedUseType )
{
case CToolData::ACTION:
{
const ActionInfo* pActionInfo = TOOL_DATA.GetActionInfoByID( iSelectedObjectID );
if( pActionInfo )
{
pCopyToClipboard = new CCopyToClipboard( &TOOL_DATA, pActionInfo );
}
}
break;
case CToolData::KEY:
{
const KeyInfo* pKeyInfo = TOOL_DATA.GetKeyInfoByID( iSelectedObjectID );
if( pKeyInfo )
{
pCopyToClipboard = new CCopyToClipboard( &TOOL_DATA, pKeyInfo );
}
}
break;
case CToolData::SUBKEY:
{
const KeyInfo* pKeyInfo = TOOL_DATA.GetKeyInfoByID( iSelectedObjectID );
if( pKeyInfo )
{
pCopyToClipboard = new CCopyToClipboard( &TOOL_DATA, pKeyInfo );
}
}
}
TOOL_DATA.RunCommand( pCopyToClipboard );
delete pCopyToClipboard;
}
void cwxActionTimeLinePanel::OnMenuPaste( wxCommandEvent& MenuEvent )
{
int iNowType = -1;
// <20><><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD>
int iNowOnOverYIndex = m_pTimeLine->GetYLineIndex();
bool bAction = iNowOnOverYIndex % 2 == 0;
if( bAction )
iNowType = CCopyToClipboard::COPY_ACTION;
else
iNowType = CCopyToClipboard::COPY_KEY; // ¦<><C2A6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<><C5B0>
wxASSERT( -1 != iNowType );
if( -1 != iNowType )
{
int iActorIndex = iNowOnOverYIndex / 2;
if( TOOL_DATA.GetNumActors() <= iActorIndex )
iActorIndex = TOOL_DATA.GetNumActors() - 1;
wxString strActorNameToPaste;
TOOL_DATA.GetActorNameByIndex( iActorIndex, strActorNameToPaste );
wxCSConv MBConv( wxFONTENCODING_CP949 );
char acBuf[ 256 ];
ZeroMemory( acBuf, sizeof(acBuf) );
MBConv.WC2MB( acBuf, strActorNameToPaste.c_str(), 256 );
float fNowTimeByUnit = m_pTimeLine->GetNowMousePosTime();
CPasteFromClipboard PasteFromClipboard( &TOOL_DATA, iNowType, acBuf, fNowTimeByUnit );
TOOL_DATA.RunCommand( &PasteFromClipboard );
}
}
void cwxActionTimeLinePanel::OnMenuSnapAction( wxCommandEvent& MenuEvent )
{
int iSelectedID = m_pTimeLine->GetSelectedObjectID();
int iSelectedUseType = m_pTimeLine->GetSelectedObjectUseType();
switch( iSelectedUseType )
{
case CToolData::ACTION:
{
const ActionInfo* pActionInfo = TOOL_DATA.GetActionInfoByID( iSelectedID );
if( pActionInfo )
{
// <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>.
wxCSConv MBConv( wxFONTENCODING_CP949 );
wxChar wcaBuf[ 256 ];
ZeroMemory( wcaBuf, sizeof(wcaBuf) );
MBConv.MB2WC( wcaBuf, string(pActionInfo->strActorName + "_ACTION").c_str(), 256 );
ActionInfo NewActionInfo = *pActionInfo;
NewActionInfo.fStartTime = m_pTimeLine->GetPrevObjectEndTime( wcaBuf, NewActionInfo.iID );
CActionPropChange ActionPropChange( &TOOL_DATA, &NewActionInfo );
TOOL_DATA.RunCommand( &ActionPropChange );
}
}
break;
// <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD>...
case CToolData::KEY:
{
const KeyInfo* pKeyInfo = TOOL_DATA.GetKeyInfoByID( iSelectedID );
if( pKeyInfo )
{
// <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>.
wxCSConv MBConv( wxFONTENCODING_CP949 );
wxChar wcaBuf[ 256 ];
ZeroMemory( wcaBuf, sizeof(wcaBuf) );
MBConv.MB2WC( wcaBuf, (pKeyInfo->strActorName+"_KEY").c_str(), 256 );
KeyInfo NewKeyInfo = *pKeyInfo;
NewKeyInfo.fStartTime = m_pTimeLine->GetPrevObjectEndTime( wcaBuf, NewKeyInfo.iID );
CKeyPropChange KeyPropChange( &TOOL_DATA, &NewKeyInfo );
TOOL_DATA.RunCommand( &KeyPropChange );
}
}
break;
}
}
void cwxActionTimeLinePanel::OnMenuRemoveAction( wxCommandEvent& MenuEvent )
{
int iSelectedID = m_pTimeLine->GetSelectedObjectID();
int iSelectedUseType = m_pTimeLine->GetSelectedObjectUseType();
switch( iSelectedUseType )
{
case CToolData::ACTION:
{
CActionRemoveCmd ActionRemove( &TOOL_DATA, iSelectedID );
TOOL_DATA.RunCommand( &ActionRemove );
}
break;
case CToolData::KEY:
case CToolData::SUBKEY:
{
CKeyRemoveCmd KeyRemove( &TOOL_DATA, iSelectedID );
TOOL_DATA.RunCommand( &KeyRemove );
}
break;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20>ݿ<EFBFBD>
void cwxActionTimeLinePanel::ReflectData( void )
{
int iSelectedActionID = m_pTimeLine->GetSelectedObjectID();
m_pTimeLine->Clear();
wxCSConv MBConv( wxFONTENCODING_CP949 );
wxChar wcaBuf[ 256 ];
ZeroMemory( wcaBuf, sizeof(wcaBuf) );
wxString strActorName;
int iNumActor = TOOL_DATA.GetNumActors();
for( int iActor = 0; iActor < iNumActor; ++iActor )
{
TOOL_DATA.GetActorNameByIndex( iActor, strActorName );
wxString strActionObject = strActorName+TL_ACTION_POSTFIX;
m_pTimeLine->AddItem( strActionObject, wxColour(wxT("BLUE")) );
int iNumAction = TOOL_DATA.GetThisActorsActionNum( strActorName.c_str() );
//int iNumAction = TOOL_DATA.GetThisActorsActionNum( strActionObject.c_str() );
for( int iAction = 0; iAction < iNumAction; ++iAction )
{
const ActionInfo* pActionInfo = TOOL_DATA.GetThisActorsActionInfoByIndex( strActorName.c_str(), iAction );
MBConv.MB2WC( wcaBuf, pActionInfo->strActionName.c_str(), 256 );
bool bFixObject = (pActionInfo->iActionType == ActionInfo::AT_ONCE) ? true : false;
// <20>÷<EFBFBD><C3B7><EFBFBD> <20>׼<EFBFBD> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD>..
wxColour Color;
switch( pActionInfo->iActionType )
{
case ActionInfo::AT_ONCE:
Color.Set( 255, 151, 255 );
break;
case ActionInfo::AT_REPEAT:
Color.Set( 122, 192, 67 );
break;
case ActionInfo::AT_CONTINUE:
Color.Set( 255, 167, 25 );
break;
}
m_pTimeLine->AddObject( strActionObject, wcaBuf, pActionInfo->iID,
CToolData::ACTION, bFixObject, pActionInfo->fStartTime, pActionInfo->fTimeLength, Color );
//if( ActionInfo::AT_ONCE == pActionInfo->iActionType )
// m_pTimeLine->FixObjectSize( pActionInfo->iID, true );
}
wxString strKeyObject = strActorName+TL_KEY_POSTFIX;
m_pTimeLine->AddItem( strKeyObject, wxColour(wxT("BLUE")) );
int iNumKey = TOOL_DATA.GetThisActorsKeyNum( strActorName.c_str() );
//int iNumKey = TOOL_DATA.GetThisActorsKeyNum( strKeyObject.c_str() );
for( int iKey = 0; iKey < iNumKey; ++iKey )
{
const KeyInfo* pKeyInfo = TOOL_DATA.GetThisActorsKeyInfoByIndex( strActorName.c_str(), iKey );
wxColour Color;
Color.Set( 200, 200, 200 );
MBConv.MB2WC( wcaBuf, pKeyInfo->strKeyName.c_str(), 256 );
switch( pKeyInfo->iKeyType )
{
case KeyInfo::MOVE:
case KeyInfo::ROTATION:
case KeyInfo::SHOW:
case KeyInfo::HIDE:
m_pTimeLine->AddObject( strKeyObject, wcaBuf, pKeyInfo->iID,
CToolData::KEY, false, pKeyInfo->fStartTime, pKeyInfo->fTimeLength, Color );
break;
case KeyInfo::MULTI_MOVE:
{
float fNowStartTime = pKeyInfo->fStartTime;
int iNumKey = (int)pKeyInfo->vlMoveKeys.size();
for( int iKey = 0; iKey < iNumKey-1; ++iKey ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD>ѿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
{
const SubKey& MoveKey = pKeyInfo->vlMoveKeys.at(iKey);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ <20>߰<EFBFBD>. <20><><EFBFBD><20><EFBFBD><E0BCAE><EFBFBD>Ը<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>.
if( iNumKey / 2 == iKey )
m_pTimeLine->AddObject( strKeyObject, wcaBuf, MoveKey.iID, CToolData::SUBKEY, true,
fNowStartTime, MoveKey.fTimeLength, Color );
else
m_pTimeLine->AddObject( strKeyObject, wxEmptyString, MoveKey.iID, CToolData::SUBKEY, true,
fNowStartTime, MoveKey.fTimeLength, Color );
fNowStartTime += MoveKey.fTimeLength;
}
}
break;
}
}
}
if( wxNOT_FOUND != iSelectedActionID )
m_pTimeLine->SelectObject( iSelectedActionID );
int iHorizontal = m_pTimeLine->GetScrollPos( wxHORIZONTAL );
int iVertical = m_pTimeLine->GetScrollPos( wxVERTICAL );
m_pTimeLine->SetScrollPos( wxHORIZONTAL, iHorizontal, false );
m_pTimeLine->SetScrollPos( wxVERTICAL, iVertical, false );
m_pTimeLine->Refresh( true, &m_pTimeLine->GetClientRect() );
}
void cwxActionTimeLinePanel::_KeyObjectUpdate( ICommand* pCommand, wxCSConv &MBConv )
{
//const KeyInfo& NewKeyInfo = static_cast<CKeyPropChange*>(pCommand)->m_NewKeyInfo;
CKeyPropChange* pKeyPropChange = static_cast<CKeyPropChange*>(pCommand);
const KeyInfo* pNewKeyInfo = NULL;
if( pKeyPropChange->m_bUndo )
pNewKeyInfo = &pKeyPropChange->m_PrevKeyInfo;
else
pNewKeyInfo = &pKeyPropChange->m_NewKeyInfo;
wxColour Color;
Color.Set( 200, 200, 200 );
wxChar wcaActorName[ 256 ];
ZeroMemory( wcaActorName, sizeof(wcaActorName) );
MBConv.MB2WC( wcaActorName, pNewKeyInfo->strActorName.c_str(), 256 );
wxStrcat( wcaActorName, TL_KEY_POSTFIX );
wxChar wcaKeyName[ 256 ];
ZeroMemory( wcaKeyName, sizeof(wcaKeyName) );
MBConv.MB2WC( wcaKeyName, pNewKeyInfo->strKeyName.c_str(), 256 );
switch( pNewKeyInfo->iKeyType )
{
case KeyInfo::MOVE:
case KeyInfo::ROTATION:
case KeyInfo::SHOW:
case KeyInfo::HIDE:
m_pTimeLine->ModifyObject( wcaActorName, wcaKeyName, pNewKeyInfo->iID,
CToolData::KEY, false, pNewKeyInfo->fStartTime, pNewKeyInfo->fTimeLength, Color );
break;
case KeyInfo::MULTI_MOVE:
{
float fNowStartTime = pNewKeyInfo->fStartTime;
int iNumKey = (int)pNewKeyInfo->vlMoveKeys.size();
for( int iKey = 0; iKey < iNumKey-1; ++iKey ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD>ѿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
{
const SubKey& MoveKey = pNewKeyInfo->vlMoveKeys.at(iKey);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ <20>߰<EFBFBD>. <20><><EFBFBD><20><EFBFBD><E0BCAE><EFBFBD>Ը<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>.
if( iNumKey / 2 == iKey )
m_pTimeLine->ModifyObject( wcaActorName, wcaKeyName, MoveKey.iID, CToolData::SUBKEY, true,
fNowStartTime, MoveKey.fTimeLength, Color );
else
m_pTimeLine->ModifyObject( wcaActorName, wxEmptyString, MoveKey.iID, CToolData::SUBKEY, true,
fNowStartTime, MoveKey.fTimeLength, Color );
fNowStartTime += MoveKey.fTimeLength;
}
}
break;
}
}
void cwxActionTimeLinePanel::_ActionObjectUpdate( ICommand* pCommand, wxCSConv &MBConv )
{
CActionPropChange* pActionPropChange = static_cast<CActionPropChange*>(pCommand);
const ActionInfo* pNewActionInfo = NULL;
if( pActionPropChange->m_bUndo )
pNewActionInfo = &pActionPropChange->m_PrevActionInfo;
else
pNewActionInfo = &pActionPropChange->m_NewActionInfo;
wxChar wcaActorName[ 256 ];
ZeroMemory( wcaActorName, sizeof(wcaActorName) );
MBConv.MB2WC( wcaActorName, pNewActionInfo->strActorName.c_str(), 256 );
wxStrcat( wcaActorName, TL_ACTION_POSTFIX );
wxChar wcaActionName[ 256 ];
ZeroMemory( wcaActionName, sizeof(wcaActionName) );
MBConv.MB2WC( wcaActionName, pNewActionInfo->strActionName.c_str(), 256 );
bool bFixObject = (pNewActionInfo->iActionType == ActionInfo::AT_ONCE) ? true : false;
// <20>÷<EFBFBD><C3B7><EFBFBD> <20>׼<EFBFBD> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD>..
wxColour Color;
switch( pNewActionInfo->iActionType )
{
case ActionInfo::AT_ONCE:
Color.Set( 255, 151, 255 );
break;
case ActionInfo::AT_REPEAT:
Color.Set( 122, 192, 67 );
break;
case ActionInfo::AT_CONTINUE:
Color.Set( 255, 167, 25 );
break;
}
m_pTimeLine->ModifyObject( wcaActorName, wcaActionName, pNewActionInfo->iID,
CToolData::ACTION, bFixObject, pNewActionInfo->fStartTime, pNewActionInfo->fTimeLength, Color );
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Object <20><> <20>ݿ<EFBFBD>
void cwxActionTimeLinePanel::ModifyObject( ICommand* pCommand )
{
assert( CMD_ACTION_PROP_CHANGE == pCommand->GetTypeID() ||
CMD_KEY_PROP_CHANGE == pCommand->GetTypeID() );
wxCSConv MBConv( wxFONTENCODING_CP949 );
switch( pCommand->GetTypeID() )
{
case CMD_ACTION_PROP_CHANGE:
{
_ActionObjectUpdate(pCommand, MBConv);
}
break;
case CMD_KEY_PROP_CHANGE:
{
_KeyObjectUpdate(pCommand, MBConv);
}
break;
}
int iHorizontal = m_pTimeLine->GetScrollPos( wxHORIZONTAL );
int iVertical = m_pTimeLine->GetScrollPos( wxVERTICAL );
m_pTimeLine->SetScrollPos( wxHORIZONTAL, iHorizontal, false );
m_pTimeLine->SetScrollPos( wxVERTICAL, iVertical, false );
m_pTimeLine->Refresh( true, &m_pTimeLine->GetClientRect() );
}
DWORD cwxActionTimeLinePanel::GetNowTime( void )
{
DWORD dwNowTime = DWORD(m_pTimeLine->GetNowTime() * 1000.0f);
return dwNowTime;
}
void cwxActionTimeLinePanel::SetTime( float fTime )
{
// <20>̰<EFBFBD> milliseconds <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pTimeLine->UpdateTimeBar( fTime ); // <20>׼<EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
int iHorizontal = m_pTimeLine->GetScrollPos( wxHORIZONTAL );
int iVertical = m_pTimeLine->GetScrollPos( wxVERTICAL );
m_pTimeLine->SetScrollPos( wxHORIZONTAL, iHorizontal, false );
m_pTimeLine->SetScrollPos( wxVERTICAL, iVertical, false );
m_pTimeLine->Refresh( true, &m_pTimeLine->GetClientRect() );
}
void cwxActionTimeLinePanel::OnMouseEventFromFrame( wxMouseEvent& MouseEvent )
{
m_pTimeLine->OnMouseEvent( MouseEvent );
}