184{
186
187 char prefixName[ 32 ];
188
189 if ( a_pShader->IsA( &
TGetClass( ASkinShader ) ) )
190 {
192 }
193 else if ( a_pShader->IsA( &
TGetClass( AWorldShader ) ) )
194 {
196 }
197 else if ( a_pShader->IsA( &
TGetClass( AGrassShader ) ) )
198 {
200 }
201 else
202 {
205 }
206
207 TString8 materialName = prefixName;
208 materialName += a_szMaterialName;
209
210 auto pResultMaterial = FindMaterial( materialName );
211 if ( pResultMaterial ) return pResultMaterial;
212
213 TTextureResourceHAL* pTexture;
214 const char* szTextureName;
215 auto pTMDMaterial = FindMaterialInModel( a_szMaterialName );
216
217 if ( pTMDMaterial )
218 {
220 TTextureResourceHAL,
221 AMaterialLibraryManager::GetSingleton()->FindTexture( pTMDMaterial->szTextureFile )
222 );
223
224 szTextureName = pTMDMaterial->szTextureFile;
225 }
226 else
227 {
228 TTRACE(
"Couldn't find texture for material '%s'", a_szMaterialName );
230 TTextureResourceHAL,
232 );
233 szTextureName = "invalid";
234 }
235
237
239 const TBOOL bIsAlpha = eTextureFormat == D3DFMT_A8R8G8B8 ||
240 eTextureFormat == D3DFMT_A4R4G4B4 ||
241 eTextureFormat == D3DFMT_A8R3G3B2 ||
242 eTextureFormat == D3DFMT_DXT5;
243
244 if ( a_pShader->IsA( &
TGetClass( ASkinShader ) ) )
245 {
246 ASkinShaderHAL* pShader =
TDYNAMICCAST( ASkinShaderHAL, a_pShader );
248 pMaterial->
Create( bIsAlpha ? 1 : 0 );
250
251 pResultMaterial = pMaterial;
252 }
253 else if ( a_pShader->IsA( &
TGetClass( AWorldShader ) ) )
254 {
255 AWorldShaderHAL* pShader =
TDYNAMICCAST( AWorldShaderHAL, a_pShader );
257 pMaterial->
Create( bIsAlpha ? 1 : 0 );
259 pMaterial->SetTextureNum( 1 );
260
261 pResultMaterial = pMaterial;
262
263 TTODO(
"Setup material using properties" );
264 }
265 else if ( a_pShader->IsA( &
TGetClass( AGrassShader ) ) )
266 {
267 AGrassShaderHAL* pShader =
TDYNAMICCAST( AGrassShaderHAL, a_pShader );
271 pMaterial->SetTextureNum( 1 );
272
273 pResultMaterial = pMaterial;
274 }
275 else
276 {
277 TASSERT( !
"Support other shaders" );
278 }
279
280 MaterialApplyFlags( pResultMaterial, a_szMaterialName );
281 MaterialApplyClamp( pResultMaterial, a_szMaterialName, pTexture );
282 MaterialApplyAlphaRef( pResultMaterial, a_szMaterialName, pTexture );
283
284 TASSERT( !ms_oFreeMaterials.IsEmpty() );
285 auto pMatNode = ms_oFreeMaterials.PopFront();
286 pMatNode->pMaterial = pResultMaterial;
287 pMatNode->iNumRefs = 1;
288
291
292
294 {
296 }
297
298 pResultMaterial->SetName( materialName );
299 ms_oUsedMaterials.PushFront( pMatNode );
300
301 AddMaterial( materialName, pMatNode );
302 return pResultMaterial;
303}
#define TPROFILER_SCOPE()
#define TDYNAMICCAST(T, OBJECT)
static TFORCEINLINE TRenderD3DInterface * Interface()
Gets the render interface singleton.
D3DXIMAGE_INFO & GetImageInfo()
static constexpr TUINT NAMESIZELIMIT
static TCHAR * String8Copy(TCHAR *dst, const TCHAR *src, TSIZE size=-1)
virtual AGrassMaterial * CreateMaterial(const TCHAR *a_szName) override
virtual ASkinMaterial * CreateMaterial(const TCHAR *a_szName) override
virtual AWorldMaterial * CreateMaterial(const TCHAR *a_szName) override
virtual TBOOL Create(BLENDMODE a_eBlendMode)
void SetTexture(TUINT a_uiStage, Toshi::TTexture *a_pTexture)