OpenBarnyard
 
Loading...
Searching...
No Matches
ASkinLightingManager.cpp
Go to the documentation of this file.
1#include "pch.h"
6
8
9//-----------------------------------------------------------------------------
10// Enables memory debugging.
11// Note: Should be the last include!
12//-----------------------------------------------------------------------------
13#include <Core/TMemoryDebugOn.h>
14
16
17// $Barnyard: FUNCTION 0060dd70
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)
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}
69
70// $Barnyard: FUNCTION 0060dd70
72{
73 AMaterialLibraryManager::List::GetSingleton()->DestroyLibrary( m_pSkinLightMatLib );
74}
75
76// $Barnyard: FUNCTION 0060dcc0
77void ASkinLightingManager::ApplySkinLight( Toshi::TManagedModel* a_pModel, const TCHAR* a_szMaterialName, SkinLight* a_pLight )
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}
109
110// $Barnyard: FUNCTION 0060dc40
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}
@ SYSRESOURCE_TEXTUREFACTORY
Definition TRender.h:20
Rendering system interface for the Toshi engine.
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TVALIDPTR(PTR)
Definition Defines.h:139
#define TGetClass(CLASS)
Definition TObject.h:13
char TCHAR
Definition Typedefs.h:20
#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
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
T * GetSystemResource(SYSRESOURCE systemResource)
virtual TTexture * CreateFromT2Texture(T2Texture *a_pTexture)=0
static TFORCEINLINE TRenderInterface * GetSingleton()
Definition TSingleton.h:49
static TINT String8CompareNoCase(const TCHAR *str1, const TCHAR *str2, TSIZE size=-1)
static Toshi::TTRB * GetAssetTRB(AAssetType a_eAssetType)
SkinLight * FindSkinLight(const TCHAR *a_szMaterialName)
void ApplySkinLight(Toshi::TManagedModel *a_pModel, const TCHAR *a_szMaterialName, SkinLight *a_pLight)
void SetLightingTexture(ELightingTexture a_eTex, Toshi::TTexture *a_pTexture)