DragonNest/Client/EtWorldPainter/EnviPaneView.cpp

498 lines
15 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// EnviPaneView.cpp : implementation file
//
#include "stdafx.h"
#include "EtWorldPainter.h"
#include "EnviPaneView.h"
#include "UserMessage.h"
#include "EnviControl.h"
#include "CreateEnviDlg.h"
#include "FileServer.h"
#include "EnviBasePaneView.h"
#include "EnviLightPaneView.h"
#include "TEtWorld.h"
#include "TEtWorldSector.h"
#include "EnviLightBase.h"
// CEnviPaneView
IMPLEMENT_DYNCREATE(CEnviPaneView, CFormView)
CEnviPaneView::CEnviPaneView()
: CFormView(CEnviPaneView::IDD)
{
m_bActivate = false;
m_pBaseView = NULL;
m_pLightView = NULL;
}
CEnviPaneView::~CEnviPaneView()
{
}
void CEnviPaneView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CEnviPaneView, CFormView)
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_MESSAGE( UM_REFRESH_PANE_VIEW, OnRefresh )
ON_WM_CREATE()
ON_COMMAND(ID_ENVI_NEW, &CEnviPaneView::OnEnviNew)
ON_COMMAND(ID_ENVI_SAVEAS, &CEnviPaneView::OnEnviSaveas)
ON_COMMAND(ID_ENVI_RELOAD, &CEnviPaneView::OnEnviReload)
ON_COMMAND(ID_ENVI_DELETE, &CEnviPaneView::OnEnviDelete)
ON_COMMAND(ID_ENVI_LOADLIST, &CEnviPaneView::OnEnviLoadlist)
ON_MESSAGE( UM_PROPERTY_PANE_SET_MODIFY, OnSetModify )
ON_COMMAND(ID_ENVI_BAKELIGHTMAP, &CEnviPaneView::OnEnviBakelightmap)
ON_UPDATE_COMMAND_UI(ID_ENVI_BAKELIGHTMAP, &CEnviPaneView::OnUpdateEnviBakelightmap)
ON_UPDATE_COMMAND_UI(ID_ENVI_SAVEAS, &CEnviPaneView::OnUpdateEnviSaveas)
ON_UPDATE_COMMAND_UI(ID_ENVI_RELOAD, &CEnviPaneView::OnUpdateEnviReload)
ON_UPDATE_COMMAND_UI(ID_ENVI_DELETE, &CEnviPaneView::OnUpdateEnviDelete)
ON_MESSAGE( UM_SOUNDPANE_DROPMOVEITEM, OnSoundPaneDropMoveItem )
ON_MESSAGE( UM_SOUNDPANE_DROPITEM, OnSoundPaneDropItem )
END_MESSAGE_MAP()
// CEnviPaneView diagnostics
#ifdef _DEBUG
void CEnviPaneView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CEnviPaneView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
// CEnviPaneView message handlers
void CEnviPaneView::OnInitialUpdate()
{
__super::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
if( m_bActivate == true ) return;
m_bActivate = true;
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_ENVI_LOADLIST, TRUE, FALSE );
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
pCombo->SetWidth( 160 );
pCombo->SetCurSel(0);
}
int CEnviPaneView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (__super::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_wndToolBar.CreateToolBar(WS_VISIBLE|WS_CHILD|CBRS_TOOLTIPS, this);
m_wndToolBar.LoadToolBar(IDR_ENVI_TOOLBAR);
m_wndToolBar.GetControls()->SetControlType( 4, xtpControlComboBox );
m_wndToolBar.GetControls()->SetControlType( 5, xtpControlButton );
m_TabCtrl.Create(WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, CRect(0, 0, 0, 0), this, 1001);
m_TabCtrl.GetPaintManager()->m_bDisableLunaColors = TRUE;
m_TabCtrl.SetAppearance(xtpTabAppearanceStateButtons);
m_TabCtrl.GetPaintManager()->m_bHotTracking = TRUE;
m_TabCtrl.GetPaintManager()->m_bRotateImageOnVerticalDraw = TRUE;
m_TabCtrl.SetPosition( xtpTabPositionLeft );
CCreateContext cc;
ZeroMemory(&cc, sizeof(cc));
cc.m_pCurrentDoc = GetDocument();
m_pBaseView = (CEnviBasePaneView*)RUNTIME_CLASS(CEnviBasePaneView)->CreateObject();
((CWnd *)m_pBaseView)->Create( NULL, NULL, WS_CHILD, CRect( 0, 0, 0, 0 ), &m_TabCtrl, 2005, &cc );
m_pLightView = (CEnviLightPaneView*)RUNTIME_CLASS(CEnviLightPaneView)->CreateObject();
((CWnd *)m_pLightView)->Create( NULL, NULL, WS_CHILD, CRect( 0, 0, 0, 0 ), &m_TabCtrl, 2006, &cc );
m_TabCtrl.InsertItem( 0, _T("Base"), m_pBaseView->m_hWnd );
m_TabCtrl.InsertItem( 1, _T("Light"), m_pLightView->m_hWnd );
return 0;
}
void CEnviPaneView::OnSize(UINT nType, int cx, int cy)
{
__super::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
int nTop = 0;
if( m_wndToolBar.GetSafeHwnd() )
{
CSize sz = m_wndToolBar.CalcDockingLayout(cx, LM_HORZDOCK|LM_HORZ | LM_COMMIT);
m_wndToolBar.MoveWindow(0, 0, cx, sz.cy);
m_wndToolBar.Invalidate(FALSE);
nTop += sz.cy;
}
if( ::IsWindow(m_TabCtrl.m_hWnd) ) {
m_TabCtrl.SetWindowPos( NULL, 0, nTop, cx, cy - nTop, SWP_FRAMECHANGED );
}
}
BOOL CEnviPaneView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
BOOL CEnviPaneView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
if( (UINT)wParam == 1001 ) {
NMHDR* pNMHDR = (NMHDR*)lParam;
switch(pNMHDR->code)
{
case TCN_SELCHANGING:
break;
case TCN_SELCHANGE:
if( m_TabCtrl.GetCurSel() == 0 ) {
m_pBaseView->SendMessage( UM_REFRESH_PANE_VIEW );
CEnviLightBase::s_pFocus = NULL;
}
else {
m_pLightView->SendMessage( UM_REFRESH_PANE_VIEW );
}
CGlobalValue::GetInstance().RefreshRender();
break;
}
}
return CFormView::OnNotify(wParam, lParam, pResult);
}
LRESULT CEnviPaneView::OnRefresh( WPARAM wParam, LPARAM lParam )
{
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_ENVI_LOADLIST, TRUE, FALSE );
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
pCombo->ResetContent();
CEnviElement *pActive = CEnviControl::GetInstance().GetActiveElement();
for( DWORD i=0; i<CEnviControl::GetInstance().GetCount(); i++ ) {
CEnviElement *pElement = CEnviControl::GetInstance().GetElement(i);
// pElement->Save();
pCombo->InsertString( pCombo->GetCount(), pElement->GetInfo().GetName() );
if( pActive ) {
if( strcmp( pActive->GetInfo().GetName(), pElement->GetInfo().GetName() ) == NULL ) {
pCombo->SetCurSel(i);
}
}
}
if( m_TabCtrl.GetCurSel() == 0 )
m_pBaseView->SendMessage( UM_REFRESH_PANE_VIEW, wParam, lParam );
else m_pLightView->SendMessage( UM_REFRESH_PANE_VIEW, wParam, lParam );
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector != -1 ) {
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlButton, ID_ENVI_BAKELIGHTMAP, TRUE, FALSE );
CXTPControlCheckBox* pCheck = (CXTPControlCheckBox*)pControl;
pCheck->SetChecked( FALSE );
pSector->EnableLightmap( false );
}
return S_OK;
}
void CEnviPaneView::OnEnviNew()
{
// TODO: Add your command handler code here
CCreateEnviDlg Dlg(this);
if( Dlg.DoModal() != IDOK ) return;
CEnviControl::GetInstance().CreateElement( Dlg.m_szName, Dlg.m_szCopyTo );
CEnviControl::GetInstance().ActivateElement( Dlg.m_szName );
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_ENVI_LOADLIST, TRUE, FALSE );
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
pCombo->SetCurSel( pCombo->GetCount() - 1 );
SendMessage( UM_REFRESH_PANE_VIEW );
}
void CEnviPaneView::OnEnviSaveas()
{
// TODO: Add your command handler code here
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_ENVI_LOADLIST, TRUE, FALSE );
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
CString szStr;
pCombo->GetLBText( pCombo->GetCurSel(), szStr );
CEnviControl::GetInstance().SaveElement( szStr );
}
void CEnviPaneView::OnEnviDelete()
{
// TODO: Add your command handler code here
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_ENVI_LOADLIST, TRUE, FALSE );
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
CString szStr;
pCombo->GetLBText( pCombo->GetCurSel(), szStr );
pCombo->DeleteItem( pCombo->GetCurSel() );
CEnviControl::GetInstance().ActivateElement( "Edit Set" );
pCombo->SetCurSel(0);
// <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>. <20><><EFBFBD>߿<EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD>
CString szFullName;
szFullName.Format( "%s\\%s", GetCurrentDir(), szStr );
DeleteFile( szFullName );
CEnviControl::GetInstance().RemoveElement( szStr );
}
void CEnviPaneView::OnEnviReload()
{
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_ENVI_LOADLIST, TRUE, FALSE );
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
CString szStr;
pCombo->GetLBText( pCombo->GetCurSel(), szStr );
CEnviControl::GetInstance().LoadElement( szStr );
CEnviControl::GetInstance().ActivateElement( szStr );
SendMessage( UM_REFRESH_PANE_VIEW );
}
void CEnviPaneView::OnEnviLoadlist()
{
// TODO: Add your command handler code here
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_ENVI_LOADLIST, TRUE, FALSE );
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
CString szStr;
pCombo->GetLBText( pCombo->GetCurSel(), szStr );
CEnviControl::GetInstance().ActivateElement( szStr );
SendMessage( UM_REFRESH_PANE_VIEW );
}
void CEnviPaneView::CopyAccompanimentFile( const char *szSkinName )
{
char szPathTemp[512] = {0,} ;
_GetPath( szPathTemp, _countof(szPathTemp), szSkinName );
szPathTemp[strlen(szPathTemp)-1] = 0;
// <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ°<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
if( _stricmp( szPathTemp, GetCurrentDir() ) == NULL ) return;
BOOL bExist = FALSE;
std::vector<std::string> szVecList;
FindFileListInDirectory( GetCurrentDir(), "*.*", szVecList, false, true );
char szTemp[2][512] = { 0, };
_GetFullFileName( szTemp[0], _countof(szTemp[0]), szSkinName );
for( DWORD i=0; i<szVecList.size(); i++ ) {
_GetFullFileName( szTemp[1], _countof(szTemp[1]), szVecList[i].c_str() );
if( _stricmp( szTemp[0], szTemp[1] ) == NULL ) {
bExist = TRUE;
break;
}
}
if( bExist == TRUE ) {
if( MessageBox( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD>ϵǾ<CFB5> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EEBEB5>?", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_YESNO ) == IDNO ) return;
}
std::vector<CString> szVecAccompanimentList;
if( CalcAccompanimentFile( szSkinName, szVecAccompanimentList ) == false ) {
MessageBox( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.", "Error", MB_OK );
return;
}
char szFileName[512] = { 0, };
CString szErrorFileName;
CString szErrorStr;
CString szFullName;
char cResult = 1;
for( DWORD m=0; m<szVecAccompanimentList.size(); m++ ) {
_GetFullFileName( szFileName, _countof(szFileName), szVecAccompanimentList[m] );
szFullName.Format( "%s\\%s", GetCurrentDir(), szFileName );
BOOL bResult;
if( m == 0 )
bResult = CopyFile( szVecAccompanimentList[m], szFullName, !bExist );
else bResult = CopyFile( szVecAccompanimentList[m], szFullName, TRUE );
if( bResult == false ) {
if( m == 0 ) {
cResult = -1;
MessageBox( "<EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!", "Error", MB_OK );
break;
}
else {
szErrorStr.Format( "<EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>.. \n\n %s\n\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?", szVecAccompanimentList[m] );
if( MessageBox( szErrorStr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_YESNO ) == IDYES ) {
bResult = CopyFile( szVecAccompanimentList[m], szFullName, FALSE );
}
if( bResult == false ) {
cResult = 0;
szErrorFileName += "\n ";
szErrorFileName += szVecAccompanimentList[m];
}
}
}
}
if( cResult == -1 ) return;
else if( cResult == 0 ) {
CString szErrorStr;
szErrorStr.Format( "<EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><20><><EFBFBD>߾<EFBFBD><DFBE><EFBFBD>\n%s", szErrorFileName );
MessageBox( szErrorStr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_OK );
}
if( bExist == TRUE ) return;
SetFileAttributes( szFullName, FILE_ATTRIBUTE_NORMAL );
}
bool CEnviPaneView::CalcAccompanimentFile( const char *szSkinName, std::vector<CString> &szVecList )
{
// <20>ڱ<EFBFBD><DAB1>ڽŵ<DABD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ADd
FILE *fp = NULL;
szVecList.push_back( szSkinName );
char szBuf[512] = { 0, };
char szExt[64] = { 0, };
CString szPath;
_GetPath( szBuf, _countof(szBuf), szSkinName );
_GetExt( szExt, _countof(szExt), szSkinName );
if( strcmp( szExt, "dds" ) == NULL ) return true;
szPath = szBuf;
// <20><>Ų<EFBFBD≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> ani <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
CString szAniName;
memset( szBuf, 0, sizeof(szBuf) );
_GetFileName( szBuf, _countof(szBuf), szSkinName );
szAniName.Format( "%s%s.ani", szPath, szBuf );
fopen_s( &fp, szAniName, "rb" );
if( fp ) {
szVecList.push_back( szAniName );
fclose(fp);
fp = NULL;
}
// <20><>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> msh,texture <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
EtObjectHandle Handle = EternityEngine::CreateStaticObject( szSkinName );
if( !Handle ) {
return false;
}
szVecList.push_back( szPath + Handle->GetMesh()->GetFileName() );
std::string szTempFullName;
for( int l=0; l<Handle->GetSubMeshCount(); l++ ) {
for( int m=0; m<Handle->GetEffectCount(l); m++ ) {
SCustomParam *pParam = Handle->GetCustomParam( l, m );
if( pParam->Type != EPT_TEX ) continue;
EtResourceHandle hResource = CEtResource::GetResource( pParam->nTextureIndex );
szTempFullName = szPath + hResource->GetFileName();
if( std::find( szVecList.begin(), szVecList.end(), szTempFullName.c_str() ) != szVecList.end() ) continue;
szVecList.push_back( szTempFullName.c_str() );
}
}
SAFE_RELEASE_SPTR( Handle );
return true;
}
CString CEnviPaneView::GetCurrentDir()
{
CString szFolder;
szFolder.Format( "%s\\Resource\\Envi", CFileServer::GetInstance().GetLocalWorkingFolder() );
return szFolder;
}
LRESULT CEnviPaneView::OnSetModify( WPARAM wParam, LPARAM lParam )
{
return m_pLightView->SendMessage( UM_PROPERTY_PANE_SET_MODIFY, wParam, lParam );
}
void CEnviPaneView::OnEnviBakelightmap()
{
// TODO: Add your command handler code here
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) return;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlButton, ID_ENVI_BAKELIGHTMAP, TRUE, FALSE );
CXTPControlCheckBox* pCheck = (CXTPControlCheckBox*)pControl;
BOOL bCheck = pCheck->GetChecked();
pCheck->SetChecked( !bCheck );
pSector->EnableLightmap( ( bCheck == TRUE ) ? false : true );
CGlobalValue::GetInstance().RefreshRender();
}
void CEnviPaneView::OnUpdateEnviBakelightmap(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL bEnable = TRUE;
if( !CGlobalValue::GetInstance().IsCheckOutMe() ) bEnable = FALSE;
if( CEnviControl::GetInstance().GetActiveElement() == NULL ) bEnable = FALSE;
else {
if( CEnviControl::GetInstance().GetActiveElement()->GetInfo().GetName() == "Edit Set" ) bEnable = FALSE;
if( CEnviControl::GetInstance().GetActiveElement()->GetInfo().GetLightCount() == 0 ) bEnable = FALSE;
}
pCmdUI->Enable( bEnable );
}
void CEnviPaneView::OnUpdateEnviReload(CCmdUI *pCmdUI)
{
BOOL bEnable = TRUE;
if( CEnviControl::GetInstance().GetActiveElement()->GetInfo().GetName() == "Edit Set" ) bEnable = FALSE;
pCmdUI->Enable( bEnable );
}
void CEnviPaneView::OnUpdateEnviSaveas(CCmdUI *pCmdUI)
{
BOOL bEnable = TRUE;
if( CEnviControl::GetInstance().GetActiveElement()->GetInfo().GetName() == "Edit Set" ) bEnable = FALSE;
pCmdUI->Enable( bEnable );
}
void CEnviPaneView::OnUpdateEnviDelete(CCmdUI *pCmdUI)
{
BOOL bEnable = TRUE;
if( CEnviControl::GetInstance().GetActiveElement()->GetInfo().GetName() == "Edit Set" ) bEnable = FALSE;
pCmdUI->Enable( bEnable );
}
LRESULT CEnviPaneView::OnSoundPaneDropMoveItem( WPARAM wParam, LPARAM lParam )
{
return m_pBaseView->SendMessage( UM_SOUNDPANE_DROPMOVEITEM, wParam, lParam );
}
LRESULT CEnviPaneView::OnSoundPaneDropItem( WPARAM wParam, LPARAM lParam )
{
return m_pBaseView->SendMessage( UM_SOUNDPANE_DROPITEM, wParam, lParam );
}