OpenBarnyard
 
Loading...
Searching...
No Matches
ASkinLightingManager Class Reference

#include <ASkinLightingManager.h>

Inheritance diagram for ASkinLightingManager:

Classes

struct  SkinLight
 
struct  SkinLightTRBHeader
 

Public Member Functions

 ASkinLightingManager ()
 
 ~ASkinLightingManager ()
 
void ApplySkinLight (Toshi::TManagedModel *a_pModel, const TCHAR *a_szMaterialName, SkinLight *a_pLight)
 
SkinLightFindSkinLight (const TCHAR *a_szMaterialName)
 

Detailed Description

Definition at line 7 of file ASkinLightingManager.h.

Constructor & Destructor Documentation

◆ ASkinLightingManager()

ASkinLightingManager::ASkinLightingManager ( )

Definition at line 18 of file ASkinLightingManager.cpp.

19{
20 m_iUnk = 0;
21
22 // Load the matlib that contains all lighting textures
23 m_pSkinLightMatLib = AMaterialLibraryManager::List::GetSingleton()->CreateLibraryFromAsset(
24 "Data\\MiscTextures\\SkinLighttex.ttl",
26 );
27
28 // Get texture factory to actually create TTexture objects (not sure why duplicates are needed)
29 TTextureFactory* pTexFactory = TRenderInterface::GetSingleton()->GetSystemResource<TTextureFactory>(
31 );
32
33 TTRB::ERROR eError = m_oTRB.Load( "Data\\MiscTextures\\SkinLighting.trb" );
34 TASSERT( eError == TTRB::ERROR_OK );
35
36 m_pSkinLightHeader = m_oTRB.CastSymbol<SkinLightTRBHeader>( "skinlight" );
37 TASSERT( m_pSkinLightHeader != TNULL );
38
39 for ( TINT i = 0; i < m_pSkinLightHeader->iNumLights; i++ )
40 {
41 SkinLight& skinLight = m_pSkinLightHeader->pSkinLights[ i ];
42
43 // Get texture indices
44 TINT iTex1 = m_pSkinLightMatLib->FindTextureIndex( skinLight.szTex1 );
45 TINT iTex2 = m_pSkinLightMatLib->FindTextureIndex( skinLight.szTex2 );
46 TINT iTex3 = m_pSkinLightMatLib->FindTextureIndex( skinLight.szTex3 );
47 TINT iTex4 = m_pSkinLightMatLib->FindTextureIndex( skinLight.szTex4 );
48
49 if ( iTex4 < 0 )
50 iTex4 = iTex2;
51
52 // Create the textures
53
54 if ( iTex1 > -1 )
55 skinLight.pTex1 = pTexFactory->CreateFromT2Texture( m_pSkinLightMatLib->GetTexture( iTex1 )->pTexture );
56
57 if ( iTex2 > -1 )
58 skinLight.pTex2 = pTexFactory->CreateFromT2Texture( m_pSkinLightMatLib->GetTexture( iTex2 )->pTexture );
59
60 if ( iTex3 > -1 )
61 skinLight.pTex3 = pTexFactory->CreateFromT2Texture( m_pSkinLightMatLib->GetTexture( iTex3 )->pTexture );
62
63 if ( iTex4 > -1 )
64 skinLight.pTex4 = pTexFactory->CreateFromT2Texture( m_pSkinLightMatLib->GetTexture( iTex4 )->pTexture );
65 }
66
67 m_oTRB.DeleteSymbolTable();
68}
@ SYSRESOURCE_TEXTUREFACTORY
Definition TRender.h:20
#define TASSERT(X,...)
Definition Defines.h:138
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
@ AAssetType_Startup
Definition AAssetLoader.h:8
@ ERROR_OK
Definition TTRB.h:258
TUINT8 ERROR
Definition TTRB.h:255
T * GetSystemResource(SYSRESOURCE systemResource)
virtual TTexture * CreateFromT2Texture(T2Texture *a_pTexture)=0
static TFORCEINLINE TRenderInterface * GetSingleton()
Definition TSingleton.h:49
static Toshi::TTRB * GetAssetTRB(AAssetType a_eAssetType)

◆ ~ASkinLightingManager()

ASkinLightingManager::~ASkinLightingManager ( )

Definition at line 71 of file ASkinLightingManager.cpp.

72{
73 AMaterialLibraryManager::List::GetSingleton()->DestroyLibrary( m_pSkinLightMatLib );
74}

Member Function Documentation

◆ ApplySkinLight()

void ASkinLightingManager::ApplySkinLight ( Toshi::TManagedModel * a_pModel,
const TCHAR * a_szMaterialName,
SkinLight * a_pLight )

Definition at line 77 of file ASkinLightingManager.cpp.

78{
79 TModel* pModel = a_pModel->GetModel();
80
81 if ( pModel->GetNumLODs() != 0 )
82 {
83 TModelLOD& lod = pModel->GetLOD( 0 );
84
85 for ( TINT i = 0; i < lod.iNumMeshes; i++ )
86 // Apply skin light for each mesh of the first LOD
87 {
88 if ( !lod.ppMeshes[ i ]->GetMaterial()->GetClass()->IsA( &TGetClass( ASkinMaterial ) ) )
89 continue;
90
91 // This is certainly a mesh with some skin material
92 ASkinMaterial* pMaterial = TSTATICCAST( ASkinMaterial, lod.ppMeshes[ i ]->GetMaterial() );
93
94 SkinLight* pLight = a_pLight;
95 if ( !a_szMaterialName || TStringManager::String8CompareNoCase( a_szMaterialName, pMaterial->GetName() ) != 0 || !pLight )
96 {
97 pLight = FindSkinLight( pMaterial->GetName() );
98 }
99
100 TVALIDPTR( pLight );
101 pMaterial->SetLightingTexture( ASkinMaterial::LT_0, pLight->pTex2 );
102 pMaterial->SetLightingTexture( ASkinMaterial::LT_1, pLight->pTex1 );
103 pMaterial->SetLightingTexture( ASkinMaterial::LT_2, pLight->pTex4 );
104 pMaterial->SetLightingTexture( ASkinMaterial::LT_3, pLight->pTex3 );
105 pMaterial->SetTextureNum( 5 );
106 }
107 }
108}
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TVALIDPTR(PTR)
Definition Defines.h:139
#define TGetClass(CLASS)
Definition TObject.h:13
TINT iNumMeshes
Definition TModel.h:27
TMesh ** ppMeshes
Definition TModel.h:28
TINT GetNumLODs() const
Definition TModel.h:111
TModelLOD & GetLOD(TUINT32 a_uiLOD)
Definition TModel.h:115
static TINT String8CompareNoCase(const TCHAR *str1, const TCHAR *str2, TSIZE size=-1)
SkinLight * FindSkinLight(const TCHAR *a_szMaterialName)
void SetLightingTexture(ELightingTexture a_eTex, Toshi::TTexture *a_pTexture)

◆ FindSkinLight()

ASkinLightingManager::SkinLight * ASkinLightingManager::FindSkinLight ( const TCHAR * a_szMaterialName)

Definition at line 111 of file ASkinLightingManager.cpp.

112{
113 TVALIDPTR( m_pSkinLightHeader );
114
115 for ( TINT i = 0; i < m_pSkinLightHeader->iNumLights; i++ )
116 {
117 SkinLight* pSkinLight = &m_pSkinLightHeader->pSkinLights[ i ];
118
119 for ( TINT k = 0; k < pSkinLight->iNumModels; k++ )
120 {
121 if ( !TStringManager::String8CompareNoCase( pSkinLight->pszModels[ k ], a_szModelName ) )
122 return pSkinLight;
123 }
124 }
125
126 TASSERT( m_pSkinLightHeader->iNumLights != 0 );
127 return &m_pSkinLightHeader->pSkinLights[ 0 ];
128}

The documentation for this class was generated from the following files: