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

497 lines
15 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.

// 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 );
}