DragonNest/Client/EtCutSceneTool/cwxWholeResTreePanel.cpp

364 lines
12 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include <wx/wx.h>
#include "cwxWholeResTreePanel.h"
#include <wx/FileFn.h>
#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();
// <20><> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> Ʈ<><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>.
static_cast<CRTCutSceneMakerFrame*>(TOOL_DATA.GetMainFrame())->ConnectMouseWheelEventToRenderPanel( m_pTreeCtrl );
m_pTreeCtrl->Expand( m_TreeRootID );
}
cwxWholeResTreePanel::~cwxWholeResTreePanel(void)
{
}
void cwxWholeResTreePanel::_BuildResourceTree( void )
{
deque<wxString> dqFolderToSearch;
wxBusyCursor Busy;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Ȯ<><C8AE><EFBFBD><EFBFBD> <20>̿ܿ<CCBF><DCBF><EFBFBD> Ʈ<><C6AE><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. (<28>ҹ<EFBFBD><D2B9><EFBFBD> <20><><EFBFBD><EFBFBD>)
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() )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( wxDirExists( strFindedFilePath.c_str() ) )
{
wxString strName;
wxSplitPath( strFindedFilePath.c_str(), NULL, &strName, NULL );
wxString strLower = strName.Lower();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4>. <20>׷<EFBFBD><D7B7>ٸ<EFBFBD> <20>н<EFBFBD>.
set<wxString>::iterator iter = m_setIgnoreFolder.find( strLower );
if( m_setIgnoreFolder.end() != iter )
{
strFindedFilePath = wxFindNextFile();
continue;
}
dqFolderToSearch.push_back( strFindedFilePath );
}
else
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
wxString strCapitalName;
wxString strExt;
wxSplitPath( strFindedFilePath.c_str(), NULL, &strCapitalName, &strExt );
wxString strFileName = strCapitalName+wxT(".")+strExt;
wxString strLowerExt = strExt.Lower();
set<wxString>::iterator iter = m_setAllowFileExt.find( strLowerExt );
if( m_setAllowFileExt.end() != iter )
{
strFileName.MakeLower();
TOOL_DATA.SetFullPath( strFileName.c_str(), strFindedFilePath.c_str() );
// <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><20><EFBFBD><EBB9AE> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<><C5B0> <20><> <20><> <20><> <20>ھ<EFBFBD><DABE>ش<EFBFBD>.
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 );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EXT <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ʈ<><C6AE><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
// <20>߿<EFBFBD>! <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> EXT <20><><EFBFBD>Ͽ<EFBFBD> <20>ִ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD>߿<EFBFBD> Ǯ <20>н<EFBFBD><D0BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// Ǯ <20>н<EFBFBD><D0BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ <20><><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
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 )
{
// <20><><EFBFBD>ҽ<EFBFBD> Ʈ<><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>޾ƿ<DEBE><C6BF><EFBFBD>
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:
{
// <20><> <20>ƽſ<C6BD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD> <20>н<EFBFBD>.
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 )
{
// <20><>ī<EFBFBD><C4AB><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>н<EFBFBD>.
wxMessageBox( wxT("<EFBFBD><EFBFBD>ī<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>ʹ<EFBFBD> <20><> <20>ƽſ<C6BD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD>õǾ<C3B5><C7BE>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. Ȯ<><C8AE><EFBFBD><EFBFBD> <20>ֽñ<D6BD> <20>ٶ<EFBFBD><D9B6>ϴ<EFBFBD>."), wxT("<EFBFBD><EFBFBD>ī<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),
wxOK|wxCENTRE|wxICON_INFORMATION, TOOL_DATA.GetMainFrame() );
return;
}
wxString strInputted;
while( true )
{
// <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
if( wxString::npos != strSelected.find_first_of( wxT(" ") ) )
{
wxMessageBox( wxT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ˴ϴ<CBB4>.\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> _StaticName <20><> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>."), 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 );
// <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
if( wxString::npos != strFinalResName.find_first_of( wxT(" ") ) )
{
wxMessageBox( wxT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ˴ϴ<CBB4>.\n<EFBFBD>ٽ<EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD>."), wxT("Can't Register Actor!"), wxICON_ERROR | wxOK, this );
continue;
}
// <20>ߺ<EFBFBD><DFBA><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ƴѰ<C6B4> <20>˻<EFBFBD>
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:
// // <20><><EFBFBD><EFBFBD> ī<>޶󿡼<DEB6> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// strFinalResName = strSelected;
// break;
}
// for testing..
// <20>ϴ<EFBFBD> 0, 0, 0 <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> <20><><EFBFBD>Ŀ<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>гο<D0B3><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Y <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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<wxTreeItemId, int>::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;
}
}