#include "StdAfx.h" #include #include "cwxWholeResTreePanel.h" #include #include "ToolData.h" #include "RTCutSceneMakerFrame.h" #include "CommandSet.h" #include "cwxAddActorDlg.h" #include "EternityEngine.h" #include "Timer.h" #include "RTCutSceneRenderer.h" #include "LuaDelegate.h" #include "DnCutSceneActor.h" //const wxChar* ROOT_RESOURCE_FOLDER = wxT("./Resource"); //const wxChar* ROOT_RESOURCE_FOLDER = wxT("D:/MyWork/RealTime Cut Scene Maker/Resource"); BEGIN_EVENT_TABLE( cwxWholeResTreePanel, wxPanel ) EVT_BUTTON( BTN_REGISTER_RESOURCE_ID, cwxWholeResTreePanel::OnBtnRegisterRes ) EVT_TREE_SEL_CHANGED( WHOLE_RESOURCE_TREE_ID, cwxWholeResTreePanel::OnTreeSelChanged ) END_EVENT_TABLE() cwxWholeResTreePanel::cwxWholeResTreePanel( wxWindow* pParent, wxWindowID id ) : wxPanel( pParent, id ), m_pTopSizer( NULL ), m_pTreeCtrl( NULL ), m_pBtnRegister( NULL ) { m_pTopSizer = new wxBoxSizer( wxVERTICAL ); m_pTreeCtrl = new wxTreeCtrl( this, WHOLE_RESOURCE_TREE_ID, wxDefaultPosition, wxDefaultSize ); m_pTopSizer->Add( m_pTreeCtrl, 1, wxALL|wxALIGN_CENTER|wxEXPAND, 2 ); m_pBtnRegister = new wxButton( this, BTN_REGISTER_RESOURCE_ID, wxString(wxT("Register to scene")), wxDefaultPosition, wxSize(200, 40) ); m_pTopSizer->Add( m_pBtnRegister, 0, wxALL|wxALIGN_CENTER|wxEXPAND, 4 ); m_TreeRootID = m_pTreeCtrl->AddRoot( wxT("Root") ); //wxTreeItemIcon_Normal, // not selected, not expanded //wxTreeItemIcon_Selected, // selected, not expanded //wxTreeItemIcon_Expanded, // not selected, expanded //wxTreeItemIcon_SelectedExpanded, // selected, expanded wxImageList *pImageList = new wxImageList( 16, 16 ); pImageList->Add( wxBITMAP(folder), wxColour(0xff00ff00) ); pImageList->Add( wxBITMAP(folder_open), wxColour(0xff00ff00) ); pImageList->Add( wxBITMAP(object), wxColour(0xff00ff00) ); pImageList->Add( wxBITMAP(object_select), wxColour(0xff00ff00) ); m_pTreeCtrl->AssignImageList( pImageList ); SetSizer( m_pTopSizer ); m_pTopSizer->Fit( this ); m_pTopSizer->SetSizeHints( this ); _BuildResourceTree(); // ÈÙ À̺¥Æ®°¡ Æ®¸®¿¡°Ô ¸ÔÁö ¾Êµµ·Ï ÇÑ´Ù. static_cast(TOOL_DATA.GetMainFrame())->ConnectMouseWheelEventToRenderPanel( m_pTreeCtrl ); m_pTreeCtrl->Expand( m_TreeRootID ); } cwxWholeResTreePanel::~cwxWholeResTreePanel(void) { } void cwxWholeResTreePanel::_BuildResourceTree( void ) { deque dqFolderToSearch; wxBusyCursor Busy; // Çã¶ôµÈ ¸ÞÀÎ Æú´õ ¹× È®ÀåÀÚ À̿ܿ¡´Â Æ®¸®¿¡ Ãß°¡ÇÏÁö ¾Ê´Â´Ù. (¼Ò¹®ÀÚ ±âÁØ) m_setAllowMainFolder.insert( wxString(wxT("char")) ); m_setAllowMainFolder.insert( wxString(wxT("mapdata")) ); m_setAllowMainFolder.insert( wxString(wxT("sound")) ); m_setAllowMainFolder.insert( wxString(wxT("particle")) ); m_setAllowMainFolder.insert( wxString(wxT("weapon")) ); m_setAllowFileExt.insert( wxString(wxT("act")) ); m_setAllowFileExt.insert( wxString(wxT("skn")) ); m_setAllowFileExt.insert( wxString(wxT("ani")) ); m_setAllowFileExt.insert( wxString(wxT("mp3")) ); m_setAllowFileExt.insert( wxString(wxT("wav")) ); m_setAllowFileExt.insert( wxString(wxT("env")) ); m_setAllowFileExt.insert( wxString(wxT("ptc")) ); m_setAllowFileExt.insert( wxString(wxT("eff")) ); const char* pResPath = LUA_DELEGATE.GetString( "resource_path" ); const char* pMapPath = LUA_DELEGATE.GetString( "mapdata_path" ); wxCSConv MBConv( wxFONTENCODING_CP949 ); wxChar caWBuf[ 256 ]; ZeroMemory( caWBuf, sizeof(caWBuf) ); MBConv.MB2WC( caWBuf, pResPath, 256 ); wxString strResourcePath( caWBuf ); ZeroMemory( caWBuf, sizeof(caWBuf) ); MBConv.MB2WC( caWBuf, pMapPath, 256 ); wxString strMapDataPath( caWBuf ); dqFolderToSearch.push_back( strResourcePath ); dqFolderToSearch.push_back( strMapDataPath ); while( !dqFolderToSearch.empty() ) { wxString strNowSearchFolder = dqFolderToSearch.front(); dqFolderToSearch.pop_front(); strNowSearchFolder.append( wxT("/*.*") ); wxString strFindedFilePath = wxFindFirstFile( strNowSearchFolder.c_str(), wxFILE|wxDIR ); while( !strFindedFilePath.empty() ) { // Æú´õÀÎ °æ¿ì if( wxDirExists( strFindedFilePath.c_str() ) ) { wxString strName; wxSplitPath( strFindedFilePath.c_str(), NULL, &strName, NULL ); wxString strLower = strName.Lower(); // ÇöÀç Æú´õ À̸§ÀÌ ¹«½Ã ÆÐÅϰú ºÎÇÕÇϴ°¡. ±×·¸´Ù¸é ÆÐ½º. set::iterator iter = m_setIgnoreFolder.find( strLower ); if( m_setIgnoreFolder.end() != iter ) { strFindedFilePath = wxFindNextFile(); continue; } dqFolderToSearch.push_back( strFindedFilePath ); } else // ÆÄÀÏÀÎ °æ¿ì { wxString strCapitalName; wxString strExt; wxSplitPath( strFindedFilePath.c_str(), NULL, &strCapitalName, &strExt ); wxString strFileName = strCapitalName+wxT(".")+strExt; wxString strLowerExt = strExt.Lower(); set::iterator iter = m_setAllowFileExt.find( strLowerExt ); if( m_setAllowFileExt.end() != iter ) { strFileName.MakeLower(); TOOL_DATA.SetFullPath( strFileName.c_str(), strFindedFilePath.c_str() ); // ¾×Å͵éÀÎ °æ¿ì¿£ ´ë¹®ÀÚ À̸§¸¸À¸·Î ۸¦ ÇÑ ¹ø ´õ ¹Ú¾ÆÁØ´Ù. if( *iter == wxT("act") ) { strCapitalName.MakeUpper(); TOOL_DATA.SetFullPath( strCapitalName.c_str(), strFindedFilePath.c_str() ); } } } strFindedFilePath = wxFindNextFile(); } } m_mapTreeIdKind.insert( make_pair(m_TreeRootID, TREE_ROOT) ); m_pTreeCtrl->SetItemImage( m_TreeRootID, 0, wxTreeItemIcon_Normal ); m_pTreeCtrl->SetItemImage( m_TreeRootID, 1, wxTreeItemIcon_Expanded ); // ½ÇÁ¦·Î EXT ÆÄÀÏ ±âÁØÀ¸·Î Æ®¸®¿¡ Ãß°¡ÇÑ´Ù. // Áß¿ä! ¹Ýµå½Ã ÆÄÀÏ À̸§ÀÌ EXT ÆÄÀÏ¿¡ ÀÖ´Â À̸§°ú °°´Ù´Â ÀüÁ¦°¡ ÀÖ¾î¾ß ³ªÁß¿¡ Ç® ÆÐ½º°¡ Á¦´ë·Î ¾ò¾îÁø´Ù. // Ç® ÆÐ½º´Â Æú´õ¸¦ ±Ü¾î¼­ °®°í Àֱ⠶§¹®ÀÌ´Ù. wxTreeItemId ActorTreeId = m_pTreeCtrl->AppendItem( m_TreeRootID, wxT("Actor") ); m_pTreeCtrl->SetItemImage( ActorTreeId, 0, wxTreeItemIcon_Normal ); m_pTreeCtrl->SetItemImage( ActorTreeId, 1, wxTreeItemIcon_Expanded ); m_mapTreeIdKind.insert( make_pair(ActorTreeId, TREE_ACTOR_SET) ); int iNumActorRes = TOOL_DATA.GetNumActorResInfo(); for( int iActor = 0; iActor < iNumActorRes; ++iActor ) { const S_ACTOR_RES_INFO* pActorResInfo = TOOL_DATA.GetActorResInfoByIndex( iActor ); wxTreeItemId id = m_pTreeCtrl->AppendItem( ActorTreeId, pActorResInfo->strActorName ); m_pTreeCtrl->SetItemImage( id, 2, wxTreeItemIcon_Normal ); m_pTreeCtrl->SetItemImage( id, 3, wxTreeItemIcon_Selected ); TOOL_DATA.SetResourceType( pActorResInfo->strActorName.c_str(), CDnCutSceneData::RT_RES_ACTOR ); } wxTreeItemId MapTreeId = m_pTreeCtrl->AppendItem( m_TreeRootID, wxT("Map") ); m_pTreeCtrl->SetItemImage( MapTreeId, 0, wxTreeItemIcon_Normal ); m_pTreeCtrl->SetItemImage( MapTreeId, 1, wxTreeItemIcon_Expanded ); m_mapTreeIdKind.insert( make_pair(MapTreeId, TREE_MAP_SET) ); int iNumMapRes = TOOL_DATA.GetNumMapResName(); for( int iMap = 0; iMap < iNumMapRes; ++iMap ) { wxTreeItemId id = m_pTreeCtrl->AppendItem( MapTreeId, TOOL_DATA.GetMapResNameByIndex( iMap ) ); m_pTreeCtrl->SetItemImage( id, 2, wxTreeItemIcon_Normal ); m_pTreeCtrl->SetItemImage( id, 3, wxTreeItemIcon_Selected ); TOOL_DATA.SetResourceType( TOOL_DATA.GetMapResNameByIndex( iMap ), CDnCutSceneData::RT_RES_MAP ); } m_pTreeCtrl->SortChildren( ActorTreeId ); m_pTreeCtrl->SortChildren( MapTreeId ); } void cwxWholeResTreePanel::OnBtnRegisterRes( wxCommandEvent& ButtonEvent ) { // ¸®¼Ò½º Æ®¸®¿¡¼­ ¼±ÅÃµÈ ¹®ÀÚ¿­À» ¹Þ¾Æ¿ÀÀÚ wxTreeItemId SelectedNode = m_pTreeCtrl->GetSelection(); EtVector3 vPos; if( SelectedNode.IsOk() ) { wxString strSelected = m_pTreeCtrl->GetItemText( SelectedNode ); int iResKind = TOOL_DATA.GetResourceKind( strSelected.c_str() ); wxString strFinalResName; switch( iResKind ) { case CDnCutSceneData::RT_RES_MAP: { strFinalResName = strSelected; vPos.x = 0.0f; vPos.y = 0.0f; vPos.z = 0.0f; } break; case CDnCutSceneData::RT_RES_ACTOR: { // ÀÌ ÄÆ½Å¿¡¼­ ¹ÌÁö¿ø ¾×ÅͶó¸é ÆÐ½º. DNTableFileFormat* pActorTable = TOOL_DATA.GetActorTable(); DNTableFileFormat* pSox = NULL; const S_ACTOR_RES_INFO* pActorResInfo = TOOL_DATA.GetActorResInfoByName( strSelected ); int iActorTypeInTable = pActorTable->GetFieldFromLablePtr( pActorResInfo->iTableID, "_Class" )->GetInteger(); const SceneInfo* pSceneInfo = TOOL_DATA.GetSceneInfo(); if( pSceneInfo->bAcademicNotSupported && CDnCutSceneActor::ACADEMIC == iActorTypeInTable ) { // ¾ÆÄ«µ¥¹Í ij¸¯ÅÍ´Â Áö¿øÇÏÁö ¾ÊÀ½. ÆÐ½º. wxMessageBox( wxT("¾ÆÄ«µ¥¹Í ij¸¯ÅÍ´Â ÀÌ ÄÆ½Å¿¡¼­ Áö¿øÇÏÁö ¾Êµµ·Ï ¼ÂÆÃµÇ¾îÀÖ½À´Ï´Ù. È®ÀÎÇØ Áֽñ⠹ٶø´Ï´Ù."), wxT("¾ÆÄ«µ¥¹Í ¹ÌÁö¿ø"), wxOK|wxCENTRE|wxICON_INFORMATION, TOOL_DATA.GetMainFrame() ); return; } wxString strInputted; while( true ) { // À̸§¿¡ °ø¹éÀÌ ÀÖÀ¸¸é ¾ÈµÈ´Ù. if( wxString::npos != strSelected.find_first_of( wxT(" ") ) ) { wxMessageBox( wxT("¾×ÅÍ À̸§¿¡ °ø¹éÀÌ ÀÖÀ¸¸é ¾ÈµË´Ï´Ù.\n¾×ÅÍ Å×À̺íÀÇ _StaticName ÀÇ À̸§À» º¯°æÇØÁÖ¼¼¿ä."), wxT("Can't Register Actor!"), wxICON_ERROR | wxOK, this ); return; } cwxAddActorDlg AddActorDlg( this, -1, wxT("Input actor name") ); int iResult = AddActorDlg.ShowModal(); if( wxID_OK == iResult ) { AddActorDlg.GetInputtedString( strInputted ); if( strInputted != wxT("") ) { strFinalResName.Printf( wxT("%s_%s"), strSelected, strInputted ); // À̸§¿¡ °ø¹éÀÌ ÀÖÀ¸¸é ¾ÈµÈ´Ù. if( wxString::npos != strFinalResName.find_first_of( wxT(" ") ) ) { wxMessageBox( wxT("¾×ÅÍ À̸§¿¡ °ø¹éÀÌ ÀÖÀ¸¸é ¾ÈµË´Ï´Ù.\n´Ù½Ã ÀÔ·ÂÇØ ÁÖ¼¼¿ä."), wxT("Can't Register Actor!"), wxICON_ERROR | wxOK, this ); continue; } // Áߺ¹µÈ À̸§ÀÌ ¾Æ´Ñ°¡ °Ë»ç if( TOOL_DATA.IsRegResource(strFinalResName.c_str()) ) { wxMessageBox( wxT("Actor name is duplicated."), wxT("Can't Register Actor!"), wxICON_ERROR | wxOK, this ); continue; } CRTCutSceneRenderer* pRenderer = TOOL_DATA.GetRenderer(); pRenderer->GetHeightPos( vPos ); break; } } else if( wxID_CANCEL == iResult ) return; } } break; //case CDnCutSceneData::RT_RES_MAX_CAMERA: // // ¾ÆÁ÷ Ä«¸Þ¶ó¿¡¼± µüÈ÷ ó¸®ÇÒ °ÍÀÌ ¾ø´Ù. // strFinalResName = strSelected; // break; } // for testing.. // ÀÏ´Ü 0, 0, 0 À¸·Î Çϰí ÃßÈÄ¿¡ ÇÒ ¼ö ¾øÀÌ ·»´õ ÆÐ³Î¿¡°Ô ÀûÇÕÇÑ Y À§Ä¡¸¦ ¾ò¾î¿À´Â ¹æ¹ý¹Û¿¡ ¾øÀ»µí. CRegisterResCmd Command( CToolData::GetInstancePtr(), strFinalResName.c_str(), iResKind, vPos, 0.0f ); TOOL_DATA.RunCommand( &Command ); } } void cwxWholeResTreePanel::_UpdateRegResourceBtn( void ) { wxTreeItemId SelectedNode = m_pTreeCtrl->GetSelection(); if( SelectedNode.IsOk() ) { wxString strSelected = m_pTreeCtrl->GetItemText( SelectedNode ); bool bResult = !TOOL_DATA.IsRegResource( strSelected.c_str() ) && strSelected != wxT("Root") && strSelected != wxT("Actor") && strSelected != wxT("Map"); m_pBtnRegister->Enable( bResult ); } } void cwxWholeResTreePanel::OnTreeSelChanged( wxTreeEvent& TreeEvent ) { _UpdateRegResourceBtn(); wxTreeItemId id = TreeEvent.GetItem(); map::iterator iter = m_mapTreeIdKind.find( id ); if( m_mapTreeIdKind.end() != iter ) { switch( iter->second ) { case TREE_ROOT: break; case TREE_ACTOR_SET: break; case TREE_ACTOR: break; case TREE_MAP_SET: break; case TREE_MAP: break; } } } void cwxWholeResTreePanel::CommandPerformed( ICommand* pCommand ) { switch( pCommand->GetTypeID() ) { case CMD_REGISTER_RES: case CMD_UNREGISTER_RES: _UpdateRegResourceBtn(); break; } }