6#ifdef TOSHI_SKU_WINDOWS
30 ms_oFreeMaterials.PushBack( &ms_oNodesAlloc[ i ] );
31 ms_oNodesAlloc[ i ].iId =
TUINT16( i );
37 if ( bAssetPackLoaded )
50 m_oTRB.Load(
"Data\\MiscTextures\\MaterialProperties.trb" );
51 ms_pWorldEndRender = m_oTRB.GetSymbolAddress(
"WorldEndRender" );
52 ms_pWorldStartRender = m_oTRB.GetSymbolAddress(
"WorldStartRender" );
53 ms_pWorldUVOffsetsPerSec = m_oTRB.GetSymbolAddress(
"WorldUVOffsetsPerSec" );
54 ms_pAlphaRefMaterials = m_oTRB.CastSymbol<
AlphaRefMaterial>(
"AlphaRefMaterials" );
55 ms_pClampedMaterials = m_oTRB.CastSymbol<
ClampedMaterial>(
"ClampedMaterials" );
56 ms_pGlowMaterials = m_oTRB.CastSymbol<
const TCHAR*>(
"GlowMaterials" );
63 ms_iNumGlowMaterials = 0;
64 auto pGlowMaterial = ms_pGlowMaterials;
66 while ( *pGlowMaterial )
68 ms_iNumGlowMaterials += 1;
73 ms_pDoubleSidedMaterials = ( bAssetPackLoaded ) ?
75 m_oTRB.CastSymbol<
const TCHAR*>(
"DoubleSidedMaterials" );
78 ms_iNumDoubleSidedMaterials = 0;
79 auto pDoubleSidedMaterial = ms_pDoubleSidedMaterials;
81 while ( *pDoubleSidedMaterial )
83 ms_iNumDoubleSidedMaterials += 1;
84 pDoubleSidedMaterial++;
88 if ( !bAssetPackLoaded )
89 m_oTRB.DeleteSymbolTable();
91 if (
TNULL == ms_pDefaultSkinMaterial )
94 pSkinMaterial->
Create( 7 );
98 ms_pDefaultSkinMaterial = pSkinMaterial;
101 if (
TNULL == ms_pDefaultWorldMaterial )
104 pWorldMaterial->
Create( 6 );
107 pWorldMaterial->SetTextureNum( 1 );
109 ms_pDefaultWorldMaterial = pWorldMaterial;
117void AModelLoader::MaterialApplyFlags(
TMaterial* a_pMaterial,
const TCHAR* a_szMaterialName )
120 for (
TINT i = 0; i < ms_iNumGlowMaterials; i++ )
130 for (
TINT i = 0; i < ms_iNumDoubleSidedMaterials; i++ )
140void AModelLoader::MaterialApplyClamp(
TMaterial* a_pMaterial,
const TCHAR* a_szMaterialName,
TTexture* a_pTexture )
142 auto pClampedMaterial = ms_pClampedMaterials;
146 if ( pClampedMaterial->szName ==
TNULL )
return;
149 pClampedMaterial += 1;
156 auto pTexture =
TDYNAMICCAST( TTextureResourceHAL, a_pTexture );
158 if ( pClampedMaterial->eAddressUState > 0 )
161 if ( pClampedMaterial->eAddressVState > 0 )
167void AModelLoader::MaterialApplyAlphaRef(
TMaterial* a_pMaterial,
const TCHAR* a_szMaterialName,
TTexture* a_pTexture )
169 auto pAlphaRefMaterial = ms_pAlphaRefMaterials;
173 if ( pAlphaRefMaterial->szName ==
TNULL )
return;
176 pAlphaRefMaterial += 1;
187 char prefixName[ 32 ];
208 materialName += a_szMaterialName;
210 auto pResultMaterial = FindMaterial( materialName );
211 if ( pResultMaterial )
return pResultMaterial;
214 const char* szTextureName;
215 auto pTMDMaterial = FindMaterialInModel( a_szMaterialName );
221 AMaterialLibraryManager::GetSingleton()->FindTexture( pTMDMaterial->szTextureFile )
224 szTextureName = pTMDMaterial->szTextureFile;
228 TTRACE(
"Couldn't find texture for material '%s'", a_szMaterialName );
233 szTextureName =
"invalid";
239 const TBOOL bIsAlpha = eTextureFormat == D3DFMT_A8R8G8B8 ||
240 eTextureFormat == D3DFMT_A4R4G4B4 ||
241 eTextureFormat == D3DFMT_A8R3G3B2 ||
242 eTextureFormat == D3DFMT_DXT5;
248 pMaterial->
Create( bIsAlpha ? 1 : 0 );
251 pResultMaterial = pMaterial;
257 pMaterial->
Create( bIsAlpha ? 1 : 0 );
259 pMaterial->SetTextureNum( 1 );
261 pResultMaterial = pMaterial;
263 TTODO(
"Setup material using properties" );
271 pMaterial->SetTextureNum( 1 );
273 pResultMaterial = pMaterial;
277 TASSERT( !
"Support other shaders" );
280 MaterialApplyFlags( pResultMaterial, a_szMaterialName );
281 MaterialApplyClamp( pResultMaterial, a_szMaterialName, pTexture );
282 MaterialApplyAlphaRef( pResultMaterial, a_szMaterialName, pTexture );
284 TASSERT( !ms_oFreeMaterials.IsEmpty() );
285 auto pMatNode = ms_oFreeMaterials.PopFront();
286 pMatNode->pMaterial = pResultMaterial;
287 pMatNode->iNumRefs = 1;
298 pResultMaterial->SetName( materialName );
299 ms_oUsedMaterials.PushFront( pMatNode );
301 AddMaterial( materialName, pMatNode );
302 return pResultMaterial;
312 if ( 0 < ms_iNumCreatedMaterials )
316 iIndex = ms_oMaterialIds[ iId ];
317 if ( a_pMaterial == ms_oNodesAlloc[ iIndex ].pMaterial )
break;
319 if ( ms_iNumCreatedMaterials <= ++iId )
321 TASSERT( !
"Trying to destroy some unknown material" );
326 ms_oNodesAlloc[ iIndex ].iNumRefs -= 1;
328 if ( ms_oNodesAlloc[ iIndex ].iNumRefs < 1 )
330 ms_oNodesAlloc[ iIndex ].Remove();
331 ms_oNodesAlloc[ iIndex ].pMaterial->Destroy();
332 ms_oNodesAlloc[ iIndex ].pMaterial =
TNULL;
334 ms_oFreeMaterials.PushFront( &ms_oNodesAlloc[ iIndex ] );
335 ms_iNumCreatedMaterials -= 1;
337 if ( iId < ms_iNumCreatedMaterials )
339 TINT16* pNext = ms_oMaterialIds + iId + 1;
340 TINT16* pCurr = ms_oMaterialIds + iId;
342 for (
TINT i = ms_iNumCreatedMaterials - iId; i != 0; i-- )
344 *( pCurr++ ) = *( pNext++ );
353 InitialiseGrassLayersTextures();
356void AModelLoader::AddMaterial(
const TString8& a_rName, MaterialNode* a_pMaterialNode )
360 TINT iMaxIndex = ms_iNumCreatedMaterials;
361 TINT iMaterialIndex = ms_iNumCreatedMaterials / 2;
366 while ( iOffset <= iMaterialIndex )
368 if ( iMaxIndex <= iMaterialIndex )
break;
370 auto pMatNode = &ms_oNodesAlloc[ ms_oMaterialIds[ iMaterialIndex ] ];
373 if ( -1 < iCmpResult )
375 iOffset = iMaterialIndex + 1;
376 iMaterialIndex = iMaxIndex;
379 iMaxIndex = iMaterialIndex;
380 iMaterialIndex = iOffset + ( iMaterialIndex - iOffset ) / 2;
383 if ( iCmpResult < 1 && ( iOffset = iMaterialIndex, iCmpResult < 0 ) )
388 for (
TINT i = ms_iNumCreatedMaterials; iOffset < i; i-- )
390 ms_oMaterialIds[ i ] = ms_oMaterialIds[ i - 1 ];
393 ms_oMaterialIds[ iOffset ] = a_pMaterialNode->iId;
394 ms_iNumCreatedMaterials += 1;
401 TINT iMaxIndex = ms_iNumCreatedMaterials;
402 TINT iMaterialIndex = ms_iNumCreatedMaterials / 2;
406 while ( iOffset <= iMaterialIndex )
408 if ( iMaxIndex <= iMaterialIndex )
break;
410 auto pMatNode = &ms_oNodesAlloc[ ms_oMaterialIds[ iMaterialIndex ] ];
413 if ( iCmpResult == 0 )
415 pMatNode->iNumRefs++;
417 if ( pMatNode->pMaterial )
418 return pMatNode->pMaterial;
423 if ( iCmpResult > -1 )
425 iOffset = iMaterialIndex + 1;
426 iMaterialIndex = iMaxIndex;
429 iMaxIndex = iMaterialIndex;
430 iMaterialIndex = iOffset + ( iMaterialIndex - iOffset ) / 2;
438 for (
TINT i = 0; i < ms_oCurrentModelMaterialsHeader.iNumMaterials; i++ )
442 return &ms_oCurrentModelMaterials[ i ];
449TBOOL AModelLoader::AModelLoaderLoadTMDCallback(
TModel* a_pModel )
454TBOOL AModelLoader::AModelLoaderLoadTRBCallback(
TModel* a_pModel )
458 TTODO(
"Load collision data" );
460 TTMDWin::TRBWinHeader* pHeader = a_pModel->
CastSymbol<TTMDWin::TRBWinHeader>(
"Header" );
461 TTMDBase::MaterialsHeader* pMaterials = a_pModel->
CastSymbol<TTMDBase::MaterialsHeader>(
"Materials" );
464 TUtil::MemCopy( ms_oCurrentModelMaterials, pMaterials + 1, pMaterials->uiSectionSize );
465 ms_oCurrentModelMaterialsHeader = *pMaterials;
472 auto pTRBLod = pHeader->
GetLOD( i );
474 a_pModel->
m_LODs[ i ].
iNumMeshes = pTRBLod->m_iMeshCount1 + pTRBLod->m_iMeshCount2;
480 LoadWorldMeshTRB( a_pModel, i, &a_pModel->
m_LODs[ i ], pTRBLod );
485 LoadSkinLOD( a_pModel, i, &a_pModel->
m_LODs[ i ], pTRBLod );
490 LoadGrassMeshTRB( a_pModel, i, &a_pModel->
m_LODs[ i ], pTRBLod );
494 TASSERT( !
"The model is using an unknown shader" );
#define TOSHI_NAMESPACE_USING
#define TARRAYSIZE(ARRAY)
#define TPROFILER_SCOPE()
#define TDYNAMICCAST(T, OBJECT)
#define TDEFINE_CLASS(...)
static TFORCEINLINE TRenderD3DInterface * Interface()
Gets the render interface singleton.
D3DXIMAGE_INFO & GetImageInfo()
static constexpr TUINT NAMESIZELIMIT
TUINT32 GetTextureNum() const
void SetFlags(Flags a_eFlag, TBOOL a_bEnable)
static void SetLoaderTMDCallback(t_ModelLoaderTMDCallback a_cbLoader)
T * CastSymbol(const TCHAR *a_szSymbolName)
TModelLOD m_LODs[MAX_NUM_LODS]
static void SetLoaderTRBCallback(t_ModelLoaderTRBCallback a_cbLoader)
TRBLODHeader * GetLOD(TINT a_uiIndex)
static TINT String8Compare(const TCHAR *str1, const TCHAR *str2, TSIZE size=-1)
static TCHAR * String8Copy(TCHAR *dst, const TCHAR *src, TSIZE size=-1)
static void * MemCopy(void *dst, const void *src, TSIZE size)
static Toshi::TTRB * GetAssetTRB(AAssetType a_eAssetType)
static void * GetSymbolAddress(const TCHAR *a_szFileName, const TCHAR *a_szSymbolName, AAssetType a_eAssetType)
static T * CastSymbol(const TCHAR *a_szFileName, const TCHAR *a_szSymbolName, AAssetType a_eAssetType)
static void DestroyMaterial(Toshi::TMaterial *a_pMaterial)
static Toshi::TMaterial * CreateMaterial(Toshi::TShader *a_pShader, const TCHAR *a_szMaterialName)
static void InitialiseStatic()
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)
void SetTexture(Toshi::TTexture *a_pTexture)
virtual TBOOL Create(BLENDMODE a_eBlendMode)
void SetTexture(TUINT a_uiStage, Toshi::TTexture *a_pTexture)
virtual TBOOL Create(BLENDMODE a_eBlendMode)