1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
|
//========= Copyright 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 GetImageWidth(void) const;
int GetImageHeight(void) const;
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_nWidth != 0) && (m_nHeight != 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_nWidth; // Texture width in texels.
int m_nHeight; // 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
|