csgo-2018-source/hammer/material.h
2021-07-24 21:11:47 -07:00

265 lines
6.7 KiB
C++

//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
//
// Purpose: Implementation of IEditorTexture interface for materials.
//
// $NoKeywords: $
//===========================================================================//
#ifndef MATERIAL_H
#define MATERIAL_H
#pragma once
#include "IEditorTexture.h"
#include "materialsystem/IMaterialVar.h"
#include "materialsystem/IMaterial.h"
class IMaterial;
class CMaterialCache;
class IMaterialSystem;
class IMaterialSystemHardwareConfig;
struct MaterialSystem_Config_t;
struct MaterialCacheEntry_t;
#define INCLUDE_MODEL_MATERIALS 0x01
#define INCLUDE_WORLD_MATERIALS 0x02
#define INCLUDE_ALL_MATERIALS 0xFFFFFFFF
//-----------------------------------------------------------------------------
// Inherit from this to enumerate materials
//-----------------------------------------------------------------------------
class IMaterialEnumerator
{
public:
virtual bool EnumMaterial( const char *pMaterialName, int nContext ) = 0;
};
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CMaterial : public IEditorTexture
{
public:
static bool Initialize( HWND hwnd );
static void ShutDown(void);
static void EnumerateMaterials( IMaterialEnumerator *pEnum, const char *szRoot, int nContext, int nFlags = INCLUDE_ALL_MATERIALS );
static CMaterial *CreateMaterial( const char *pszMaterialName, bool bLoadImmediately, bool* pFound = 0 );
virtual ~CMaterial(void);
void Draw(CDC *pDC, RECT& rect, int iFontHeight, int iIconHeight, DrawTexData_t &DrawTexData); //DWORD dwFlags = (drawCaption|drawIcons));
void FreeData(void);
inline const char *GetName(void) const
{
return(m_szName);
}
int GetShortName(char *pszName) const;
int GetKeywords(char *pszKeywords) const;
void GetSize(SIZE &size) const;
int GetImageDataRGB(void *pImageRGB);
int GetImageDataRGBA(void *pImageRGBA);
// Image dimensions
int GetPreviewImageWidth(void) const;
int GetPreviewImageHeight(void) const;
int GetMappingWidth(void) const;
int GetMappingHeight(void) const;
// todo: remove these. They are the same as GetPreviewImageWidth, etc.
int GetWidth(void) const;
int GetHeight(void) const;
float GetDecalScale(void) const;
const char *GetFileName(void) const;
inline CPalette *GetPalette(void) const
{
return(NULL);
}
inline int GetSurfaceAttributes(void) const
{
return(0);
}
inline int GetSurfaceContents(void) const
{
return(0);
}
inline int GetSurfaceValue(void) const
{
return(0);
}
inline TEXTUREFORMAT GetTextureFormat(void) const
{
return(tfVMT);
}
inline int GetTextureID(void) const
{
return(m_nTextureID);
}
bool HasAlpha(void) const
{
return(false);
}
inline bool HasData(void) const
{
return((m_nPreviewImageWidth != 0) && (m_nPreviewImageHeight != 0));
}
inline bool HasPalette(void) const
{
return(false);
}
inline bool IsDummy(void) const
{
return(false);
}
bool Load(void);
void Reload( bool bFullReload );
inline bool IsLoaded() const
{
return m_bLoaded;
}
inline void SetTextureID(int nTextureID)
{
m_nTextureID = nTextureID;
}
bool IsWater( void ) const;
virtual IMaterial* GetMaterial( bool bForceLoad=true );
protected:
// Used to draw the bitmap for the texture browser
void DrawBitmap( CDC *pDC, RECT& srcRect, RECT& dstRect );
void DrawBrowserIcons( CDC *pDC, RECT& dstRect, bool detectErrors );
void DrawIcon( CDC *pDC, CMaterial* pIcon, RECT& dstRect );
static bool ShouldSkipMaterial(const char *pszName, int nFlags);
// Finds all .VMT files in a particular directory
static bool LoadMaterialsInDirectory( char const* pDirectoryName, int nDirectoryNameLen,
IMaterialEnumerator *pEnum, int nContext, int nFlags );
// Discovers all .VMT files lying under a particular directory recursively
static bool InitDirectoryRecursive( char const* pDirectoryName,
IMaterialEnumerator *pEnum, int nContext, int nFlags );
CMaterial(void);
bool LoadMaterialHeader(IMaterial *material);
bool LoadMaterialImage();
static bool IsIgnoredMaterial( const char *pName );
// Will actually load the material bits
// We don't want to load them all at once because it takes way too long
bool LoadMaterial();
char m_szName[MAX_PATH];
char m_szFileName[MAX_PATH];
char m_szKeywords[MAX_PATH];
int m_nTextureID; // Uniquely identifies this texture in all 3D renderers.
int m_nPreviewImageWidth; // Texture width in texels.
int m_nPreviewImageHeight; // Texture height in texels.
bool m_TranslucentBaseTexture;
bool m_bLoaded; // We don't load these immediately; only when needed..
void *m_pData; // Loaded texel data (NULL if not loaded).
IMaterial *m_pMaterial;
friend class CMaterialImageCache;
};
typedef CMaterial *CMaterialPtr;
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CMaterialCache
{
public:
CMaterialCache(void);
~CMaterialCache(void);
inline bool CacheExists(void);
bool Create(int nMaxEntries);
CMaterial *CreateMaterial(const char *pszMaterialName);
void AddRef(CMaterial *pMaterial);
void Release(CMaterial *pMaterial);
protected:
CMaterial *FindMaterial(const char *pszMaterialName);
void AddMaterial(CMaterial *pMaterial);
MaterialCacheEntry_t *m_pCache;
int m_nMaxEntries;
int m_nEntries;
};
//-----------------------------------------------------------------------------
// Purpose: Returns true if the cache has been allocated, false if not.
//-----------------------------------------------------------------------------
inline bool CMaterialCache::CacheExists(void)
{
return((m_pCache != NULL) && (m_nMaxEntries > 0));
}
//-----------------------------------------------------------------------------
// returns the material system interface + config
//-----------------------------------------------------------------------------
inline IMaterialSystem *MaterialSystemInterface()
{
return materials;
}
inline MaterialSystem_Config_t& MaterialSystemConfig()
{
extern MaterialSystem_Config_t g_materialSystemConfig;
return g_materialSystemConfig;
}
inline IMaterialSystemHardwareConfig* MaterialSystemHardwareConfig()
{
extern IMaterialSystemHardwareConfig* g_pMaterialSystemHardwareConfig;
return g_pMaterialSystemHardwareConfig;
}
//--------------------------------------------------------------------------------
// call AllocateLightingPreviewtextures to make sure necessary rts are allocated
//--------------------------------------------------------------------------------
void AllocateLightingPreviewtextures(void);
#endif // MATERIAL_H