// EtPackingShaderDlg.cpp : ±¸Çö ÆÄÀÏ // #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 // ÀÀ¿ë ÇÁ·Î±×·¥ Á¤º¸¿¡ »ç¿ëµÇ´Â CAboutDlg ´ëÈ­ »óÀÚÀÔ´Ï´Ù. class CAboutDlg : public CDialog { public: CAboutDlg(); // ´ëÈ­ »óÀÚ µ¥ÀÌÅÍÀÔ´Ï´Ù. enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Áö¿øÀÔ´Ï´Ù. // ±¸ÇöÀÔ´Ï´Ù. 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 ´ëÈ­ »óÀÚ 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 ¸Þ½ÃÁö 󸮱â BOOL CEtPackingShaderDlg::OnInitDialog() { CDialog::OnInitDialog(); // ½Ã½ºÅÛ ¸Þ´º¿¡ "Á¤º¸..." ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÕ´Ï´Ù. // IDM_ABOUTBOX´Â ½Ã½ºÅÛ ¸í·É ¹üÀ§¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. 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); } } // ÀÌ ´ëÈ­ »óÀÚÀÇ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ Ã¢ÀÌ ´ëÈ­ »óÀÚ°¡ ¾Æ´Ò °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. SetIcon(m_hIcon, TRUE); // Å« ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. SetIcon(m_hIcon, FALSE); // ÀÛÀº ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. // TODO: ¿©±â¿¡ Ãß°¡ ÃʱâÈ­ ÀÛ¾÷À» Ãß°¡ÇÕ´Ï´Ù. 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; // Æ÷Ä¿½º¸¦ ÄÁÆ®·Ñ¿¡ ¼³Á¤ÇÏÁö ¾ÊÀ¸¸é TRUE¸¦ ¹ÝȯÇÕ´Ï´Ù. } void CEtPackingShaderDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // ´ëÈ­ »óÀÚ¿¡ ÃÖ¼ÒÈ­ ´ÜÃ߸¦ Ãß°¡ÇÒ °æ¿ì ¾ÆÀÌÄÜÀ» ±×¸®·Á¸é // ¾Æ·¡ Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ¹®¼­/ºä ¸ðµ¨À» »ç¿ëÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. void CEtPackingShaderDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // ±×¸®±â¸¦ À§ÇÑ µð¹ÙÀ̽º ÄÁÅØ½ºÆ® SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Ŭ¶óÀÌ¾ðÆ® »ç°¢Çü¿¡¼­ ¾ÆÀÌÄÜÀ» °¡¿îµ¥¿¡ ¸ÂÃä´Ï´Ù. 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; // ¾ÆÀÌÄÜÀ» ±×¸³´Ï´Ù. dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // »ç¿ëÀÚ°¡ ÃÖ¼ÒÈ­µÈ âÀ» ²ô´Â µ¿¾È¿¡ Ä¿¼­°¡ Ç¥½ÃµÇµµ·Ï ½Ã½ºÅÛ¿¡¼­ // ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. HCURSOR CEtPackingShaderDlg::OnQueryDragIcon() { return static_cast(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 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("ÆÄÀÏÀ» ¾µ ¼ö ¾ø½À´Ï´Ù."); } 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 }