You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
376 lines
9.8 KiB
376 lines
9.8 KiB
5 years ago
|
//========= 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
|