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

364 lines
No EOL
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}