summaryrefslogtreecommitdiff
path: root/hammer/texturebar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/texturebar.cpp')
-rw-r--r--hammer/texturebar.cpp442
1 files changed, 442 insertions, 0 deletions
diff --git a/hammer/texturebar.cpp b/hammer/texturebar.cpp
new file mode 100644
index 0000000..2689882
--- /dev/null
+++ b/hammer/texturebar.cpp
@@ -0,0 +1,442 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "stdafx.h"
+#include "hammer.h"
+#include "TextureBar.h"
+#include "ControlBarIDs.h"
+#include "StockSolids.h"
+#include "MainFrm.h"
+#include "MapDoc.h"
+#include "GlobalFunctions.h"
+#include "History.h"
+#include "IEditorTexture.h"
+#include "Options.h"
+#include "ReplaceTexDlg.h"
+#include "TextureBrowser.h"
+#include "TextureSystem.h"
+#include "Selection.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+BEGIN_MESSAGE_MAP(CTextureBar, CHammerBar)
+ ON_CBN_SELCHANGE(IDC_TEXTURES, OnSelChangeTexture)
+ ON_UPDATE_COMMAND_UI(IDC_TEXTURES, UpdateControl)
+ ON_CBN_SELCHANGE(IDC_TEXTUREGROUPS, OnChangeTextureGroup)
+ ON_UPDATE_COMMAND_UI(IDC_TEXTUREGROUPS, UpdateControl)
+ ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
+ ON_UPDATE_COMMAND_UI(IDC_BROWSE, UpdateControl)
+ ON_BN_CLICKED(IDC_REPLACE, OnReplace)
+ ON_UPDATE_COMMAND_UI(IDC_REPLACE, UpdateControl)
+ ON_WM_WINDOWPOSCHANGED()
+END_MESSAGE_MAP()
+
+
+static char szDefaultTexture[128];
+
+static char szNullTexture[128] = {"editor/obsolete"};
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : LPCTSTR
+//-----------------------------------------------------------------------------
+void SetDefaultTextureName( const char *szTexName )
+{
+ int length = strlen( szTexName );
+ Assert( length < 128 );
+
+ strcpy( szDefaultTexture, szTexName );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : LPCTSTR
+//-----------------------------------------------------------------------------
+LPCTSTR GetDefaultTextureName(void)
+{
+ return szDefaultTexture;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : LPCTSTR
+//-----------------------------------------------------------------------------
+
+LPCTSTR GetNullTextureName()
+{
+ return szNullTexture;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pParentWnd -
+// IDD -
+// iBarID -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CTextureBar::Create(CWnd *pParentWnd, int IDD, int iBarID)
+{
+ m_pCurTex = NULL;
+
+ if (!CHammerBar::Create(pParentWnd, IDD, CBRS_RIGHT, iBarID))
+ {
+ return(FALSE);
+ }
+
+ SetWindowText("Textures");
+
+ // set up controls
+ m_TextureGroupList.SubclassDlgItem(IDC_TEXTUREGROUPS, this);
+ m_TextureList.SubclassDlgItem(IDC_TEXTURES, this);
+ m_TexturePic.SubclassDlgItem(IDC_TEXTUREPIC, this);
+
+ NotifyGraphicsChanged();
+
+ UpdateTexture();
+
+ return(TRUE);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTextureBar::NotifyGraphicsChanged()
+{
+ if (!IsWindow(m_hWnd))
+ {
+ return;
+ }
+
+ // load groups into group list
+ CString str;
+ int iCurSel = m_TextureGroupList.GetCurSel();
+ if (iCurSel != LB_ERR)
+ {
+ m_TextureGroupList.GetLBText(iCurSel, str);
+ }
+
+ m_TextureGroupList.SetRedraw(FALSE);
+ m_TextureGroupList.ResetContent();
+ m_TextureGroupList.AddString("All Textures");
+
+ int nCount = g_Textures.GroupsGetCount();
+ if (nCount > 1)
+ {
+ //
+ // Skip first group ("All Textures").
+ //
+ for (int i = 1; i < nCount; i++)
+ {
+ CTextureGroup *pGroup = g_Textures.GroupsGet(i);
+ if (pGroup->GetTextureFormat() == g_pGameConfig->GetTextureFormat())
+ {
+ const char *p = strstr(pGroup->GetName(), "textures\\");
+ if (p)
+ {
+ p += strlen("textures\\");
+ }
+ else
+ {
+ p = pGroup->GetName();
+ }
+
+ m_TextureGroupList.AddString(p);
+ }
+ }
+ }
+ m_TextureGroupList.SetRedraw(TRUE);
+
+ if (iCurSel == LB_ERR || m_TextureGroupList.SelectString(-1, str) == LB_ERR)
+ {
+ m_TextureGroupList.SetCurSel(0);
+ }
+
+ m_TextureGroupList.Invalidate();
+
+ char szName[MAX_PATH];
+ m_TextureGroupList.GetLBText(m_TextureGroupList.GetCurSel(), szName);
+ g_Textures.SetActiveGroup(szName);
+
+ //
+ // This is called when the loaded graphics list is changed,
+ // or on first init by this->Create().
+ //
+ m_TextureList.LoadGraphicList();
+ UpdateTexture();
+}
+
+
+void CTextureBar::NotifyNewMaterial( IEditorTexture *pTex )
+{
+ m_TextureList.NotifyNewMaterial( pTex );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Disables the dialog controls when there's no active document.
+// Input : pCmdUI - Interface to control being updated.
+//-----------------------------------------------------------------------------
+void CTextureBar::UpdateControl(CCmdUI *pCmdUI)
+{
+ pCmdUI->Enable(CMapDoc::GetActiveMapDoc() ? TRUE : FALSE);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles user-initiated selection changes. Updates the control state
+// and adds the selected texture to the MRU list.
+//-----------------------------------------------------------------------------
+void CTextureBar::OnSelChangeTexture(void)
+{
+ UpdateTexture();
+
+ if (m_pCurTex != NULL)
+ {
+ m_TextureList.AddMRU(m_pCurTex);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Updates the m_pTexture data member based on the current selection.
+// Also updates the window text and the texture picture.
+//-----------------------------------------------------------------------------
+void CTextureBar::UpdateTexture(void)
+{
+ int iSel = m_TextureList.GetCurSel();
+
+ if (iSel == LB_ERR)
+ {
+ m_TexturePic.SetTexture(NULL);
+ m_pCurTex = NULL;
+ return;
+ }
+
+ m_pCurTex = (IEditorTexture *)m_TextureList.GetItemDataPtr(iSel);
+ m_TexturePic.SetTexture(m_pCurTex);
+
+ if (m_pCurTex)
+ {
+ // Make sure the current material is loaded..
+ m_pCurTex->Load();
+ char szBuf[128];
+ sprintf(szBuf, "%dx%d", m_pCurTex->GetWidth(), m_pCurTex->GetHeight());
+ GetDlgItem(IDC_TEXTURESIZE)->SetWindowText(szBuf);
+ m_pCurTex->GetShortName(szDefaultTexture);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTextureBar::OnUpdateTexname(void)
+{
+ // get texture window and set texture in there
+ CString strTex;
+ m_TextureList.GetWindowText(strTex);
+ IEditorTexture *pTex = g_Textures.FindActiveTexture(strTex);
+ m_TexturePic.SetTexture(pTex);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTextureBar::OnChangeTextureGroup(void)
+{
+ int iGroup = m_TextureGroupList.GetCurSel();
+
+ //
+ // Set the active texture group by name.
+ //
+ char szName[MAX_PATH];
+ m_TextureGroupList.GetLBText(iGroup, szName);
+ g_Textures.SetActiveGroup(szName);
+
+ //
+ // Refresh the texture list contents.
+ //
+ m_TextureList.LoadGraphicList();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTextureBar::OnBrowse(void)
+{
+ CTextureBrowser *pBrowser = GetMainWnd()->pTextureBrowser;
+
+ int iSel = m_TextureList.GetCurSel();
+
+ if (iSel != LB_ERR)
+ {
+ IEditorTexture *pTex = (IEditorTexture *)m_TextureList.GetItemDataPtr(iSel);
+ if (pTex != NULL)
+ {
+ char sz[128];
+
+ pTex->GetShortName(sz);
+ pBrowser->SetInitialTexture(sz);
+ }
+ }
+
+ if (pBrowser->DoModal() == IDOK)
+ {
+ IEditorTexture *pTex = g_Textures.FindActiveTexture(pBrowser->m_cTextureWindow.szCurTexture);
+ if (pTex != NULL)
+ {
+ int iCount = m_TextureList.GetCount();
+ for (int i = 0; i < iCount; i++)
+ {
+ if (pTex == (IEditorTexture *)m_TextureList.GetItemDataPtr(i))
+ {
+ m_TextureList.SetCurSel(i);
+ UpdateTexture();
+ m_TextureList.AddMRU(pTex);
+ break;
+ }
+
+ }
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles being shown or hidden.
+// Input : pPos - Information about show or hide state.
+//-----------------------------------------------------------------------------
+void CTextureBar::OnWindowPosChanged(WINDOWPOS *pPos)
+{
+ if (GetMainWnd() != NULL)
+ {
+ //
+ // Rebuild our MRU list if we are being shown, because it may
+ // have changed since we were shown last.
+ //
+ if (pPos->flags & SWP_SHOWWINDOW)
+ {
+ m_TextureList.RebuildMRU();
+ UpdateTexture();
+ }
+ }
+
+ CHammerBar::OnWindowPosChanged(pPos);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Invokes the texture replace dialog.
+//-----------------------------------------------------------------------------
+void CTextureBar::OnReplace(void)
+{
+ CMapDoc *pDoc = CMapDoc::GetActiveMapDoc();
+ if (!pDoc)
+ {
+ return;
+ }
+
+ CReplaceTexDlg dlg(pDoc->GetSelection()->GetCount());
+ dlg.m_strFind = GetDefaultTextureName();
+ if (dlg.DoModal() != IDOK)
+ {
+ return;
+ }
+
+ GetHistory()->MarkUndoPosition(pDoc->GetSelection()->GetList(), "Replace Textures");
+ dlg.DoReplaceTextures();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Selects a texture by name.
+// Input : pszTextureName - Texture name to select.
+//-----------------------------------------------------------------------------
+void CTextureBar::SelectTexture(LPCSTR pszTextureName)
+{
+ int nIndex = m_TextureList.SelectString(-1, pszTextureName);
+
+ //
+ // If the texture is not in the list, add it to the list.
+ //
+ if (nIndex == LB_ERR)
+ {
+ IEditorTexture *pTex = g_Textures.FindActiveTexture(pszTextureName);
+ if (pTex != NULL)
+ {
+ nIndex = m_TextureList.AddString(pszTextureName);
+ m_TextureList.SetItemDataPtr(nIndex, pTex);
+ m_TextureList.SetCurSel(nIndex);
+ }
+ }
+
+ UpdateTexture();
+
+ if (nIndex != LB_ERR)
+ {
+ IEditorTexture *pTex = (IEditorTexture *)m_TextureList.GetItemDataPtr(nIndex);
+ m_TextureList.AddMRU(pTex);
+ }
+
+}
+
+
+//-----------------------------------------------------------------------------
+// This class renders a given IEditorTexture in its OnPaint handler. It is used in the
+// texture Find/Replace dialog, the Face Properties dialog, and the texture bar.
+//-----------------------------------------------------------------------------
+BEGIN_MESSAGE_MAP(wndTex, CStatic)
+ ON_WM_PAINT()
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Sets the texture to render in the window.
+// Input : pTex - Texture to render when painting this window.
+//-----------------------------------------------------------------------------
+void wndTex::SetTexture(IEditorTexture *pTex)
+{
+ m_pTexture = pTex;
+ Invalidate();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Paints the texture image (if any) in the window. If not, just fills
+// with gray.
+//-----------------------------------------------------------------------------
+void wndTex::OnPaint(void)
+{
+ // texturewindow.cpp:
+ CPaintDC dc(this);
+
+ CRect r;
+ GetClientRect(r);
+
+ if (!m_pTexture)
+ {
+ FillRect(dc.m_hDC, r, HBRUSH(GetStockObject(BLACK_BRUSH)));
+ return;
+ }
+
+ m_pTexture->Load();
+
+ DrawTexData_t DrawTexData;
+ DrawTexData.nFlags = drawResizeAlways;
+
+ dc.SelectPalette(m_pTexture->HasPalette() ? m_pTexture->GetPalette() : g_pGameConfig->Palette, FALSE);
+ dc.RealizePalette();
+ m_pTexture->Draw(&dc, r, 0, 0, DrawTexData);
+}
+