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/texturesystem.h | |
| download | archived-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.h | 375 |
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 |