summaryrefslogtreecommitdiff
path: root/hammer/texturesystem.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/texturesystem.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/texturesystem.h')
-rw-r--r--hammer/texturesystem.h375
1 files changed, 375 insertions, 0 deletions
diff --git a/hammer/texturesystem.h b/hammer/texturesystem.h
new file mode 100644
index 0000000..4baf2f3
--- /dev/null
+++ b/hammer/texturesystem.h
@@ -0,0 +1,375 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Texture management functions. Exposes a list of available textures,
+// texture groups, and Most Recently Used textures.
+//
+//=============================================================================//
+
+#ifndef TEXTURESYSTEM_H
+#define TEXTURESYSTEM_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "IEditorTexture.h"
+#include "Material.h"
+#include "utlvector.h"
+#include "utldict.h"
+#include "FileChangeWatcher.h"
+
+
+class CGameConfig;
+class CTextureSystem;
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Defines the interface to a set of textures of a given texture format.
+// The textures are stored as an index into the global array of textures.
+//-----------------------------------------------------------------------------
+class CTextureGroup
+{
+public:
+ CTextureGroup(const char *pszName);
+
+ inline const char *GetName()
+ {
+ return(m_szName);
+ }
+
+ inline int GetCount(void)
+ {
+ return m_Textures.Count();
+ }
+
+ inline TEXTUREFORMAT GetTextureFormat(void)
+ {
+ return(m_eTextureFormat);
+ }
+
+ inline void SetTextureFormat(TEXTUREFORMAT eTextureFormat)
+ {
+ m_eTextureFormat = eTextureFormat;
+ }
+
+ void AddTexture(IEditorTexture *pTexture);
+ void Sort(void);
+
+ IEditorTexture *GetTexture(int nIndex);
+ IEditorTexture* GetTexture( char const* pName );
+
+ // Fast find texture..
+ IEditorTexture* FindTextureByName( const char *pName, int *piIndex, TEXTUREFORMAT eDesiredFormat );
+
+ // Used to lazily load in all the textures
+ void LazyLoadTextures();
+
+protected:
+
+ char m_szName[MAX_PATH];
+ TEXTUREFORMAT m_eTextureFormat;
+ CUtlVector<IEditorTexture *> m_Textures;
+ CUtlDict<int,int> m_TextureNameMap; // Maps the texture name to an index into m_Textures (the key is IEditorTexture::GetName).
+
+ // Used to lazily load the textures in the group
+ int m_nTextureToLoad;
+};
+
+
+typedef CUtlVector<CTextureGroup *> TextureGroupList_t;
+
+
+typedef struct tagGF
+{
+ char filename[MAX_PATH];
+ DWORD id;
+ int fd;
+ TEXTUREFORMAT format;
+ BOOL bLoaded;
+
+} GRAPHICSFILESTRUCT;
+
+
+//
+// When the user switches game configs, all the textures and materials are switched.
+// This structure holds all the context necessary to accomplish this.
+//
+struct TextureContext_t
+{
+ CGameConfig *pConfig; // The game config that this texture context corresponds to.
+ CTextureGroup *pAllGroup;
+ TextureGroupList_t Groups;
+ EditorTextureList_t MRU; // List of Most Recently Used textures, first is the most recent.
+ EditorTextureList_t Dummies; // List of Dummy textures - textures that were created to hold the place of missing textures.
+};
+
+
+class CMaterialFileChangeWatcher : private CFileChangeWatcher::ICallbacks
+{
+public:
+ void Init( CTextureSystem *pSystem, int context );
+ void Update(); // Call this periodically to update.
+
+private:
+ // CFileChangeWatcher::ICallbacks..
+ virtual void OnFileChange( const char *pRelativeFilename, const char *pFullFilename );
+
+private:
+ CFileChangeWatcher m_Watcher;
+ CTextureSystem *m_pTextureSystem;
+ int m_Context;
+};
+
+
+class CTextureSystem : public IMaterialEnumerator
+{
+public:
+ friend class CMaterialFileChangeWatcher;
+
+ CTextureSystem(void);
+ virtual ~CTextureSystem(void);
+
+ bool Initialize(HWND hwnd);
+ void ShutDown(void);
+
+ void SetActiveConfig(CGameConfig *pConfig);
+
+ //
+ // Exposes a list of all texture (WAD) files.
+ //
+ inline int FilesGetCount(void) const;
+ inline void FilesGetInfo(GRAPHICSFILESTRUCT *pFileInfo, int nIndex) const;
+ bool FindGraphicsFile(GRAPHICSFILESTRUCT *pFileInfo, DWORD id, int *piIndex = NULL);
+
+ //
+ // Exposes a list of texture groups (sets of textures of a given format).
+ //
+ void SetActiveGroup(const char *pcszName);
+ inline int GroupsGetCount() const;
+ inline CTextureGroup *GroupsGet(int nIndex) const;
+
+ //
+ // Exposes a list of active textures based on the currently active texture group.
+ //
+ inline int GetActiveTextureCount(void) const;
+ inline IEditorTexture *GetActiveTexture(int nIndex) const;
+ IEditorTexture *EnumActiveTextures(int *piIndex, TEXTUREFORMAT eDesiredFormat) const;
+ IEditorTexture *FindActiveTexture(LPCSTR pszName, int *piIndex = NULL, BOOL bDummy = TRUE);
+ bool HasTexturesForConfig(CGameConfig *pConfig);
+
+ //
+ // Exposes a list of Most Recently Used textures.
+ //
+ void AddMRU(IEditorTexture *pTex);
+ inline int MRUGetCount() const;
+ inline IEditorTexture *MRUGet(int nIndex) const;
+
+ //
+ // Exposes a list of all unique keywords found in the master texture list.
+ //
+ int GetNumKeywords();
+ const char *GetKeyword(int index);
+
+ //
+ // Holds a list of placeholder textures used when a map refers to missing textures.
+ //
+ IEditorTexture *AddDummy(LPCTSTR pszName, TEXTUREFORMAT eFormat);
+
+ //
+ // Load graphics files from options list.
+ //
+ void LoadAllGraphicsFiles(void);
+ void InformPaletteChanged(void);
+
+ // IMaterialEnumerator interface, Used to add all the world materials into the material list.
+ bool EnumMaterial( const char *pMaterialName, int nContext );
+
+ // Used to lazily load in all the textures during app idle.
+ void LazyLoadTextures();
+
+ // Registers the keywords as existing in a particular material.
+ void RegisterTextureKeywords( IEditorTexture *pTexture );
+
+ // Opens the source file associated with a material.
+ void OpenSource( const char *pMaterialName );
+
+ // Reload individual textures.
+ void ReloadTextures( const char *pFilterName );
+
+ // bind local cubemap again
+ void RebindDefaultCubeMap();
+
+ void UpdateFileChangeWatchers();
+
+ // Gets tools/toolsnodraw
+ IEditorTexture* GetNoDrawTexture() { return m_pNoDrawTexture; }
+
+ int AddTexture( IEditorTexture *pTexture );
+
+protected:
+
+// CMaterialFileChangeWatcher stuff - watches for changes to VMTs or VTFs and handles them.
+
+ enum EFileType
+ {
+ k_eFileTypeVMT,
+ k_eFileTypeVTF
+ };
+ void OnFileChange( const char *pFilename, int context, EFileType eFileType );
+ void ReloadMaterialsUsingTexture( ITexture *pTestTexture );
+
+ static bool GetFileTypeFromFilename( const char *pFilename, CTextureSystem::EFileType *pFileType );
+
+ CUtlVector<CMaterialFileChangeWatcher*> m_ChangeWatchers;
+
+// Internal stuff.
+
+ void FreeAllTextures();
+
+ TextureContext_t *AddTextureContext();
+ TextureContext_t *FindTextureContextForConfig(CGameConfig *pConfig);
+
+ void LoadMaterials(CGameConfig *pConfig);
+ void LoadWADFiles(CGameConfig *pConfig);
+
+
+ DWORD LoadGraphicsFile(const char *pFilename);
+ void LoadGraphicsFileWAD3(GRAPHICSFILESTRUCT *pFile, int fd, CTextureGroup *pGroup);
+
+ //
+ // Array of open graphics files.
+ //
+ CUtlVector<GRAPHICSFILESTRUCT> m_GraphicsFiles;
+
+ //
+ // Master array of textures.
+ //
+ CUtlVector<IEditorTexture *> m_Textures;
+
+ IEditorTexture *m_pLastTex;
+ int m_nLastIndex;
+
+ //
+ // List of groups (sets of textures of a given texture format). Only one
+ // group can be active at a time, based on the game configuration.
+ //
+ CUtlVector<TextureContext_t> m_TextureContexts; // One per game config.
+ TextureContext_t *m_pActiveContext; // Points to the active entry in m_TextureContexts.
+ CTextureGroup *m_pActiveGroup; // Points to the active entry in m_TextureContexts.
+
+ //
+ // List of keywords found in all textures.
+ //
+ CUtlVector<const char *> m_Keywords;
+
+ // default cubemap
+ ITexture *m_pCubemapTexture;
+
+ // tools/toolsnodraw
+ IEditorTexture* m_pNoDrawTexture;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CTextureSystem::FilesGetCount(void) const
+{
+ return(m_GraphicsFiles.Count());
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pFileInfo -
+// nIndex -
+//-----------------------------------------------------------------------------
+void CTextureSystem::FilesGetInfo(GRAPHICSFILESTRUCT *pFileInfo, int nIndex) const
+{
+ if (pFileInfo != NULL)
+ {
+ *pFileInfo = m_GraphicsFiles[nIndex];
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns the number of textures in the active group.
+//-----------------------------------------------------------------------------
+int CTextureSystem::GetActiveTextureCount(void) const
+{
+ if (m_pActiveGroup != NULL)
+ {
+ return m_pActiveGroup->GetCount();
+ }
+
+ return(0);
+}
+
+
+IEditorTexture *CTextureSystem::GetActiveTexture(int nIndex) const
+{
+ if (m_pActiveGroup != NULL)
+ {
+ return m_pActiveGroup->GetTexture(nIndex);
+ }
+
+ return NULL;
+}
+
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CTextureSystem::GroupsGetCount() const
+{
+ if (!m_pActiveContext)
+ return 0;
+
+ return m_pActiveContext->Groups.Count();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CTextureGroup *CTextureSystem::GroupsGet(int nIndex) const
+{
+ if (!m_pActiveContext)
+ return NULL;
+
+ return m_pActiveContext->Groups.Element(nIndex);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Initiates an iteration of the MRU list.
+//-----------------------------------------------------------------------------
+int CTextureSystem::MRUGetCount() const
+{
+ if (!m_pActiveContext)
+ return NULL;
+
+ return m_pActiveContext->MRU.Count();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns the next texture in the MRU of the given format.
+// Input : pos - Iterator.
+// eDesiredFormat - Texture format to return.
+// Output : Pointer to the texture.
+//-----------------------------------------------------------------------------
+IEditorTexture *CTextureSystem::MRUGet(int nIndex) const
+{
+ if (!m_pActiveContext)
+ return NULL;
+
+ return m_pActiveContext->MRU.Element(nIndex);
+}
+
+
+extern CTextureSystem g_Textures;
+
+
+#endif // TEXTURESYSTEM_H