OpenBarnyard
 
Loading...
Searching...
No Matches
TModel.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
2#include "TModel.h"
3
5
6//-----------------------------------------------------------------------------
7// Enables memory debugging.
8// Note: Should be the last include!
9//-----------------------------------------------------------------------------
10#include "Core/TMemoryDebugOn.h"
11
13
14// $Barnyard: FUNCTION 006cdf20
30
31// $Barnyard: FUNCTION 006cdff0
32// $Barnyard: FUNCTION 006ce130
36
37// $Barnyard: FUNCTION 006ce3e0
39{
41
42 // Load skeleton
43 if ( auto pSkeletonHeader = TSTATICCAST( TTMDBase::SkeletonHeader, GetSymbol( "SkeletonHeader" ) ) )
44 {
45 m_pSkeleton = TSTATICCAST( TSkeleton, GetSymbol( "Skeleton" ) );
46 TKeyframeLibrary* pLibrary = TRenderInterface::GetSingleton()->GetKeyframeLibraryManager().GetLibrary( pSkeletonHeader->m_szTKLName );
47
48 if ( !pLibrary )
49 {
50 TERROR( "TModel: loading a model without required keyframe library: %s\n", pSkeletonHeader->m_szTKLName );
51 }
52
53 m_pSkeleton->GetKeyLibraryInstance().CreateEx(
54 pLibrary,
55 pSkeletonHeader->m_iTKeyCount,
56 pSkeletonHeader->m_iQKeyCount,
57 pSkeletonHeader->m_iSKeyCount,
58 pSkeletonHeader->m_iTBaseIndex,
59 pSkeletonHeader->m_iQBaseIndex,
60 pSkeletonHeader->m_iSBaseIndex
61 );
62 }
63
64 // Load collision
65 auto pCollisionHeader = TSTATICCAST( TTMDBase::CollisionHeader, GetSymbol( "Collision" ) );
66 TASSERT( TNULL != pCollisionHeader );
67
68 m_iNumCollisionMeshes = pCollisionHeader->m_iNumMeshes;
69 m_pCollisionMeshes = new TModelCollisionMesh[ pCollisionHeader->m_iNumMeshes ];
70
71 // Copy info about the collision meshes
72 for ( TINT i = 0; i < pCollisionHeader->m_iNumMeshes; i++ )
73 {
74 auto& collisionMesh = m_pCollisionMeshes[ i ];
75 const auto& collisionMeshHeader = pCollisionHeader->m_pMeshes[ i ];
76
77 // Copy base info
78 collisionMesh.m_Unk1 = collisionMeshHeader.m_Unk1;
79 collisionMesh.m_pVertices = collisionMeshHeader.m_pVertices;
80 collisionMesh.m_uiNumVertices = collisionMeshHeader.m_uiNumVertices;
81 collisionMesh.m_pIndices = collisionMeshHeader.m_pIndices;
82 collisionMesh.m_uiNumIndices = collisionMeshHeader.m_uiNumIndices;
83
84 // Reserve space for collision types
85 collisionMesh.m_vecCollTypes.SetSize( collisionMeshHeader.m_uiNumCollTypes, TModelCollisionType{} );
86
87 // Copy collision types
88 for ( TUINT k = 0; k < collisionMeshHeader.m_uiNumCollTypes; k++ )
89 {
90 collisionMesh.m_vecCollTypes[ k ].strName = collisionMeshHeader.m_pCollTypes[ k ].pszName;
91 collisionMesh.m_vecCollTypes[ k ].uiUnk1 = collisionMeshHeader.m_pCollTypes[ k ].iUnk1;
92 collisionMesh.m_vecCollTypes[ k ].uiUnk2 = collisionMeshHeader.m_pCollTypes[ k ].iUnk2;
93
94 // TODO: figure out what it is
95 collisionMesh.m_vecCollTypes[ k ].vecS1.SetSize( collisionMeshHeader.m_pCollTypes[ k ].iSomeCount );
96 collisionMesh.m_vecCollTypes[ k ].uiUnk3 = 0;
97 collisionMesh.m_vecCollTypes[ k ].uiUnk4 = 0;
98
99 for ( TINT j = 0; j < collisionMeshHeader.m_pCollTypes[ k ].iSomeCount; j++ )
100 {
101 collisionMesh.m_vecCollTypes[ k ].vecS1[ j ].uiUnk1 = collisionMeshHeader.m_pCollTypes[ k ].pS1[ j ].uiUnk1;
102 collisionMesh.m_vecCollTypes[ k ].vecS1[ j ].uiUnk2 = collisionMeshHeader.m_pCollTypes[ k ].pS1[ j ].uiUnk2;
103 }
104 }
105 }
106
107 // Now let some client modelloader handle this
108 TASSERT( ms_cbModelLoaderTRB != TNULL, "Loader callback is not specified" );
109 ms_cbModelLoaderTRB( this );
110
112 return TTRUE;
113}
114
115// $Barnyard: FUNCTION 006ce8c0
117{
119 m_pTRB = a_pTRB;
120
121 return LoadTRB();
122}
123
124// $Barnyard: FUNCTION 006ce820
125TBOOL TModel::LoadTRB( const TCHAR* a_szFileName, TTRB* a_pAssetTRB, TUINT8 a_ui8FileNameLen )
126{
127 if ( !m_bIsAssetFile && m_pTRB )
128 {
129 delete m_pTRB;
130 }
131
132 if ( a_pAssetTRB )
133 {
134 m_pTRB = a_pAssetTRB;
136 m_szSymbolPrefix = a_szFileName;
137 m_szSymbolPrefixLength = a_ui8FileNameLen;
138 }
139 else
140 {
142 m_pTRB = new TTRB();
143
144 if ( m_pTRB->Load( a_szFileName, 0 ) != TTRB::ERROR_OK )
145 {
146 return TFALSE;
147 }
148 }
149
150 return LoadTRB();
151}
152
153// $Barnyard: FUNCTION 006ce780
155{
156 if ( m_pTRB )
157 {
158 // TODO: reset data for collisions
159
160 if ( !m_bIsAssetFile )
161 {
162 m_pTRB->Close();
163 delete m_pTRB;
164 }
165
166 m_pTRB = TNULL;
167 }
168
170
171 if ( m_pCollisionMeshes )
172 {
173 TASSERT( TFALSE, "Unload collision data" );
174 }
175
178}
179
180// $Barnyard: FUNCTION 006ce010
181void* TModel::GetSymbol( const TCHAR* a_szSymbolName )
182{
183 if ( m_bIsAssetFile )
184 {
185 TCHAR symbolName[ 64 ];
187 TStringManager::String8Copy( symbolName + m_szSymbolPrefixLength, a_szSymbolName );
188
189 return m_pTRB->GetSymbolAddress( symbolName );
190 }
191
192 return m_pTRB->GetSymbolAddress( a_szSymbolName );
193}
194
195// $Barnyard: FUNCTION 006ce180
197{
198 auto pInstance = new TModelInstance( this );
199
200 if ( m_pSkeleton )
201 {
202 pInstance->m_pSkeletonInstance = m_pSkeleton->CreateInstance( TTRUE );
203
204 if ( TNULL == pInstance->m_pSkeletonInstance )
205 {
206 TASSERT( !"Couldn't create skeleton instance" );
207 delete pInstance;
208 return TNULL;
209 }
210 }
211
213 return pInstance;
214}
215
216// $Barnyard: FUNCTION 006c1b40
217TBOOL TModel::GetSkeletonAssetSymbolName( const TCHAR* a_szFileName, const TCHAR*& a_rSymbolName, TUINT8& a_rNameLen, TTRB* a_pTRB )
218{
219 auto iFilePathLength = TUINT8( TStringManager::String8Length( a_szFileName ) );
220 auto iFileNamePos = iFilePathLength - 1;
221 a_rNameLen = iFilePathLength;
222
223 while ( a_szFileName[ iFileNamePos ] != '\\' && a_szFileName[ iFileNamePos ] != '/' )
224 iFileNamePos--;
225
226 iFileNamePos++;
227 TCHAR symbolName[ 64 ];
228
229 auto iFileNameLength = iFilePathLength - iFileNamePos - 4;
230 a_rNameLen = iFileNameLength;
231
232 TStringManager::String8Copy( symbolName, a_szFileName + iFileNamePos, iFileNameLength );
233 symbolName[ iFileNameLength ] = '_';
234 symbolName[ iFileNameLength + 1 ] = '\0';
235 a_rNameLen = iFileNameLength + 1;
236
238 TStringManager::String8Copy( symbolName + a_rNameLen, "Skeleton" );
239
240 auto pSymbol = a_pTRB->GetSymbol( symbolName );
241
242 if ( pSymbol )
243 {
244 a_rSymbolName = a_pTRB->GetSymbolName( pSymbol );
245 return TTRUE;
246 }
247 else
248 {
249 return TFALSE;
250 }
251}
252
254{
255 m_pModel = a_pModel;
256 m_pSkeletonInstance = TNULL;
257 m_fnPreRenderCb = 0;
258 m_fnCustomRenderCb = TNULL;
259 m_pCustomRenderCbUserData = TNULL;
260 m_iCurrentLOD = 0;
261}
262
266
267void TModelInstance::Update( TFLOAT a_fDeltaTime )
268{
269 m_pSkeletonInstance->UpdateTime( a_fDeltaTime );
270}
271
272// $Barnyard: FUNCTION 006ce090
274{
275 if ( m_fnPreRenderCb )
276 {
277 m_fnPreRenderCb( this );
278 }
279
280 if ( !m_fnCustomRenderCb )
281 {
282 m_pSkeletonInstance->UpdateState( TTRUE );
284
285 for ( TINT i = 0; i < m_pModel->m_LODs[ m_iCurrentLOD ].iNumMeshes; i++ )
286 {
287 auto pMesh = m_pModel->m_LODs[ m_iCurrentLOD ].ppMeshes[ i ];
288 pMesh->Render();
289 }
290 }
291 else
292 {
293 m_fnCustomRenderCb( this, m_pCustomRenderCbUserData );
294 }
295}
296
298{
299 m_fnPreRenderCb = a_fnCallback;
300}
301
302void TModelInstance::SetCustomRenderMethod( t_CustomRenderCB a_fnCallback, void* a_pUserData )
303{
304 m_fnCustomRenderCb = a_fnCallback;
305 m_pCustomRenderCbUserData = a_pUserData;
306}
307
309{
310 m_iCurrentLOD = a_iLOD;
311}
312
314{
315 return m_iCurrentLOD;
316}
317
318// $Barnyard: FUNCTION 006ce150
320{
321 if ( m_pSkeletonInstance )
322 {
323 m_pSkeletonInstance->Delete();
324 m_pSkeletonInstance = TNULL;
325 }
326
327 m_pModel->m_iNumInstances--;
328 m_pModel = TNULL;
329 delete this;
330}
331
333{
334 return m_pModel;
335}
336
338{
339 return m_pSkeletonInstance;
340}
341
3D model system for the Toshi engine
Rendering system interface for the Toshi engine.
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TERROR(...)
Definition Defines.h:153
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
int32_t TINT32
Definition Typedefs.h:12
unsigned int TUINT
Definition Typedefs.h:8
char TCHAR
Definition Typedefs.h:20
uint8_t TUINT8
Definition Typedefs.h:17
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
Definition TTRB.h:253
TTRBSymbol * GetSymbol(TINT index) const
Definition TTRB.cpp:368
const TCHAR * GetSymbolName(TINT index) const
Definition TTRB.cpp:357
@ ERROR_OK
Definition TTRB.h:258
TKeyframeLibrary * GetLibrary(const TCHAR *a_szName)
void SetCustomRenderMethod(t_CustomRenderCB a_fnCallback, void *a_pUserData)
Definition TModel.cpp:302
void Delete()
Definition TModel.cpp:319
TModel * GetModel() const
Definition TModel.cpp:332
TINT32 GetLOD()
Definition TModel.cpp:313
friend class TModel
Definition TModel.h:37
void SetPreRenderCallback(t_PreRenderCB a_fnCallback)
Definition TModel.cpp:297
void(*)(TModelInstance *a_pInstance) t_PreRenderCB
Definition TModel.h:39
TModelInstance(TModel *a_pModel)
Definition TModel.cpp:253
TSkeletonInstance * GetSkeletonInstance() const
Definition TModel.cpp:337
void SetLOD(TINT32 a_iLOD)
Definition TModel.cpp:308
void Render()
Definition TModel.cpp:273
void Update(TFLOAT a_fDeltaTime)
Definition TModel.cpp:267
void(*)(TModelInstance *a_pInstance, void *a_pUserData) t_CustomRenderCB
Definition TModel.h:40
TBOOL m_bIsAssetFile
Definition TModel.h:158
static TBOOL GetSkeletonAssetSymbolName(const TCHAR *a_szFileName, const TCHAR *&a_rSymbolName, TUINT8 &a_rNameLen, TTRB *a_pTRB)
Definition TModel.cpp:217
TModelInstance * CreateInstance()
Definition TModel.cpp:196
TBOOL LoadTRB()
Definition TModel.cpp:38
TINT m_iLODCount
Definition TModel.h:148
TSkeleton * m_pSkeleton
Definition TModel.h:150
TINT m_iNumCollisionMeshes
Definition TModel.h:153
TFLOAT m_aLODDistances[4]
Definition TModel.h:152
void UnloadTRB()
Definition TModel.cpp:154
const TCHAR * m_szSymbolPrefix
Definition TModel.h:156
virtual ~TModel()
Definition TModel.cpp:33
Flags m_eFlags
Definition TModel.h:146
TUINT8 m_szSymbolPrefixLength
Definition TModel.h:157
TTRB * m_pTRB
Definition TModel.h:155
TModelCollisionMesh * m_pCollisionMeshes
Definition TModel.h:154
@ Flags_Loaded
Definition TModel.h:76
@ Flags_None
Definition TModel.h:74
@ Flags_Created
Definition TModel.h:75
TINT m_iNumInstances
Definition TModel.h:147
void * GetSymbol(const TCHAR *a_szSymbolName)
Definition TModel.cpp:181
TModel()
Definition TModel.cpp:15
friend TModelInstance
Definition TModel.h:84
void SetSkeletonInstance(TSkeletonInstance *a_pSkeletonInstance)
TKeyframeLibraryManager & GetKeyframeLibraryManager()
TRenderContext * GetCurrentContext() const
static TFORCEINLINE TRenderInterface * GetSingleton()
Definition TSingleton.h:49
static void String8ToLowerCase(TCHAR *str)
static TSIZE String8Length(const TCHAR *str)
static TCHAR * String8Copy(TCHAR *dst, const TCHAR *src, TSIZE size=-1)