793 lines
25 KiB
C++
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 );
|
|
}
|
|
}
|