DragonNest/Client/EtViewer/WorkspacePaneView.cpp
2024-12-19 09:48:26 +08:00

793 lines
25 KiB
C++

// MeshPaneView.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù.
//
#include "stdafx.h"
#include <shlwapi.h>
#include "EtViewer.h"
#include "WorkspacePaneView.h"
#include "UserMessage.h"
#include "RenderBase.h"
#include "MainFrm.h"
#include "PaneDefine.h"
// CWorkspacePaneView
IMPLEMENT_DYNCREATE(CWorkspacePaneView, CFormView)
CWorkspacePaneView::CWorkspacePaneView()
: CFormView(CWorkspacePaneView::IDD)
{
m_bActiavte = false;
m_pContextMenu = new CMenu;
m_pContextMenu->LoadMenu( IDR_CONTEXT );
}
CWorkspacePaneView::~CWorkspacePaneView()
{
SAFE_DELETE( m_pContextMenu );
}
void CWorkspacePaneView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE1, m_TreeCtrl);
}
BEGIN_MESSAGE_MAP(CWorkspacePaneView, CFormView)
ON_WM_SIZE()
ON_MESSAGE( UM_WORKSPACEPANE_REFRESH, OnRefresh )
ON_MESSAGE( UM_WORKSPACEPANE_ADD, OnAdd )
ON_MESSAGE( UM_WORKSPACEPANE_REMOVE, OnRemove )
ON_MESSAGE( UM_TREEEX_UPDATECHECK, OnCheckItem )
ON_MESSAGE( UM_WORKSPACEPANE_SETSHOWFLAG, OnSetCheckItem )
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_SCENE_ADD, &CWorkspacePaneView::OnSceneAdd)
ON_COMMAND(ID_SCENE_REMOVE, &CWorkspacePaneView::OnSceneRemove)
ON_COMMAND(ID_SKIN_ADD, &CWorkspacePaneView::OnSkinAdd)
ON_COMMAND(ID_SKIN_REMOVE, &CWorkspacePaneView::OnSkinRemove)
ON_COMMAND(ID_SKIN_SAVE, &CWorkspacePaneView::OnSkinSave)
ON_COMMAND(ID_SKIN_SAVEAS, &CWorkspacePaneView::OnSkinSaveAs)
ON_COMMAND(ID_ANIMATION_ADD, &CWorkspacePaneView::OnAnimationAdd)
ON_COMMAND(ID_ANIMATION_REMOVE, &CWorkspacePaneView::OnAnimationRemove)
ON_COMMAND( ID_ANIMATION_MERGE, &CWorkspacePaneView::OnAnimationMerge)
ON_COMMAND(ID_COMMON_REMOVE, &CWorkspacePaneView::OnCommonRemove)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CWorkspacePaneView::OnTvnSelchangedTree1)
ON_COMMAND(ID_LIGHT_ADD_DIR, &CWorkspacePaneView::OnLightAddDir)
ON_COMMAND(ID_LIGHT_ADD_POINT, &CWorkspacePaneView::OnLightAddPoint)
ON_COMMAND(ID_LIGHT_ADD_SPOT, &CWorkspacePaneView::OnLightAddSpot)
ON_COMMAND(ID_LIGHT_REMOVE, &CWorkspacePaneView::OnLightRemove)
END_MESSAGE_MAP()
// CWorkspacePaneView Áø´ÜÀÔ´Ï´Ù.
#ifdef _DEBUG
void CWorkspacePaneView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CWorkspacePaneView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
// CWorkspacePaneView ¸Þ½ÃÁö 󸮱âÀÔ´Ï´Ù.
void CWorkspacePaneView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù.
if( m_bActiavte == true ) return;
m_bActiavte = true;
m_TreeCtrl.EnableMultiSelect();
CBitmap bitmap;
bitmap.LoadBitmap( IDB_WORKSPACEICON );
m_ImageList.Create( 16, 16, ILC_COLOR24|ILC_MASK, 14, 1 );
m_ImageList.Add( &bitmap, RGB(0,255,0) );
m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL );
m_TreeCtrl.Activate();
// m_TreeCtrl.EnableDrag( TRUE );
// m_TreeCtrl.SetDragRect( TRUE );
}
void CWorkspacePaneView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
if( m_TreeCtrl ) {
CRect rcRect;
GetClientRect( &rcRect );
m_TreeCtrl.MoveWindow( &rcRect );
}
}
void CWorkspacePaneView::CalcSelectItemList()
{
m_SelectItemList.RemoveAll();
m_TreeCtrl.GetSelectedList( m_SelectItemList );
}
LRESULT CWorkspacePaneView::OnRefresh( WPARAM wParam, LPARAM lParam )
{
m_TreeCtrl.DeleteAllItems();
m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL );
return S_OK;
}
LRESULT CWorkspacePaneView::OnAdd( WPARAM wParam, LPARAM lParam )
{
CObjectBase *pBase = (CObjectBase *)wParam;
int nIconID = 0;
bool bShowHide = false;
switch( pBase->GetType() ) {
case CObjectBase::SCENE:
nIconID = 0;
bShowHide = true;
break;
case CObjectBase::SKIN:
nIconID = 2;
bShowHide = true;
break;
case CObjectBase::SUBMESH:
nIconID = 4;
bShowHide = true;
break;
case CObjectBase::ANIMATION:
nIconID = 8;
break;
case CObjectBase::LIGHTDIR:
case CObjectBase::LIGHTPOINT:
case CObjectBase::LIGHTSPOT:
nIconID = 10;
bShowHide = true;
break;
case CObjectBase::LIGHTFOLDER:
nIconID = 12;
break;
}
m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL );
HTREEITEM hParent = pBase->GetParent()->GetTreeItemID();
HTREEITEM hti = m_TreeCtrl.InsertItem( pBase->GetName(), nIconID, nIconID+1, hParent ? hParent : 0 );
pBase->SetTreeCtrl( &m_TreeCtrl );
pBase->SetTreeItemID( hti );
m_TreeCtrl.Expand( hParent, TVE_EXPAND );
if( bShowHide == true )
m_TreeCtrl.SetItemState( hti, INDEXTOSTATEIMAGEMASK(2), TVIS_STATEIMAGEMASK );
else m_TreeCtrl.SetItemState( hti, INDEXTOSTATEIMAGEMASK(0), TVIS_STATEIMAGEMASK );
return S_OK;
}
LRESULT CWorkspacePaneView::OnRemove( WPARAM wParam, LPARAM lParam )
{
CObjectBase *pBase = (CObjectBase *)wParam;
m_TreeCtrl.DeleteItem( pBase->GetTreeItemID() );
return S_OK;
}
LRESULT CWorkspacePaneView::OnSetCheckItem( WPARAM wParam, LPARAM lParam )
{
HTREEITEM hti = (HTREEITEM)wParam;
m_TreeCtrl.SetItemState( hti, INDEXTOSTATEIMAGEMASK(1 + (int)lParam), TVIS_STATEIMAGEMASK );
return S_OK;
}
bool CWorkspacePaneView::CheckSameTypeObject( int nType )
{
bool bFlag = true;
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
if( CGlobalValue::GetInstance().GetObjectTypeFromDescription( m_TreeCtrl.GetItemText( hti ) ) != (CObjectBase::OBJECT_TYPE)nType ) {
bFlag = false;
break;
}
}
return bFlag;
}
void CWorkspacePaneView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
// TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
CMenu *pMenu = m_pContextMenu->GetSubMenu(0);
std::vector<int> VecEnableMenuID;
pMenu->EnableMenuItem( ID_COMMON_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_SCENE_ADD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_SCENE_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_SKIN_ADD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_SKIN_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_SKIN_SAVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_SKIN_SAVEAS, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_ANIMATION_ADD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_ANIMATION_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_ANIMATION_MERGE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_LIGHT_ADD_DIR, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_LIGHT_ADD_POINT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_LIGHT_ADD_SPOT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_LIGHT_REMOVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
CalcSelectItemList();
int nSelectCount = (int)m_SelectItemList.GetCount();
if( nSelectCount == 0 ) {
VecEnableMenuID.push_back( ID_SCENE_ADD );
}
else if( nSelectCount > 1 ) {
VecEnableMenuID.push_back( ID_COMMON_REMOVE );
// °°Àº Á¾·ù³¢¸®¸¸ °ñ¶óÁ³À»¶§ üũ
if( CheckSameTypeObject( (int)CObjectBase::ANIMATION ) == true ) {
VecEnableMenuID.push_back( ID_ANIMATION_MERGE );
VecEnableMenuID.push_back( ID_ANIMATION_REMOVE );
}
if( CheckSameTypeObject( (int)CObjectBase::SKIN ) == true ) {
VecEnableMenuID.push_back( ID_SKIN_REMOVE );
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CObjectBase *pBase = CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
if( pBase->IsChildModify() == true ) {
VecEnableMenuID.push_back( ID_SKIN_SAVE );
break;
}
}
}
if( CheckSameTypeObject( (int)CObjectBase::SCENE ) == true ) {
VecEnableMenuID.push_back( ID_SCENE_REMOVE );
}
}
else {
CString szName = m_TreeCtrl.GetItemText( m_SelectItemList.GetHead() );
HTREEITEM hti = m_SelectItemList.GetHead();
CObjectBase *pBase = CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
if( pBase == NULL ) return;
switch( pBase->GetType() ) {
case CObjectBase::SCENE:
VecEnableMenuID.push_back( ID_SCENE_ADD );
if( CGlobalValue::GetInstance().GetRootObject() &&
CGlobalValue::GetInstance().GetRootObject()->GetChild(0) &&
CGlobalValue::GetInstance().GetRootObject()->GetChild(0) != pBase ) {
VecEnableMenuID.push_back( ID_SCENE_REMOVE );
VecEnableMenuID.push_back( ID_COMMON_REMOVE );
}
VecEnableMenuID.push_back( ID_ANIMATION_ADD );
VecEnableMenuID.push_back( ID_SKIN_ADD );
break;
case CObjectBase::SKIN:
VecEnableMenuID.push_back( ID_SKIN_REMOVE );
VecEnableMenuID.push_back( ID_COMMON_REMOVE );
VecEnableMenuID.push_back( ID_ANIMATION_ADD );
if( pBase->IsChildModify() == true ) {
VecEnableMenuID.push_back( ID_SKIN_SAVE );
}
VecEnableMenuID.push_back( ID_SKIN_SAVEAS );
break;
case CObjectBase::SUBMESH:
break;
case CObjectBase::ANIMATION:
VecEnableMenuID.push_back( ID_COMMON_REMOVE );
VecEnableMenuID.push_back( ID_ANIMATION_REMOVE );
break;
case CObjectBase::LIGHTFOLDER:
VecEnableMenuID.push_back( ID_LIGHT_ADD_DIR );
VecEnableMenuID.push_back( ID_LIGHT_ADD_POINT );
VecEnableMenuID.push_back( ID_LIGHT_ADD_SPOT );
break;
case CObjectBase::LIGHTDIR:
case CObjectBase::LIGHTPOINT:
case CObjectBase::LIGHTSPOT:
VecEnableMenuID.push_back( ID_LIGHT_REMOVE );
VecEnableMenuID.push_back( ID_COMMON_REMOVE );
break;
}
}
for( DWORD i=0; i<VecEnableMenuID.size(); i++ ) {
pMenu->EnableMenuItem( VecEnableMenuID[i], MF_BYCOMMAND | MF_ENABLED );
}
pMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
void CWorkspacePaneView::OnSceneAdd()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
CObjectBase *pBase = new CObjectScene;
CGlobalValue::GetInstance().AddObject( CString(), pBase );
}
void CWorkspacePaneView::OnSceneRemove()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CGlobalValue::GetInstance().RemoveObjectFromTreeID( hti );
}
}
void CWorkspacePaneView::OnSkinAdd()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
CString szFileList;
TCHAR szFilter[] = _T( "Eternity Skin File (*.skn)|*.skn|Eternity Animation File (*.ani)|*.ani|Eternity Support File (*.skn;*.ani)|*.skn;*.ani|All Files (*.*)|*.*||" );
CFileDialog dlg( TRUE, _T("skn"), _T("*.skn"), OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_ALLOWMULTISELECT| OFN_ENABLESIZING , szFilter, CGlobalValue::GetInstance().GetView() );
dlg.GetOFN().lpstrFile = szFileList.GetBuffer(100000);
dlg.GetOFN().nMaxFile = 100000;
dlg.m_ofn.lpstrTitle = "Open Eternity Engine File";
if( IDOK != dlg.DoModal() ) {
szFileList.ReleaseBuffer();
return;
}
std::vector<CString> szVecSkinList;
std::vector<CString> szVecAniList;
CGlobalValue::GetInstance().ParseFileList( szFileList, "skn", szVecSkinList );
CGlobalValue::GetInstance().ParseFileList( szFileList, "ani", szVecAniList );
szFileList.ReleaseBuffer();
if( szVecSkinList.size() == 0 ) return;
else if( szVecSkinList.size() == 1 ) {
float fPer = 100 / (float)szVecAniList.size() + 1.f;
CGlobalValue::GetInstance().UpdateProgress( 0 );
char szTemp[512];
_GetFullFileName( szTemp, _countof(szTemp), szVecSkinList[0] );
CObjectBase *pBase = new CObjectSkin;
pBase->SetName( CString(szTemp) );
((CObjectSkin*)pBase)->LoadSkin( szVecSkinList[0], true );
if( strstr( szVecSkinList[0], "Weapon" ) )
{
if( StrStrI( szVecSkinList[0], "Gauntlet" ) == 0 &&
StrStrI( szVecSkinList[0], "Academicglove" ) == 0 &&
StrStrI( szVecSkinList[0], "Charm" ) == 0 )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_WEAPON );
}
else if( strstr( szVecSkinList[0], "Cash_Item" ) )
{
if( StrStrI( szVecSkinList[0], "EarRing" ) )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_EARRING );
else if( StrStrI( szVecSkinList[0], "Wing" ) )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_WING );
else if( StrStrI( szVecSkinList[0], "Tail" ) )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_TAIL );
}
CGlobalValue::GetInstance().AddObject( m_SelectItemList.GetHead(), pBase );
CGlobalValue::GetInstance().UpdateProgress( (int)(fPer*1.f) );
// ¿¡´µ ·Îµù
for( DWORD i=0; i<szVecAniList.size(); i++ ) {
char szTemp[512];
_GetFullFileName( szTemp, _countof(szTemp), szVecAniList[i] );
CObjectBase *pBaseAni = new CObjectAnimation;
if( ((CObjectAnimation*)pBaseAni)->LoadAnimation( szVecAniList[i] ) == false ) {
SAFE_DELETE( pBaseAni );
continue;
}
CGlobalValue::GetInstance().AddObject( pBase->GetTreeItemID(), pBaseAni );
CGlobalValue::GetInstance().UpdateProgress( (int)(fPer*(i+2)) );
}
CGlobalValue::GetInstance().UpdateProgress( 0 );
}
else if( szVecSkinList.size() > 1 ) {
if( szVecAniList.size() > 0 ) return;
float fPer = 100 / (float)szVecSkinList.size() + 1.f;
CGlobalValue::GetInstance().UpdateProgress( 0 );
for( DWORD i=0; i<szVecSkinList.size(); i++ ) {
char szTemp[512];
_GetFullFileName( szTemp, _countof(szTemp), szVecSkinList[i] );
CObjectBase *pBase = new CObjectSkin;
pBase->SetName( CString(szTemp) );
((CObjectSkin*)pBase)->LoadSkin( szVecSkinList[i], true );
if( strstr( szVecSkinList[i], "Weapon" ) )
{
if( StrStrI( szVecSkinList[i], "Gauntlet" ) == 0 &&
StrStrI( szVecSkinList[i], "Academicglove" ) == 0 &&
StrStrI( szVecSkinList[i], "Charm" ) == 0 )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_WEAPON );
}
else if( strstr( szVecSkinList[i], "Cash_Item" ) )
{
if( StrStrI( szVecSkinList[i], "EarRing" ) )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_EARRING );
else if( StrStrI( szVecSkinList[i], "Wing" ) )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_WING );
else if( StrStrI( szVecSkinList[i], "Tail" ) )
((CObjectSkin*)pBase)->SetSkinType( CObjectSkin::SKIN_TAIL );
}
CGlobalValue::GetInstance().AddObject( m_SelectItemList.GetHead(), pBase );
CGlobalValue::GetInstance().UpdateProgress( (int)(fPer*(i+1)) );
}
CGlobalValue::GetInstance().UpdateProgress( 0 );
}
}
void CWorkspacePaneView::OnSkinRemove()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CGlobalValue::GetInstance().RemoveObjectFromTreeID( hti );
}
}
void CWorkspacePaneView::OnSkinSave()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CObjectSkin *pBase = (CObjectSkin *)CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
if( !pBase ) continue;
if( pBase->IsChildModify() == false ) continue;
pBase->SaveSkin( CString("") );
}
}
void CWorkspacePaneView::OnSkinSaveAs()
{
CString szFileList;
TCHAR szFilter[] = _T( "Eternity Skin File (*.skn)|*.skn|Eternity Animation File (*.ani)|*.ani|Eternity Support File (*.skn;*.ani)|*.skn;*.ani|All Files (*.*)|*.*||" );
CFileDialog dlg( FALSE, _T("skn"), _T("*.skn"), OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ENABLESIZING , szFilter, CGlobalValue::GetInstance().GetView() );
dlg.m_ofn.lpstrTitle = "Save As Skin File";
if( IDOK != dlg.DoModal() ) {
return;
}
HTREEITEM hti = m_SelectItemList.GetHead();
CObjectSkin *pBase = (CObjectSkin *)CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
if( !pBase ) return;
pBase->SaveSkin( dlg.GetPathName() );
// ±âÁ¸°Å »©¹ö¸®±¸ ´Ù½Ã ÀоîÁØ´Ù.
HTREEITEM hParent = pBase->GetParent()->GetTreeItemID();
CGlobalValue::GetInstance().RemoveObjectFromTreeID( hti );
char szTemp[512];
_GetFullFileName( szTemp, _countof(szTemp), dlg.GetPathName() );
pBase = new CObjectSkin;
pBase->SetName( CString(szTemp) );
((CObjectSkin*)pBase)->LoadSkin( dlg.GetPathName(), true );
CGlobalValue::GetInstance().AddObject( hParent, pBase );
}
void CWorkspacePaneView::OnAnimationAdd()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
CString szFileList;
TCHAR szFilter[] = _T( "Eternity Animation File (*.ani)|*.ani|Eternity Skin File (*.skn)|*.skn|Eternity Support File (*.skn;*.ani)|*.skn;*.ani|All Files (*.*)|*.*||" );
CFileDialog dlg( TRUE, _T("ani"), _T("*.ani"), OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_ALLOWMULTISELECT| OFN_ENABLESIZING , szFilter, CGlobalValue::GetInstance().GetView() );
dlg.GetOFN().lpstrFile = szFileList.GetBuffer(100000);
dlg.GetOFN().nMaxFile = 100000;
dlg.m_ofn.lpstrTitle = "Open Eternity Engine File";
if( IDOK != dlg.DoModal() ) {
szFileList.ReleaseBuffer();
return;
}
std::vector<CString> szVecAniList;
CGlobalValue::GetInstance().ParseFileList( szFileList, "ani", szVecAniList );
szFileList.ReleaseBuffer();
if( szVecAniList.size() == 0 ) return;
float fPer = 100 / (float)szVecAniList.size();
CGlobalValue::GetInstance().UpdateProgress( 0 );
for( DWORD i=0; i<szVecAniList.size(); i++ ) {
char szTemp[512];
_GetFullFileName( szTemp, _countof(szTemp), szVecAniList[i] );
CObjectBase *pBase = new CObjectAnimation;
if( ((CObjectAnimation*)pBase)->LoadAnimation( szVecAniList[i] ) == false ) {
SAFE_DELETE( pBase );
}
else
CGlobalValue::GetInstance().AddObject( m_SelectItemList.GetHead(), pBase );
CGlobalValue::GetInstance().UpdateProgress( (int)(fPer * (i+1)) );
}
CGlobalValue::GetInstance().UpdateProgress( 0 );
}
void CWorkspacePaneView::OnAnimationRemove()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CGlobalValue::GetInstance().RemoveObjectFromTreeID( hti );
}
}
void CWorkspacePaneView::OnAnimationMerge()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
std::vector<CString> szVecFileList;
std::vector<HTREEITEM> hVecItemList;
std::vector<CString> szVecParentList;
std::vector<HTREEITEM> hVecParentItemList;
while(p) {
hti = m_SelectItemList.GetNext( p );
CObjectAnimation *pBase = (CObjectAnimation*)CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
if( pBase && pBase->GetParent() ) {
bool bFlag = true;
for( DWORD i=0; i<szVecParentList.size(); i++ ) {
if( strcmp( szVecParentList[i], pBase->GetParent()->GetName() ) == NULL ) {
bFlag = false;
break;
}
}
if( bFlag == true ) {
szVecParentList.push_back( pBase->GetParent()->GetName() );
hVecParentItemList.push_back( pBase->GetParent()->GetTreeItemID() );
}
}
szVecFileList.push_back( pBase->GetFileName() );
hVecItemList.push_back( hti );
}
if( szVecFileList.size() <= 1 ) return;
TCHAR szFilter[] = _T( "Eternity Animation File (*.ani)|*.ani|All Files (*.*)|*.*||" );
CFileDialog dlg( FALSE, _T("ani"), _T("*.ani"), OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ENABLESIZING , szFilter, CGlobalValue::GetInstance().GetView() );
dlg.m_ofn.lpstrTitle = "Save Merge Animation";
if( IDOK != dlg.DoModal() ) {
return;
}
CWnd *pWnd = GetPaneWnd( ANI_PANE );
pWnd->SendMessage( UM_ANICONTROL_REFRESH );
// ¸ÓÁöÇØ¼­ ÀúÀå
CGlobalValue::GetInstance().UpdateProgress( 0 );
float fPer = 100 / (float)szVecFileList.size();
CEtResource::FlushWaitDelete();
EtAniHandle MergeHandle, DummyHandle;
MergeHandle = EternityEngine::LoadAni( szVecFileList[0] );
for( DWORD i=1; i<szVecFileList.size(); i++ ) {
DummyHandle = EternityEngine::LoadAni( szVecFileList[i] );
if( !DummyHandle ) {
assert(0);
continue;
}
EternityEngine::MergeAni( MergeHandle, DummyHandle );
SAFE_RELEASE_SPTR( DummyHandle );
CGlobalValue::GetInstance().UpdateProgress( (int)(fPer * (i+1)) );
}
EternityEngine::SaveAni( MergeHandle, dlg.GetPathName() );
SAFE_RELEASE_SPTR( MergeHandle );
// ±âÁ¸¿¡ ÀÖ´ø°Íµé ÀüºÎ ³¯¸®±¸ ¸ÓÁöµÈ°Í ·Îµù
fPer = 100 / (float)szVecFileList.size();
for( DWORD i=0; i<hVecItemList.size(); i++ ) {
CGlobalValue::GetInstance().RemoveObjectFromTreeID( hVecItemList[i] );
CGlobalValue::GetInstance().UpdateProgress( (int)(fPer * (i+1)) );
}
// ºÎ¸ð°¡ ¸¹¾ÒÀ» °æ¿ì¿£ ¸ÓÁö½ÃŲ °ÍµéÀ» ÀüºÎ °¡Ä¡ ³Ö¾îÁØ´Ù.
fPer = 100 / (float)szVecParentList.size();
for( DWORD i=0; i<szVecParentList.size(); i++ ) {
char szTemp[512];
_GetFullFileName( szTemp, _countof(szTemp), dlg.GetPathName() );
CObjectBase *pBase = new CObjectAnimation;
if( ((CObjectAnimation*)pBase)->LoadAnimation( dlg.GetPathName() ) == false ) {
SAFE_DELETE( pBase );
}
else
CGlobalValue::GetInstance().AddObject( hVecParentItemList[i], pBase );
CGlobalValue::GetInstance().UpdateProgress( (int)(fPer * (i+1)) );
}
CGlobalValue::GetInstance().UpdateProgress( 0 );
CEtResource::FlushWaitDelete();
}
void CWorkspacePaneView::OnCommonRemove()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CGlobalValue::GetInstance().RemoveObjectFromTreeID( hti );
}
}
void CWorkspacePaneView::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
RefreshSelectInfo();
*pResult = 0;
}
LRESULT CWorkspacePaneView::OnCheckItem( WPARAM wParam, LPARAM lParam )
{
HTREEITEM hti = (HTREEITEM)wParam;
CObjectBase *pBase = CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
pBase->Show( lParam == 1 );
return S_OK;
}
void CWorkspacePaneView::RefreshSelectInfo()
{
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CObjectBase *pBase = CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
if( pBase ) pBase->SetFocus( false );
}
CGlobalValue::GetInstance().SetControlObject( NULL );
CalcSelectItemList();
p = m_SelectItemList.GetHeadPosition();
while(p) {
hti = m_SelectItemList.GetNext( p );
CObjectBase *pBase = CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
if( pBase ) pBase->SetFocus( true );
}
int nCount = (int)m_SelectItemList.GetCount();
if( nCount == 0 ) {
}
else if( nCount > 1 ) {
// ¿©·¯°Ô °ñ¶óÁú °æ¿ì Properties °¡´ÉÇÑ °æ¿ì Ã¼Å©ÇØ¼­ Enable, Disable ÇØÁà¾ß Çϴµ¥.. À½.. Áö±ÝÀº ¾ÈµÚ¾ß~
// Submesh - ½Ã¸àƽ °°Àº °Íµé¸¸ ¸ð¾Æ¼­ ÆíÁý °¡´ÉÇϰÔ.. Ä®¶ó°ªÁ¤µµ
// Light - °°Àº Á¾·ùÀÇ ¶óÀÌÆ®µé¸¸ - Ä®¶ó°ªÁ¤µµ
CWnd *pWnd = GetPaneWnd( PROP_SHADER_PANE );
pWnd->SendMessage( UM_SHADERPROP_REFRESH );
pWnd = GetPaneWnd( ANI_PANE );
pWnd->SendMessage( UM_ANICONTROL_REFRESH );
((CMainFrame*)AfxGetMainWnd())->SetFocus( PROP_SHADER_PANE );
}
else {
HTREEITEM hti = m_SelectItemList.GetHead();
CString szName = m_TreeCtrl.GetItemText( m_SelectItemList.GetHead() );
CObjectBase *pBase = CGlobalValue::GetInstance().GetObjectFromTreeID( hti );
CGlobalValue::GetInstance().SetControlObject( pBase );
CWnd *pWnd;
switch( pBase->GetType() ) {
case CObjectBase::SKIN:
case CObjectBase::SUBMESH:
case CObjectBase::LIGHTFOLDER:
case CObjectBase::LIGHTDIR:
case CObjectBase::LIGHTPOINT:
case CObjectBase::LIGHTSPOT:
case CObjectBase::SCENE:
pWnd = GetPaneWnd( PROP_SHADER_PANE );
pWnd->SendMessage( UM_SHADERPROP_REFRESH, (WPARAM)pBase );
pWnd = GetPaneWnd( ANI_PANE );
pWnd->SendMessage( UM_ANICONTROL_REFRESH );
((CMainFrame*)AfxGetMainWnd())->SetFocus( PROP_SHADER_PANE );
break;
case CObjectBase::ANIMATION:
pWnd = GetPaneWnd( PROP_SHADER_PANE );
pWnd->SendMessage( UM_SHADERPROP_REFRESH );
pWnd = GetPaneWnd( ANI_PANE );
pWnd->SendMessage( UM_ANICONTROL_REFRESH, (WPARAM)pBase );
((CMainFrame*)AfxGetMainWnd())->SetFocus( ANI_PANE );
break;
default:
pWnd = GetPaneWnd( PROP_SHADER_PANE );
pWnd->SendMessage( UM_SHADERPROP_REFRESH );
pWnd = GetPaneWnd( ANI_PANE );
pWnd->SendMessage( UM_ANICONTROL_REFRESH );
((CMainFrame*)AfxGetMainWnd())->SetFocus( PROP_SHADER_PANE );
break;
}
}
}
LRESULT CWorkspacePaneView::OnGetTreeCtrl( WPARAM wParam, LPARAM lParam )
{
CTreeCtrl *pCtrl = (CTreeCtrl *)wParam;
pCtrl = &m_TreeCtrl;
return S_OK;
}
void CWorkspacePaneView::OnLightAddDir()
{
HTREEITEM hti = m_SelectItemList.GetHead();
CObjectBase *pBase = new CObjectLightDir;
CGlobalValue::GetInstance().AddObject( hti, pBase );
}
void CWorkspacePaneView::OnLightAddPoint()
{
HTREEITEM hti = m_SelectItemList.GetHead();
CObjectBase *pBase = new CObjectLightPoint;
CGlobalValue::GetInstance().AddObject( hti, pBase );
}
void CWorkspacePaneView::OnLightAddSpot()
{
HTREEITEM hti = m_SelectItemList.GetHead();
CObjectBase *pBase = new CObjectLightSpot;
CGlobalValue::GetInstance().AddObject( hti, pBase );
}
void CWorkspacePaneView::OnLightRemove()
{
// TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CGlobalValue::GetInstance().RemoveObjectFromTreeID( hti );
}
}