OpenBarnyard
 
Loading...
Searching...
No Matches
TTRB.h
Go to the documentation of this file.
1
11
12#pragma once
13#ifndef __TOSHI_TTRB_H__
14# define __TOSHI_TTRB_H__
15#endif
16
17#include "Toshi/TVersion.h"
18
19#include "File/TFile.h"
20#include "File/TCompress.h"
21
22#include "Math/TVector3.h"
23#include "Math/TVector4.h"
24#include "Math/TQuaternion.h"
25
26#undef ERROR
27
29
30class TFORM
31{
32public:
34};
35
36class TTSF
37{
38public:
39 static constexpr TUINT32 IDMAGICB = TFourCC( "TSFB" );
40 static constexpr TUINT32 IDMAGICL = TFourCC( "TSFL" );
41
47
48 struct FileInfo
49 {
50 TUINT32 FileStartOffset; // offset to TRBF
51 TUINT32 FileSize; // just the size
52 };
53
54 struct Hunk
55 {
58 };
59
60public:
62 : m_pFile( TNULL ) {}
63
64 ~TTSF() = default;
65
67
68protected:
70 TFile* m_pFile; // 0x4
71};
72
73class TTSFI : public TTSF
74{
75public:
76 friend class TTRB;
77
78public:
79 TTSFI();
80 ~TTSFI() { Close(); }
81
83
84 TUINT32 Open( TFile* a_pFile );
85 TUINT32 Open( const TCHAR* a_szFilePath );
86
89
90 void ReadRaw( void* dst, TUINT32 size );
91
92 template <class T> void Read( T* a_pDst ) { m_ReadPos += m_pFile->Read( a_pDst, sizeof( T ) ); }
93 template <class T> void Read( T* a_pDst, TUINT a_uiCount ) { m_ReadPos += m_pFile->Read( a_pDst, a_uiCount * sizeof( T ) ); }
94
97 TUINT8 ReadFORM( TFORM* section );
98 TUINT8 ReadHunkData( void* dest );
99
100 void Close( TBOOL free = TTRUE );
101
102 void ReadCompressed( void* buffer, TUINT32 size );
103 void CompressSection( TFile* file, TBYTE* data, TUINT32 unk2, TUINT32 unk3 ) { TCompress::Compress( file, data, unk2, unk3, m_Endianess ); }
104
105 const Hunk& GetCurrentHunk() const { return m_CurrentHunk; }
106
107private:
108 TUINT32 m_FileInfoCount; // 0x8
109 FileInfo m_FileInfo[ 32 ]; // 0xC
110 Header m_Header; // 0x10C
111 TUINT32 m_Magic; // 0x114
112 Hunk m_CurrentHunk; // 0x118
113 TBOOL m_UNKFLAG; // 0x120
114 TUINT32 m_ReadPos; // 0x124
115};
116
117class TTSFO : public TTSF
118{
119public:
120 typedef TUINT8 ERROR;
127
128 struct HunkMark
129 {
132 };
133
134public:
136 : m_PositionCount( 0 ), m_Positions() {}
137 ~TTSFO() { Close(); }
138
145 {
146 TASSERT( m_pFile != TNULL, "TTSFO is not created" );
147 static TCHAR s_AlignBuffer[ 4 ] = { 0, 0, 0, 0 };
148 TUINT8 alignValue = 4 - ( m_pFile->Tell() & 3 );
149
150 if ( alignValue != 4 )
151 {
152 return m_pFile->Write( s_AlignBuffer, alignValue );
153 }
154
155 return 0;
156 }
157
165 TTSFO::ERROR Create( const TCHAR* filepath, const TCHAR* magic = "TRBF", Endianess endianess = Endianess_Little );
166
171 void Close();
172
179 TSIZE BeginForm( const TCHAR* name );
180
186 TSIZE EndForm();
187
195 TBOOL OpenHunk( HunkMark* hunkMark, const TCHAR* hunkName );
196
203 TBOOL CloseHunk( HunkMark* hunkMark );
204
213 TUINT32 WriteHunk( TUINT32 hunkName, void* buffer = TNULL, TSIZE bufferSize = 0 );
214
215 template <class T>
216 TUINT32 Write( const T& value )
217 {
218 TASSERT( m_pFile != TNULL, "TTSFO is not created" );
219 return m_pFile->Write( &value, sizeof( T ) );
220 }
221
222 TUINT32 WriteRaw( const void* buffer, TSIZE size )
223 {
224 TASSERT( m_pFile != TNULL, "TTSFO is not created" );
225 return m_pFile->Write( buffer, size );
226 }
227
228 TUINT32 WriteCompressed( const void* buffer, TSIZE size )
229 {
230 TASSERT( m_pFile != TNULL, "TTSFO is not created" );
231 TUINT32 writtenSize = TCompress::Compress( m_pFile, (TBYTE*)buffer, size, 0, m_Endianess == Endianess_Big );
233 return writtenSize;
234 }
235
236 void WriteBool( TBOOL value ) { Write( value ); }
237 void WriteInt8( int8_t value ) { Write( value ); }
238 void WriteUInt8( TUINT8 value ) { Write( value ); }
239 void WriteUInt16( TUINT16 value ) { Write( value ); }
240 void WriteInt32( TINT32 value ) { Write( value ); }
241 void WriteUInt32( TUINT32 value ) { Write( value ); }
242 void WriteFloat( float value ) { Write( value ); }
243 void WriteVector3( TVector3& value ) { Write( value ); }
244 void WriteVector4( TVector4& value ) { Write( value ); }
245 void WriteQuaternion( TQuaternion& value ) { Write( value ); }
246
247private:
248 TUINT32 m_PositionCount;
249 TUINT32 m_Positions[ 32 ];
250};
251
252class TTRB
253{
254public:
255 typedef TUINT8 ERROR;
268
276
277 using t_MemoryFuncAlloc = void* (*)( AllocType alloctype, TUINT32 size, TINT16 unk1, TUINT32 unk2, void* userData );
278 using t_MemoryFuncDealloc = void ( * )( AllocType alloctype, void* ptr, TINT16 unk1, TUINT32 unk2, void* userData );
279
280 struct SecInfo
281 {
282 TINT16 m_Unused; // 0x0 (padding)
285 void* m_Data; // 0x8
287 };
288
294
296 {
297 TINT16 HDRX1; // HDRX of pointer
298 TINT16 HDRX2; // HDRX of data
299 TUINT32 Offset; // Offset to pointer in HDRX1
300 };
301
310
311 struct SYMB
312 {
314 };
315
316public:
317 TTRB();
318 ~TTRB();
319
320 // Creates TFile and reads TRB from it
321 ERROR Load( const TCHAR* a_szFilePath, TUINT32 a_uiUnknown = 0 );
322
323 // Returns index of TTRBSymbol
324 TINT GetSymbolIndex( const TCHAR* symbName );
325
326 // Returns pointer to data if found and TNULL if not
327 void* GetSymbolAddress( const TCHAR* symbName );
328 void* GetSymbolAddress( TTRBSymbol& symb ) { return static_cast<TCHAR*>( GetSection( symb.HDRX ) ) + symb.DataOffset; }
329
330 // Destroys TRB file and the content
331 void Close();
332
333 template <typename T>
334 T* CastSymbol( const TCHAR* symbName ) { return TSTATICCAST( T, GetSymbolAddress( symbName ) ); }
335
336 SecInfo* GetSectionInfoList() const { return reinterpret_cast<SecInfo*>( m_pHeader + 1 ); }
337 SecInfo* GetSectionInfo( TINT index ) const { return GetSectionInfoList() + index; }
338
339 TTRBSymbol* GetSymbol( TINT index ) const;
340 TTRBSymbol* GetSymbol( const TCHAR* a_symbolName );
341 const TCHAR* GetSymbolName( TINT index ) const;
342 const TCHAR* GetSymbolName( TTRBSymbol* symbol ) const;
343 TINT32 GetNumSymbols() const { return m_SYMB->m_i32SymbCount; }
344
345 SYMB* GetSymbolTable() const { return m_SYMB; }
346 void DeleteSymbolTable();
347
348 void SetMemoryFunctions( t_MemoryFuncAlloc allocator, t_MemoryFuncDealloc deallocator, void* userdata );
349
350public:
351 // $Barnyard: FUNCTION 006ba9b0
352 static TUINT32 GetHeaderSize( TUINT32 count ) { return sizeof( SecInfo ) * count + sizeof( Header ); }
353
354 static TUINT32 GetSymbolTableSize( TUINT32 count ) { return sizeof( TTRBSymbol ) * count + sizeof( SYMB ); }
355 static TINT16 HashString( const TCHAR* str );
356
357private:
358 // Parses sections
359 TBOOL ProcessForm( TTSFI& ttsf );
360
361 // Returns pointer to section by index
362 void* GetSection( TINT index ) { return GetSectionInfo( index )->m_Data; }
363
364private:
365 static void* s_pDefAllocatorUserData;
366
367private:
368 TTSFI m_TTSFI;
369 TUINT32 m_UNK;
370 Header* m_pHeader;
371 SYMB* m_SYMB;
372 t_MemoryFuncAlloc m_MemAllocator;
373 t_MemoryFuncDealloc m_MemDeallocator;
374 void* m_MemUserData;
375};
376
Core file system interface for the Toshi engine.
Quaternion implementation for the Toshi engine.
3D vector implementation for the Toshi engine
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
@ Endianess_Big
Definition Endianness.h:9
@ Endianess_Little
Definition Endianness.h:8
TUINT8 Endianess
Definition Endianness.h:5
TFORCEINLINE constexpr TUINT32 TFourCC(const TCHAR str[4])
Definition Helpers.h:15
uint16_t TUINT16
Definition Typedefs.h:15
int32_t TINT32
Definition Typedefs.h:12
unsigned int TUINT
Definition Typedefs.h:8
int16_t TINT16
Definition Typedefs.h:14
size_t TSIZE
Definition Typedefs.h:9
char TCHAR
Definition Typedefs.h:20
uint8_t TUINT8
Definition Typedefs.h:17
#define TNULL
Definition Typedefs.h:23
uint32_t TUINT32
Definition Typedefs.h:13
int TINT
Definition Typedefs.h:7
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
uint8_t TBYTE
Definition Typedefs.h:19
static size_t Compress(TFile *file, TBYTE *data, TUINT32 size, TUINT32 unused, TBOOL isBigEndian)
Definition TFile.h:128
Definition TTRB.h:31
TUINT32 Unk
Definition TTRB.h:33
~TTSF()=default
Endianess GetEndianess() const
Definition TTRB.h:66
static constexpr TUINT32 IDMAGICL
Definition TTRB.h:40
TFile * m_pFile
Definition TTRB.h:70
TTSF()
Definition TTRB.h:61
static constexpr TUINT32 IDMAGICB
Definition TTRB.h:39
Endianess m_Endianess
Definition TTRB.h:69
TUINT32 Magic
Definition TTRB.h:44
TUINT32 FileSize
Definition TTRB.h:45
TUINT32 FileSize
Definition TTRB.h:51
TUINT32 FileStartOffset
Definition TTRB.h:50
TUINT32 Name
Definition TTRB.h:56
TUINT32 Size
Definition TTRB.h:57
Definition TTRB.h:74
TUINT32 Open(TFile *a_pFile)
Definition TTSF.cpp:13
void ReadCompressed(void *buffer, TUINT32 size)
Definition TTSF.cpp:170
TUINT8 ReadHunk()
Definition TTSF.cpp:102
TUINT8 SkipHunk()
Definition TTSF.cpp:118
void CompressSection(TFile *file, TBYTE *data, TUINT32 unk2, TUINT32 unk3)
Definition TTRB.h:103
const Hunk & GetCurrentHunk() const
Definition TTRB.h:105
void Close(TBOOL free=true)
Definition TTSF.cpp:156
TUINT32 PushForm()
Definition TTSF.cpp:67
void ReadRaw(void *dst, TUINT32 size)
Definition TTSF.cpp:347
void Read(T *a_pDst)
Definition TTRB.h:92
void Read(T *a_pDst, TUINT a_uiCount)
Definition TTRB.h:93
friend class TTRB
Definition TTRB.h:76
TUINT32 ReadAlignmentPad()
Definition TTSF.cpp:332
~TTSFI()
Definition TTRB.h:80
TTSFI()
Definition TTSF.cpp:186
TUINT8 ReadHunkData(void *dest)
Definition TTSF.cpp:141
TUINT32 PopForm()
Definition TTSF.cpp:84
TUINT8 ReadFORM(TFORM *section)
Definition TTSF.cpp:128
void WriteInt32(TINT32 value)
Definition TTRB.h:240
void WriteUInt32(TUINT32 value)
Definition TTRB.h:241
void Close()
Closes the file.
Definition TTSF.cpp:228
void WriteUInt16(TUINT16 value)
Definition TTRB.h:239
void WriteVector4(TVector4 &value)
Definition TTRB.h:244
TSIZE BeginForm(const TCHAR *name)
Begin a new form and saves it's info.
Definition TTSF.cpp:238
void WriteQuaternion(TQuaternion &value)
Definition TTRB.h:245
TUINT32 WriteAlignmentPad()
Aligns current position to 4.
Definition TTRB.h:144
TTSFO()
Definition TTRB.h:135
ERROR_
Definition TTRB.h:122
@ ERROR_OK
Definition TTRB.h:123
@ ERROR_UNKNOWN
Definition TTRB.h:124
@ ERROR_FILE
Definition TTRB.h:125
void WriteBool(TBOOL value)
Definition TTRB.h:236
TTSFO::ERROR Create(const TCHAR *filepath, const TCHAR *magic="TRBF", Endianess endianess=Endianess_Little)
Creates file for writing.
Definition TTSF.cpp:198
TBOOL CloseHunk(HunkMark *hunkMark)
Closes the hunk.
Definition TTSF.cpp:295
void WriteFloat(float value)
Definition TTRB.h:242
void WriteInt8(int8_t value)
Definition TTRB.h:237
TSIZE EndForm()
Ends the current form if it exists.
Definition TTSF.cpp:259
void WriteUInt8(TUINT8 value)
Definition TTRB.h:238
TBOOL OpenHunk(HunkMark *hunkMark, const TCHAR *hunkName)
Opens new hunk.
Definition TTSF.cpp:285
TUINT32 Write(const T &value)
Definition TTRB.h:216
TUINT32 WriteRaw(const void *buffer, TSIZE size)
Definition TTRB.h:222
void WriteVector3(TVector3 &value)
Definition TTRB.h:243
TUINT32 WriteCompressed(const void *buffer, TSIZE size)
Definition TTRB.h:228
~TTSFO()
Definition TTRB.h:137
TUINT8 ERROR
Definition TTRB.h:120
TUINT32 WriteHunk(TUINT32 hunkName, void *buffer=nullptr, TSIZE bufferSize=0)
Writes a hunk of data.
Definition TTSF.cpp:308
TUINT32 Pos
Definition TTRB.h:131
TUINT32 Name
Definition TTRB.h:130
void(*)(AllocType alloctype, void *ptr, TINT16 unk1, TUINT32 unk2, void *userData) t_MemoryFuncDealloc
Definition TTRB.h:278
static TINT16 HashString(const TCHAR *str)
Definition TTRB.cpp:328
TINT32 GetNumSymbols() const
Definition TTRB.h:343
AllocType_
Definition TTRB.h:271
@ AllocType_Unk0
Definition TTRB.h:272
@ AllocType_Unk1
Definition TTRB.h:273
@ AllocType_Unk2
Definition TTRB.h:274
SYMB * GetSymbolTable() const
Definition TTRB.h:345
TTRB()
Definition TTRB.cpp:24
SecInfo * GetSectionInfoList() const
Definition TTRB.h:336
static TUINT32 GetHeaderSize(TUINT32 count)
Definition TTRB.h:352
void * GetSymbolAddress(TTRBSymbol &symb)
Definition TTRB.h:328
TTRBSymbol * GetSymbol(TINT index) const
Definition TTRB.cpp:368
static TUINT32 GetSymbolTableSize(TUINT32 count)
Definition TTRB.h:354
void DeleteSymbolTable()
Definition TTRB.cpp:319
T * CastSymbol(const TCHAR *symbName)
Definition TTRB.h:334
ERROR Load(const TCHAR *a_szFilePath, TUINT32 a_uiUnknown=0)
Definition TTRB.cpp:38
void * GetSymbolAddress(const TCHAR *symbName)
Definition TTRB.cpp:251
SecInfo * GetSectionInfo(TINT index) const
Definition TTRB.h:337
const TCHAR * GetSymbolName(TINT index) const
Definition TTRB.cpp:357
void SetMemoryFunctions(t_MemoryFuncAlloc allocator, t_MemoryFuncDealloc deallocator, void *userdata)
Definition TTRB.cpp:311
void Close()
Definition TTRB.cpp:289
~TTRB()
Definition TTRB.cpp:32
ERROR_
Definition TTRB.h:257
@ ERROR_NOT_TRB
Definition TTRB.h:265
@ ERROR_NOT_TRBF
Definition TTRB.h:260
@ ERROR_WRONG_MAGIC
Definition TTRB.h:262
@ ERROR_FORM_MAGIC
Definition TTRB.h:263
@ ERROR_OK
Definition TTRB.h:258
@ ERROR_NO_FILE
Definition TTRB.h:264
@ ERROR_NO_FILEINFO_ON_STACK
Definition TTRB.h:266
@ ERROR_NO_HEADER
Definition TTRB.h:259
@ ERROR_PARSE_ERROR
Definition TTRB.h:261
TUINT8 ERROR
Definition TTRB.h:255
TUINT8 AllocType
Definition TTRB.h:269
TINT GetSymbolIndex(const TCHAR *symbName)
Definition TTRB.cpp:265
void *(*)(AllocType alloctype, TUINT32 size, TINT16 unk1, TUINT32 unk2, void *userData) t_MemoryFuncAlloc
Definition TTRB.h:277
TUINT32 m_Size
Definition TTRB.h:284
void * m_Data
Definition TTRB.h:285
TUINT32 m_Unk2
Definition TTRB.h:286
TINT16 m_Unk1
Definition TTRB.h:283
TINT16 m_Unused
Definition TTRB.h:282
TINT32 m_i32SectionCount
Definition TTRB.h:292
TVersion m_ui32Version
Definition TTRB.h:291
TINT16 HDRX2
Definition TTRB.h:298
TUINT32 Offset
Definition TTRB.h:299
TINT16 HDRX1
Definition TTRB.h:297
TUINT32 DataOffset
Definition TTRB.h:308
TUINT16 HDRX
Definition TTRB.h:304
TINT16 NameHash
Definition TTRB.h:307
TUINT16 Padding
Definition TTRB.h:306
TUINT16 NameOffset
Definition TTRB.h:305
TINT32 m_i32SymbCount
Definition TTRB.h:313