DragonNest/Client/EtPackingShader/EtPackingShaderDlg.cpp

439 lines
12 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// EtPackingShaderDlg.cpp : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//
#include "stdafx.h"
#include "EtPackingShader.h"
#include "EtPackingShaderDlg.h"
#include "EtPackingShaderUtility.h"
#define REG_SUBKEY "SOFTWARE\\EyedentityGames\\EtPackingShader"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> CAboutDlg <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// <20><>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
// <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CEtPackingShaderDlg <20><>ȭ <20><><EFBFBD><EFBFBD>
CEtPackingShaderDlg::CEtPackingShaderDlg(CWnd* pParent /*=NULL*/)
: CDialog(CEtPackingShaderDlg::IDD, pParent)
, m_szCurrentDefine(_T(""))
, m_szProgress(_T(""))
, m_szShaderFolder(_T(""))
, m_szOutputFolder(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_nPrevComboSel = 0;
}
void CEtPackingShaderDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_szCurrentDefine);
DDX_Text(pDX, IDC_EDIT2, m_szProgress);
DDX_Control(pDX, IDC_COMBO2, m_ComboBox);
DDX_Text(pDX, IDC_EDIT3, m_szShaderFolder);
DDX_Control(pDX, IDC_EDIT2, m_progressEdit);
DDX_Text(pDX, IDC_EDIT4, m_szOutputFolder);
}
BEGIN_MESSAGE_MAP(CEtPackingShaderDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CEtPackingShaderDlg::OnBnClickedButtonCompile)
ON_CBN_SELCHANGE(IDC_COMBO2, &CEtPackingShaderDlg::OnCbnSelchangeCombo)
ON_BN_CLICKED(IDC_BUTTON2, &CEtPackingShaderDlg::OnBnClickedButtonFolder)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON3, &CEtPackingShaderDlg::OnBnClickedButtonOutput)
END_MESSAGE_MAP()
// CEtPackingShaderDlg <20>޽<EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD>
BOOL CEtPackingShaderDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// <20>ý<EFBFBD><C3BD><EFBFBD> <20>޴<EFBFBD><DEB4><EFBFBD> "<22><><EFBFBD><EFBFBD>..." <20>޴<EFBFBD> <20>׸<EFBFBD><D7B8><EFBFBD> <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
// IDM_ABOUTBOX<4F><58> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>մϴ<D5B4>.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// <20><> <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20><> â<><C3A2> <20><>ȭ <20><><EFBFBD>ڰ<EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1>
// <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>ũ<EFBFBD><C5A9> <20><> <20>۾<EFBFBD><DBBE><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
SetIcon(m_hIcon, TRUE); // ū <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
SetIcon(m_hIcon, FALSE); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
// TODO: <20><><EFBFBD><20>߰<EFBFBD> <20>ʱ<EFBFBD>ȭ <20>۾<EFBFBD><DBBE><EFBFBD> <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
char szStrFolder[2048] = { 0, };
char szStrOutput[2048] = { 0, };
char szStrDefine1[2048] = {0,};
char szStrDefine2[2048] = {0,};
char szStrDefine3[2048] = {0,};
GetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "ShaderFolder", szStrFolder, 2048 );
if( strlen(szStrFolder) == 0 )
m_szShaderFolder = "\\\\eye-ad\\ToolData\\SharedEffect";
else m_szShaderFolder = szStrFolder;
GetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "OutputFolder", szStrOutput, 2048 );
if( strlen(szStrOutput) == 0 )
m_szOutputFolder = "\\\\eye-ad\\ToolData\\Resource\\SharedEffect";
else m_szOutputFolder = szStrOutput;
GetModuleFileName(GetModuleHandle(0), m_szFileName, MAX_PATH );
char *ps = strrchr(m_szFileName, '\\');
if( ps ) {
strcpy(ps, "\\shader.info");
}
FILE *fp = fopen(m_szFileName, "rt");
if( fp == NULL ) {
m_szDefineList[0] = "ETERNITY_ENGINE Eternity\r\nUSE_TERRAIN_LIGHTMAP 1\r\nDEPTH_SHADOWMAP 1\r\nBAKE_DEPTHMAP 1\r\nBAKE_VELOCITY 0\r\n";
m_szDefineList[1] = "ETERNITY_ENGINE Eternity\r\nUSE_TERRAIN_LIGHTMAP 1\r\nDEPTH_SHADOWMAP 1\r\nBAKE_DEPTHMAP 1\r\nBAKE_VELOCITY 0\r\n";
m_szDefineList[2] = "ETERNITY_ENGINE Eternity\r\nUSE_TERRAIN_LIGHTMAP 1\r\nDEPTH_SHADOWMAP 1\r\nBAKE_DEPTHMAP 1\r\nBAKE_VELOCITY 0\r\n";
}
else {
char buffer[255];
int nIndex = -1;
for( ;; ) {
fgets(buffer, 255, fp);
if( feof(fp) || buffer[0] == '\0' )break;
if( buffer[0] == '[' ) {
if( strcmp(buffer, "[DefineHigh]\n") == 0 ) {
nIndex = 0;
}
if( strcmp(buffer, "[DefineNormal]\n") == 0 ) {
nIndex = 1;
}
if( strcmp(buffer, "[DefineLow]\n") == 0 ) {
nIndex = 2;
}
}
else {
m_szDefineList[nIndex] += buffer;
}
}
fclose(fp);
}
m_szCurrentDefine = m_szDefineList[0];
UpdateData( FALSE );
m_ComboBox.SetCurSel( 0 );
//OnCbnSelchangeCombo();
if( strstr(GetCommandLine(), "-autostart") != NULL ) {
OnBnClickedButtonCompile();
}
return TRUE; // <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD>ѿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TRUE<55><45> <20><>ȯ<EFBFBD>մϴ<D5B4>.
}
void CEtPackingShaderDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// <20><>ȭ <20><><EFBFBD>ڿ<EFBFBD> <20>ּ<EFBFBD>ȭ <20><><EFBFBD>߸<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׸<EFBFBD><D7B8><EFBFBD><EFBFBD><EFBFBD>
// <20>Ʒ<EFBFBD> <20>ڵ尡 <20>ʿ<EFBFBD><CABF>մϴ<D5B4>. <20><><EFBFBD><EFBFBD>/<2F><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> MFC <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1>
// <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> <20><> <20>۾<EFBFBD><DBBE><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
void CEtPackingShaderDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // <20>׸<EFBFBD><D7B8><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD> <20><><EFBFBD>ؽ<EFBFBD>Ʈ
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><EFBFBD><E7B0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB5A5> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׸<EFBFBD><D7B8>ϴ<EFBFBD>.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>ּ<EFBFBD>ȭ<EFBFBD><C8AD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ȿ<EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> ǥ<>õǵ<C3B5><C7B5><EFBFBD> <20>ý<EFBFBD><C3BD>ۿ<EFBFBD><DBBF><EFBFBD>
// <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
HCURSOR CEtPackingShaderDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
struct SHADER_COMPILE_INFO
{
char szFileName[64];
int nQualityLevel;
DWORD dwBufferSize;
BYTE *pCompiledBuffer;
};
DWORD WINAPI CEtPackingShaderDlg::CompileProc( LPVOID pThisPointer )
{
CEtPackingShaderDlg *pThis = (CEtPackingShaderDlg*)pThisPointer;
std::vector< std::string > &shaderFileNameList = GetShaderFileNameList( pThis->m_szShaderFolder );
std::vector< SHADER_COMPILE_INFO > CompiledList;
CString str;
for( int nQualityLevel = 0; nQualityLevel < 3; nQualityLevel++)
{
int nErrors=0;
int nSuccess=0;
std::vector<D3DXMACRO> DefineList = GetStringToMacro( pThis->m_szDefineList[ nQualityLevel ] );
for each( std::string szFileName in shaderFileNameList )
{
char szName[255];
char *ps = strrchr((char*)szFileName.c_str(), '\\');
strcpy(szName, ps+1);
str += szName;
const char *fullName = szFileName.c_str();
LPD3DXEFFECTCOMPILER pCompiler = NULL;
LPD3DXBUFFER pParseErrors = NULL;
DWORD dwFlags = 0;
D3DXCreateEffectCompilerFromFile(fullName, &DefineList[0], NULL, dwFlags, &pCompiler, &pParseErrors);
if(!pCompiler) {
char *szErrorMsg = (char*)pParseErrors->GetBufferPointer();
// compile error
str += " . . . Compile Error - ";
str += szErrorMsg;
str += "\r\n";
pThis->m_progressEdit.SetWindowText( str );
pThis->m_progressEdit.LineScroll( INT_MAX );
nErrors++;
break;
}
LPD3DXBUFFER pCompiledEffect = NULL;
LPD3DXBUFFER pErrorMsg = NULL;
pCompiler->CompileEffect(dwFlags, &pCompiledEffect, &pErrorMsg);
if(!pCompiledEffect) {
char *szErrorMsg = (char*)pErrorMsg->GetBufferPointer();
str += " . . . Compile Error - ";
str += szErrorMsg;
str += "\r\n";
pThis->m_progressEdit.SetWindowText( str );
pThis->m_progressEdit.LineScroll( INT_MAX );
nErrors++;
break;
}
pCompiler->Release();
SHADER_COMPILE_INFO scInfo;
strcpy(scInfo.szFileName, szName);
scInfo.nQualityLevel = nQualityLevel;
scInfo.dwBufferSize = pCompiledEffect->GetBufferSize();
scInfo.pCompiledBuffer = new BYTE[ pCompiledEffect->GetBufferSize() ];
memcpy(scInfo.pCompiledBuffer, pCompiledEffect->GetBufferPointer(), pCompiledEffect->GetBufferSize());
CompiledList.push_back( scInfo );
pCompiledEffect->Release();
str += " . . . Compiling Ok.\r\n";
pThis->m_progressEdit.SetWindowText( str );
pThis->m_progressEdit.LineScroll( INT_MAX );
nSuccess++;
}
for each( D3DXMACRO e in DefineList ) {
delete [] e.Name;
delete [] e.Definition;
}
if( nErrors == 0 ) {
char szText[255];
sprintf(szText, " %d succeeded, %d failed\r\n\r\n", nSuccess, nErrors );
str += szText;
pThis->m_progressEdit.SetWindowText( str );
pThis->m_progressEdit.LineScroll( INT_MAX );
}
else {
break;
}
}
char szOutName[255];
strcpy(szOutName, pThis->m_szOutputFolder.GetBuffer());
strcat(szOutName, "\\DnShaders.dat");
FILE *fp = fopen(szOutName, "wb");
if( fp == NULL ) {
AfxMessageBox("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.");
}
else {
DWORD dwHead = *(DWORD*)"SHD0";
int dwCount = (int)CompiledList.size();
fwrite(&dwHead, sizeof(DWORD), 1, fp);
fwrite(&dwCount, sizeof(int), 1, fp);
for( int i = 0; i < dwCount; i++) {
fwrite(CompiledList[i].szFileName, 64, 1, fp);
fwrite(&CompiledList[i].nQualityLevel, sizeof(DWORD), 1, fp);
fwrite(&CompiledList[i].dwBufferSize, sizeof(DWORD), 1, fp);
fwrite(CompiledList[i].pCompiledBuffer, CompiledList[i].dwBufferSize, 1, fp);
delete [] CompiledList[i].pCompiledBuffer;
}
fclose(fp);
char szText[255];
sprintf(szText, " %d shaders save success. \r\n\r\n", dwCount );
str += szText;
pThis->m_progressEdit.SetWindowText( str );
pThis->m_progressEdit.LineScroll( INT_MAX );
}
if( strstr(GetCommandLine(), "-autostart") != NULL ) {
pThis->EndDialog(IDOK);
}
return 0;
}
void CEtPackingShaderDlg::OnBnClickedButtonCompile()
{
OnCbnSelchangeCombo();
HANDLE packingThread = ::CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)&CEtPackingShaderDlg::CompileProc, this, 0, NULL );
}
void CEtPackingShaderDlg::OnCbnSelchangeCombo()
{
UpdateData( TRUE );
m_szDefineList[ m_nPrevComboSel ] = m_szCurrentDefine;
int nCurSel = m_ComboBox.GetCurSel();
m_szCurrentDefine = m_szDefineList[ nCurSel ];
UpdateData( FALSE );
m_nPrevComboSel = nCurSel;
}
void CEtPackingShaderDlg::OnBnClickedButtonFolder()
{
// TODO: Add your control notification handler code here
CXTBrowseDialog Dlg;
UpdateData(TRUE);
Dlg.SetTitle(_T("Select Shader Directory"));
if( !m_szShaderFolder.IsEmpty() ) {
TCHAR path[_MAX_PATH];
STRCPY_S(path, _MAX_PATH, m_szShaderFolder);
Dlg.SetSelPath(path);
}
if( Dlg.DoModal() == IDOK ) {
m_szShaderFolder = Dlg.GetSelPath();
UpdateData(FALSE);
}
}
void CEtPackingShaderDlg::OnBnClickedButtonOutput()
{
// TODO: Add your control notification handler code here
CXTBrowseDialog Dlg;
UpdateData(TRUE);
Dlg.SetTitle(_T("Select Output Directory"));
if( !m_szOutputFolder.IsEmpty() ) {
TCHAR path[_MAX_PATH];
STRCPY_S(path, _MAX_PATH, m_szOutputFolder);
Dlg.SetSelPath(path);
}
if( Dlg.DoModal() == IDOK ) {
m_szOutputFolder = Dlg.GetSelPath();
UpdateData(FALSE);
}
}
void CEtPackingShaderDlg::OnDestroy()
{
CDialog::OnDestroy();
SetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "ShaderFolder", m_szShaderFolder.GetBuffer() );
SetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "OutputFolder", m_szOutputFolder.GetBuffer() );
OnCbnSelchangeCombo();
/*SetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "DefineHigh", m_szDefineList[0].GetBuffer() );
SetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "DefineNormal", m_szDefineList[1].GetBuffer() );
SetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "DefineLow", m_szDefineList[2].GetBuffer() ); */
FILE *fp = fopen(m_szFileName, "wt");
fputs("[DefineHigh]\n", fp);
fputs(m_szDefineList[0].GetBuffer(), fp);
fputs("[DefineNormal]\n", fp);
fputs(m_szDefineList[1].GetBuffer(), fp);
fputs("[DefineLow]\n", fp);
fputs(m_szDefineList[2].GetBuffer(), fp);
fclose(fp);
// TODO: Add your message handler code here
}