diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/texturebrowser.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/texturebrowser.cpp')
| -rw-r--r-- | hammer/texturebrowser.cpp | 724 |
1 files changed, 724 insertions, 0 deletions
diff --git a/hammer/texturebrowser.cpp b/hammer/texturebrowser.cpp new file mode 100644 index 0000000..f8237b5 --- /dev/null +++ b/hammer/texturebrowser.cpp @@ -0,0 +1,724 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "stdafx.h" +#include <oleauto.h> +#include <oaidl.h> +#if _MSC_VER < 1300 +#include <afxpriv.h> +#endif +#include "CustomMessages.h" +#include "GlobalFunctions.h" +#include "History.h" +#include "FaceEditSheet.h" +#include "IEditorTexture.h" +#include "MainFrm.h" +#include "MapDoc.h" +#include "MapWorld.h" +#include "ReplaceTexDlg.h" +#include "TextureBrowser.h" +#include "TextureSystem.h" +#include "hammer.h" +#include "Selection.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +static LPCTSTR pszIniSection = "Texture Browser"; + + +CStringArray CTextureBrowser::m_FilterHistory; +int CTextureBrowser::m_nFilterHistory; +char CTextureBrowser::m_szLastKeywords[MAX_PATH]; + + +BEGIN_MESSAGE_MAP(CTextureBrowser, CDialog) + //{{AFX_MSG_MAP(CTextureBrowser) + ON_WM_SIZE() + ON_CBN_SELENDOK(IDC_TEXTURESIZE, OnSelendokTexturesize) + ON_WM_CLOSE() + ON_WM_TIMER() + ON_CBN_EDITCHANGE(IDC_FILTER, OnChangeFilterOrKeywords) + ON_CBN_SELENDOK(IDC_FILTER, OnUpdateFiltersNOW) + ON_CBN_EDITCHANGE(IDC_KEYWORDS, OnChangeFilterOrKeywords) + ON_CBN_SELENDOK(IDC_KEYWORDS, OnUpdateKeywordsNOW) + ON_BN_CLICKED(IDC_FILTER_OPAQUE, OnFilterOpaque) + ON_BN_CLICKED(IDC_FILTER_TRANSLUCENT, OnFilterTranslucent) + ON_BN_CLICKED(IDC_FILTER_SELFILLUM, OnFilterSelfIllum) + ON_BN_CLICKED(IDC_FILTER_ENVMASK, OnFilterEnvmask) + ON_BN_CLICKED(IDC_SHOW_ERROR, OnShowErrors) + ON_BN_CLICKED(IDC_USED, OnUsed) + ON_BN_CLICKED(IDC_MARK, OnMark) + ON_BN_CLICKED(IDC_REPLACE, OnReplace) + ON_BN_CLICKED(IDC_TEXTURES_OPEN_SOURCE, OnOpenSource) + ON_BN_CLICKED(IDC_TEXTURES_RELOAD, OnReload) + ON_MESSAGE(TWN_SELCHANGED, OnTexturewindowSelchange) + ON_MESSAGE(TWN_LBUTTONDBLCLK, OnTextureWindowDblClk) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pParent - +//----------------------------------------------------------------------------- +CTextureBrowser::CTextureBrowser(CWnd* pParent) + : CDialog(IDD, pParent) +{ + m_szNameFilter[0] = '\0'; + szInitialTexture[0] = '\0'; + m_bFilterChanged = FALSE; + m_uLastFilterChange = 0xffffffff; + m_bUsed = FALSE; + m_szLastKeywords[0] = '\0'; +} + +//----------------------------------------------------------------------------- +// Purpose: Handles resize messages. Moves the child windows to the proper positions. +// Input : nType - +// cx - +// cy - +//----------------------------------------------------------------------------- +void CTextureBrowser::OnSize(UINT nType, int cx, int cy) +{ + if (nType == SIZE_MINIMIZED || !IsWindow(m_cTextureWindow.m_hWnd)) + { + CDialog::OnSize(nType, cx, cy); + return; + } + + // reposition controls + CRect clientrect; + GetClientRect(&clientrect); + + CRect CtrlRect; + GetDlgItem(IDC_CONTROLHEIGHT)->GetWindowRect(&CtrlRect); + + int iControlHeight = (CtrlRect.bottom - CtrlRect.top); + int iThisCtrlHeight; + + // + // Resize the texture window. + // + CtrlRect = clientrect; + CtrlRect.bottom -= iControlHeight; + m_cTextureWindow.MoveWindow(CtrlRect); + + clientrect.top = (clientrect.bottom - iControlHeight) + 4; + + // + // Move the top row of controls to the correct vertical position, + // leaving their horizontal position as it was set up in the dialog. + // + int iIDList[] = + { + IDC_TEXTURESIZE, + IDC_SIZEPROMPT, + IDC_FILTERPROMPT, + IDC_FILTER, + IDC_CURNAME, + IDC_FILTER_OPAQUE, + IDC_FILTER_SELFILLUM, + IDC_SHOW_ERROR, + IDC_TEXTURES_OPEN_SOURCE, + -1 + }; + + for (int i = 0; iIDList[i] != -1; i++) + { + CWnd *pWnd = GetDlgItem(iIDList[i]); + Assert(pWnd != NULL); + + if (pWnd != NULL) + { + pWnd->GetWindowRect(&CtrlRect); + ScreenToClient(CtrlRect); + iThisCtrlHeight = CtrlRect.bottom - CtrlRect.top; + CtrlRect.top = clientrect.top; + CtrlRect.bottom = CtrlRect.top + iThisCtrlHeight; + pWnd->MoveWindow(CtrlRect); + } + } + + // + // Move the middle row of controls to the correct vertical position, + // leaving their horizontal position as it was set up in the dialog. + // + int iIDList2[] = + { + IDC_KEYWORDS_TEXT, + IDC_KEYWORDS, + IDC_USED, + IDC_MARK, + IDC_REPLACE, + IDC_CURDESCRIPTION, + IDC_FILTER_TRANSLUCENT, + IDC_FILTER_ENVMASK, + IDC_TEXTURES_RELOAD, + -1 + }; + + for (int i = 0; iIDList2[i] != -1; i++) + { + CWnd *pWnd = GetDlgItem(iIDList2[i]); + Assert(pWnd != NULL); + + if (pWnd != NULL) + { + pWnd->GetWindowRect(&CtrlRect); + ScreenToClient(CtrlRect); + iThisCtrlHeight = CtrlRect.bottom - CtrlRect.top; + CtrlRect.top = clientrect.top + iControlHeight / 2 + 2; + CtrlRect.bottom = CtrlRect.top + iThisCtrlHeight; + pWnd->MoveWindow(CtrlRect); + } + } + + CDialog::OnSize(nType, cx, cy); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : bUsed - +//----------------------------------------------------------------------------- +void CTextureBrowser::SetUsed(BOOL bUsed) +{ + m_bUsed = bUsed; + + if (m_bUsed) + { + CUsedTextureList Used; + GetActiveWorld()->GetUsedTextures(Used); + + m_TextureSubList.RemoveAll(); + for (int i = 0; i < Used.Count(); i++) + { + TextureWindowTex_t Tex; + Tex.pTex = Used.Element(i).pTex; + Tex.nUsageCount = Used.Element(i).nUsageCount; + + m_TextureSubList.AddToTail(Tex); + } + + m_cTextureWindow.SetSpecificList(&m_TextureSubList); + } + else + { + m_cTextureWindow.SetSpecificList(NULL); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnClose(void) +{ + WriteSettings(); + SaveAndExit(); + CDialog::OnCancel(); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnCancel() +{ + WriteSettings(); + SaveAndExit(); + CDialog::OnCancel(); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnUsed() +{ + if(!GetActiveWorld()) + return; + + SetUsed(m_cUsed.GetCheck()); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pszTexture - +//----------------------------------------------------------------------------- +void CTextureBrowser::SetInitialTexture(LPCTSTR pszTexture) +{ + strcpy(szInitialTexture, pszTexture); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnSelendokTexturesize() +{ + // change size of textures the texutre window displays + int iCurSel = m_cSizeList.GetCurSel(); + + switch(iCurSel) + { + case 0: + m_cTextureWindow.SetDisplaySize(128); + break; + case 1: + m_cTextureWindow.SetDisplaySize(256); + break; + case 2: + m_cTextureWindow.SetDisplaySize(512); + break; + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL CTextureBrowser::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Iterate all the active textures for debugging. + //int nCount = g_Textures.GetActiveTextureCount(); + //for (int nTexture = 0; nTexture < nCount; nTexture++) + //{ + // IEditorTexture *pTexture = g_Textures.GetActiveTexture(nTexture); + // const char *pszName = pTexture->GetName(); + // DBG("%d: %s\n", nTexture, pszName); + //} + + m_cSizeList.SubclassDlgItem(IDC_TEXTURESIZE, this); + m_cFilter.SubclassDlgItem(IDC_FILTER, this); + m_cKeywords.SubclassDlgItem(IDC_KEYWORDS, this); + m_cCurName.SubclassDlgItem(IDC_CURNAME, this); + m_cCurDescription.SubclassDlgItem(IDC_CURDESCRIPTION, this); + m_cUsed.SubclassDlgItem(IDC_USED, this); + + m_FilterOpaque.SubclassDlgItem(IDC_FILTER_OPAQUE, this); + m_FilterTranslucent.SubclassDlgItem(IDC_FILTER_TRANSLUCENT, this); + m_FilterSelfIllum.SubclassDlgItem(IDC_FILTER_SELFILLUM, this); + m_FilterEnvMask.SubclassDlgItem(IDC_FILTER_ENVMASK, this); + m_ShowErrors.SubclassDlgItem(IDC_SHOW_ERROR, this); + + m_FilterOpaque.SetCheck( true ); + m_FilterTranslucent.SetCheck( true ); + m_FilterSelfIllum.SetCheck( true ); + m_FilterEnvMask.SetCheck( true ); + m_ShowErrors.SetCheck( true ); + + // + // Create CTextureWindow that takes up area of dummy control. + // + { + RECT r; + GetDlgItem( IDC_BROWSERDUMMY )->GetClientRect( &r ); + m_cTextureWindow.Create( this, r ); + } + + // Show everything initially + m_cTextureWindow.SetTypeFilter( ~0, true ); + + // + // Add latest history to the filter combo. + // + for (int i = 0; i < m_nFilterHistory; i++) + { + m_cFilter.AddString(m_FilterHistory[i]); + } + + // + // Set the name filter unless one was explicitly specified. + // + if (m_szNameFilter[0] == '\0') + { + // + // No name filter specified. Use whatever is on top of the history. + // + if (m_cFilter.GetCount() > 0) + { + m_cFilter.GetLBText(0, m_szNameFilter); + m_cFilter.SetCurSel(0); + } + } + + m_cFilter.SetWindowText(m_szNameFilter); + m_cTextureWindow.SetNameFilter(m_szNameFilter); + + // + // Done with the name filter; clear it for next time. + // + m_szNameFilter[0] = '\0'; + + // Add the global list of keywords to the keywords combo. + for( int i=0; i< g_Textures.GetNumKeywords(); i++ ) + { + m_cKeywords.AddString( g_Textures.GetKeyword(i) ); + } + + // + // Set the keyword filter. + // + m_cKeywords.SetWindowText(m_szLastKeywords); + m_cTextureWindow.SetKeywords(m_szLastKeywords); + + m_cUsed.SetCheck(m_bUsed); + + // Refresh the list of used textures if enabled. + if (m_bUsed) + { + SetUsed(TRUE); + } + + CWinApp *pApp = AfxGetApp(); + CString str = pApp->GetProfileString(pszIniSection, "Position"); + if (!str.IsEmpty()) + { + RECT r; + sscanf(str, "%d %d %d %d", &r.left, &r.top, &r.right, &r.bottom); + + if (r.left < 0) + { + ShowWindow(SW_SHOWMAXIMIZED); + } + else + { + MoveWindow(r.left, r.top, r.right-r.left, r.bottom-r.top, FALSE); + } + } + + int iSize = pApp->GetProfileInt(pszIniSection, "ShowSize", 0); + m_cSizeList.SetCurSel(iSize); + OnSelendokTexturesize(); + + if (szInitialTexture[0]) + { + m_cTextureWindow.SelectTexture(szInitialTexture); + } + + m_cTextureWindow.ShowWindow(SW_SHOW); + + SetTimer(1, 500, NULL); + + m_cFilter.SetFocus(); + + return(FALSE); +} + + +//----------------------------------------------------------------------------- +// Purpose: Called when either the filter combo or the keywords combo text changes. +//----------------------------------------------------------------------------- +void CTextureBrowser::OnChangeFilterOrKeywords() +{ + // + // Start a timer to repaint the texture window using the new filters. + // + m_uLastFilterChange = time(NULL); + m_bFilterChanged = TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnUpdateFiltersNOW() +{ + m_uLastFilterChange = time(NULL); + m_bFilterChanged = FALSE; + + CString str; + int iSel = m_cFilter.GetCurSel(); + m_cFilter.GetLBText(iSel, str); + m_cTextureWindow.SetNameFilter(str); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnUpdateKeywordsNOW() +{ + m_uLastFilterChange = time(NULL); + m_bFilterChanged = FALSE; + + CString str; + int iSel = m_cKeywords.GetCurSel(); + m_cKeywords.GetLBText(iSel, str); + m_cTextureWindow.SetKeywords(str); +} + + +//----------------------------------------------------------------------------- +// Purpose: Timer used to control updates when the filter terms change. +// Input : nIDEvent - +//----------------------------------------------------------------------------- +void CTextureBrowser::OnTimer(UINT nIDEvent) +{ + if (!m_bFilterChanged) + { + return; + } + + if ((time(NULL) - m_uLastFilterChange) > 0) + { + KillTimer(nIDEvent); + m_bFilterChanged = FALSE; + + m_cTextureWindow.EnableUpdate(false); + + CString str; + m_cFilter.GetWindowText(str); + m_cTextureWindow.SetNameFilter(str); + + m_cTextureWindow.EnableUpdate(true); + + m_cKeywords.GetWindowText(str); + m_cTextureWindow.SetKeywords(str); + + SetTimer(nIDEvent, 500, NULL); + } + + CDialog::OnTimer(nIDEvent); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : wParam - +// lParam - +// Output : LRESULT +//----------------------------------------------------------------------------- +LRESULT CTextureBrowser::OnTextureWindowDblClk(WPARAM wParam, LPARAM lParam) +{ + WriteSettings(); + SaveAndExit(); + return(0); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : wParam - +// lParam - +// Output : LRESULT +//----------------------------------------------------------------------------- +LRESULT CTextureBrowser::OnTexturewindowSelchange(WPARAM wParam, LPARAM lParam) +{ + IEditorTexture *pTex = g_Textures.FindActiveTexture(m_cTextureWindow.szCurTexture); + CString str; + char szName[MAX_PATH]; + + if (pTex != NULL) + { + // create description of texture + str.Format("%dx%d", pTex->GetWidth(), pTex->GetHeight()); + pTex->GetShortName(szName); + } + else + { + szName[0] = '\0'; + } + + m_cCurName.SetWindowText(szName); + m_cCurDescription.SetWindowText(str); + + return(0); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::WriteSettings() +{ + // write position information + CWinApp *pApp = AfxGetApp(); + CString str; + CRect r; + GetWindowRect(r); + str.Format("%d %d %d %d", r.left, r.top, r.right, r.bottom); + pApp->WriteProfileString(pszIniSection, "Position", str); + pApp->WriteProfileInt(pszIniSection, "ShowSize", m_cSizeList.GetCurSel()); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::SaveAndExit() +{ + // save current filter string + CString str; + m_cFilter.GetWindowText(str); + + int i; + for(i = 0; i < m_nFilterHistory; i++) + { + if(!m_FilterHistory[i].CompareNoCase(str)) + break; + } + + if(i != m_nFilterHistory) // delete first + { + m_FilterHistory.RemoveAt(i); + --m_nFilterHistory; + } + + m_FilterHistory.InsertAt(0, str); + ++m_nFilterHistory; + + m_cKeywords.GetWindowText(m_szLastKeywords, sizeof(m_szLastKeywords)); + + EndDialog(IDOK); +} + + +//----------------------------------------------------------------------------- +// Purpose: Sets a name filter that will override whatever is in the history +// for this browser session. +//----------------------------------------------------------------------------- +void CTextureBrowser::SetFilter(const char *pszFilter) +{ + if (pszFilter) + { + strcpy(m_szNameFilter, pszFilter); + } + else + { + m_szNameFilter[0] = '\0'; + } +} + + +//----------------------------------------------------------------------------- +// Filter buttons +//----------------------------------------------------------------------------- + +void CTextureBrowser::OnFilterOpaque(void) +{ + bool checked = m_FilterOpaque.GetCheck( ) != 0; + m_cTextureWindow.SetTypeFilter( CTextureWindow::TYPEFILTER_OPAQUE, checked ); +} + +void CTextureBrowser::OnFilterTranslucent(void) +{ + bool checked = m_FilterTranslucent.GetCheck( ) != 0; + m_cTextureWindow.SetTypeFilter( CTextureWindow::TYPEFILTER_TRANSLUCENT, checked ); +} + +void CTextureBrowser::OnFilterSelfIllum(void) +{ + bool checked = m_FilterSelfIllum.GetCheck( ) != 0; + m_cTextureWindow.SetTypeFilter( CTextureWindow::TYPEFILTER_SELFILLUM, checked ); +} + +void CTextureBrowser::OnFilterEnvmask(void) +{ + bool checked = m_FilterEnvMask.GetCheck( ) != 0; + m_cTextureWindow.SetTypeFilter( CTextureWindow::TYPEFILTER_ENVMASK, checked ); +} + +void CTextureBrowser::OnShowErrors(void) +{ + bool checked = m_ShowErrors.GetCheck( ) != 0; + m_cTextureWindow.ShowErrors( checked ); +} + + +//----------------------------------------------------------------------------- +// Opens the source file: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnOpenSource() +{ + if ( m_cTextureWindow.szCurTexture[0] ) + { + g_Textures.OpenSource( m_cTextureWindow.szCurTexture ); + } +} + +void CTextureBrowser::OnReload() +{ + if ( m_cTextureWindow.szCurTexture[0] ) + { + g_Textures.ReloadTextures( m_cTextureWindow.szCurTexture ); + m_cTextureWindow.Invalidate(); + + if (GetMainWnd()) + { + GetMainWnd()->m_TextureBar.NotifyGraphicsChanged(); + GetMainWnd()->m_pFaceEditSheet->NotifyGraphicsChanged(); + } + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTextureBrowser::OnMark(void) +{ + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if (pDoc != NULL) + { + pDoc->ReplaceTextures(m_cTextureWindow.szCurTexture, "", TRUE, 0x100, FALSE, FALSE); + EndDialog(IDOK); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Invokes the replace texture dialog. +//----------------------------------------------------------------------------- +void CTextureBrowser::OnReplace(void) +{ + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if(!pDoc) + return; + + CReplaceTexDlg dlg(pDoc->GetSelection()->GetCount()); + + dlg.m_strFind = m_cTextureWindow.szCurTexture; + + if(dlg.DoModal() != IDOK) + return; + + // mark undo position + GetHistory()->MarkUndoPosition(pDoc->GetSelection()->GetList(), "Replace Textures"); + + if(dlg.m_bMarkOnly) + { + pDoc->SelectObject(NULL, scClear); // clear selection first + } + + dlg.DoReplaceTextures(); + + //EndDialog(IDOK); + + if (m_bUsed) + { + SetUsed(TRUE); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Sets the texture format for browsing. Only textures of the given +// format will be visible in the browse window. By default, this +// format will be the same as the current active texture format. +// Input : eTextureFormat - Texture format to use for browsing. +//----------------------------------------------------------------------------- +void CTextureBrowser::SetTextureFormat(TEXTUREFORMAT eTextureFormat) +{ + m_cTextureWindow.SetTextureFormat(eTextureFormat); +} + + |