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

#include <ATerrainSection.h>

Classes

class  ModelNode
 

Public Types

enum  FLAGS : TUINT32 {
  FLAGS_HIGH_LOD_LOADED = BITFLAG( 0 ) , FLAGS_LOW_LOD_LOADED = BITFLAG( 1 ) , FLAGS_HIGH_LOD_LOADING = BITFLAG( 2 ) , FLAGS_LOW_LOD_LOADING = BITFLAG( 3 ) ,
  FLAGS_HIGH_LOD_QUEUED = BITFLAG( 4 ) , FLAGS_LOW_LOD_QUEUED = BITFLAG( 5 ) , FLAGS_COLLISION_LOADING = BITFLAG( 10 )
}
 

Public Member Functions

void Draw (ATerrainLODType a_eLODType)
 
void LoadCollision ()
 
void LoadModels (ATerrainLODType a_eLODType)
 
void LoadMatlib (ATerrainLODType a_eLODType)
 
void UnloadMatlib (ATerrainLODType a_eLODType)
 
void DestroyLOD (ATerrainLODType a_eLODType)
 
void RemoveFromStreamingQueue ()
 
TBOOL IsMatLibLoaded (ATerrainLODType a_eLODType) const
 
TBOOL IsLODQueued (ATerrainLODType a_eLODType) const
 
void SetLODQueued (ATerrainLODType a_eLODType, TBOOL a_bQueued)
 
TBOOL IsLODLoaded (ATerrainLODType a_eLODType) const
 
void SetLODLoaded (ATerrainLODType a_eLODType, TBOOL a_bLoaded)
 
TBOOL IsLODLoading (ATerrainLODType a_eLODType) const
 
void SetLODLoading (ATerrainLODType a_eLODType, TBOOL a_bLoading)
 
TBOOL IsLODEmpty (ATerrainLODType a_eLODType) const
 
void SetLODEmpty (ATerrainLODType a_eLODType, TBOOL a_bEmpty)
 
void GetLODNames (ATerrainLODType a_eLODType, const TCHAR **&a_rLODs, TINT &a_rNumLODs)
 
void GetLODBlocks (ATerrainLODType a_eLODType, ATerrainLODBlock **&a_rMemBlocks, TUINT16 &a_rNumMemBlocks)
 
TINT GetLODCount (ATerrainLODType a_eLODType)
 

Friends

class ATerrainInterface
 
class ASectionDoneJob
 
class ACollisionDoneJob
 

Detailed Description

Definition at line 11 of file ATerrainSection.h.

Member Enumeration Documentation

◆ FLAGS

Enumerator
FLAGS_HIGH_LOD_LOADED 
FLAGS_LOW_LOD_LOADED 
FLAGS_HIGH_LOD_LOADING 
FLAGS_LOW_LOD_LOADING 
FLAGS_HIGH_LOD_QUEUED 
FLAGS_LOW_LOD_QUEUED 
FLAGS_COLLISION_LOADING 

Definition at line 50 of file ATerrainSection.h.

Member Function Documentation

◆ DestroyLOD()

void ATerrainSection::DestroyLOD ( ATerrainLODType a_eLODType)

Definition at line 241 of file ATerrainSection.cpp.

242{
243 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
244
245 auto pTerrain = ATerrainInterface::GetSingleton();
246 TINT iNumLODs = GetLODCount( a_eLODType );
247
248 for ( TINT i = 0; i < iNumLODs; i++ )
249 {
250 if ( m_ppLODModelsData[ a_eLODType ][ i ] )
251 {
252 pTerrain->DestroyModelData( m_ppLODModelsData[ a_eLODType ][ i ] );
253 m_ppLODModelsData[ a_eLODType ][ i ] = TNULL;
254 }
255 }
256
257 UnloadMatlib( a_eLODType );
258
259 TUINT32 eNewFlags;
260
261 if ( a_eLODType == ATerrainLODType_High )
262 {
263 if ( m_pCollisionModelData && pTerrain->IsCollisionStreamed() )
264 {
265 pTerrain->DestroyModelData( m_pCollisionModelData );
266 m_pCollisionModelData = TNULL;
267 }
268
269 for ( TUINT i = 0; i < m_iNumHighMemBlocksUsed; i++ )
270 {
271 auto pBlock = m_ppHighLODBlocks[ i ];
272
273 if ( pBlock )
274 {
275 m_ppHighLODBlocks[ i ] = TNULL;
276 pBlock->Assign( TNULL, ATerrainLODType_None );
277 }
278 }
279
281 }
282 else
283 {
284 for ( TUINT i = 0; i < m_iNumLowMemBlocksUsed; i++ )
285 {
286 auto pBlock = m_ppLowLODBlocks[ i ];
287
288 if ( pBlock )
289 {
290 m_ppLowLODBlocks[ i ] = TNULL;
291 pBlock->Assign( TNULL, ATerrainLODType_None );
292 }
293 }
294
296 }
297
298 m_eFlags = eNewFlags;
299 SetLODEmpty( a_eLODType, TFALSE );
300}
#define TASSERT(X,...)
Definition Defines.h:138
unsigned int TUINT
Definition Typedefs.h:8
#define TNULL
Definition Typedefs.h:23
uint32_t TUINT32
Definition Typedefs.h:13
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
@ ATerrainLODType_None
@ ATerrainLODType_High
@ ATerrainLODType_Low
void UnloadMatlib(ATerrainLODType a_eLODType)
TINT GetLODCount(ATerrainLODType a_eLODType)
void SetLODEmpty(ATerrainLODType a_eLODType, TBOOL a_bEmpty)

◆ Draw()

void ATerrainSection::Draw ( ATerrainLODType a_eLODType)

Definition at line 23 of file ATerrainSection.cpp.

24{
25 TASSERT( a_eLODType != ATerrainLODType_None );
26
28 {
29 // Draw models of the high LOD
30 for ( TINT i = 0; i < m_iNumHighModelFiles; i++ )
31 {
32 m_ppLODModelsData[ ATerrainLODType_High ][ i ]->Render();
33 }
34 }
35 else
36 {
37 // High LOD is still loading so let's check if we can render low LOD instead
39 {
40 // Draw models of the low LOD
41 for ( TINT i = 0; i < m_iNumLowModelFiles; i++ )
42 {
43 m_ppLODModelsData[ ATerrainLODType_Low ][ i ]->Render();
44 }
45 }
46 }
47}
TBOOL IsLODLoaded(ATerrainLODType a_eLODType) const

◆ GetLODBlocks()

void ATerrainSection::GetLODBlocks ( ATerrainLODType a_eLODType,
ATerrainLODBlock **& a_rMemBlocks,
TUINT16 & a_rNumMemBlocks )
inline

Definition at line 108 of file ATerrainSection.h.

109 {
110 if ( a_eLODType == ATerrainLODType_High )
111 {
112 a_rMemBlocks = m_ppHighLODBlocks;
113 a_rNumMemBlocks = m_iNumHighMemBlocksUsed;
114 }
115 else
116 {
117 a_rMemBlocks = m_ppLowLODBlocks;
118 a_rNumMemBlocks = m_iNumLowMemBlocksUsed;
119 }
120 }

◆ GetLODCount()

TINT ATerrainSection::GetLODCount ( ATerrainLODType a_eLODType)
inline

Definition at line 122 of file ATerrainSection.h.

123 {
124 return ( a_eLODType == ATerrainLODType_High ) ? m_iNumHighModelFiles : m_iNumLowModelFiles;
125 }

◆ GetLODNames()

void ATerrainSection::GetLODNames ( ATerrainLODType a_eLODType,
const TCHAR **& a_rLODs,
TINT & a_rNumLODs )
inline

Definition at line 94 of file ATerrainSection.h.

95 {
96 if ( a_eLODType == ATerrainLODType_High )
97 {
98 a_rLODs = m_pszHighModelFiles;
99 a_rNumLODs = m_iNumHighModelFiles;
100 }
101 else
102 {
103 a_rLODs = m_pszLowModelFiles;
104 a_rNumLODs = m_iNumLowModelFiles;
105 }
106 }

◆ IsLODEmpty()

TBOOL ATerrainSection::IsLODEmpty ( ATerrainLODType a_eLODType) const
inline

Definition at line 91 of file ATerrainSection.h.

91{ return ( m_eFlags & ( 64 << ( a_eLODType & 0x1f ) ) ); }

◆ IsLODLoaded()

TBOOL ATerrainSection::IsLODLoaded ( ATerrainLODType a_eLODType) const
inline

Definition at line 84 of file ATerrainSection.h.

84{ return m_eFlags & ( 1 << ( a_eLODType ) ); }

◆ IsLODLoading()

TBOOL ATerrainSection::IsLODLoading ( ATerrainLODType a_eLODType) const
inline

Definition at line 87 of file ATerrainSection.h.

87{ return m_eFlags & ( 1 << ( a_eLODType + ATerrainLODType_NUMOF ) ); }
@ ATerrainLODType_NUMOF

◆ IsLODQueued()

TBOOL ATerrainSection::IsLODQueued ( ATerrainLODType a_eLODType) const
inline

Definition at line 81 of file ATerrainSection.h.

81{ return ( m_eFlags & ( 16 << a_eLODType ) ); }

◆ IsMatLibLoaded()

TBOOL ATerrainSection::IsMatLibLoaded ( ATerrainLODType a_eLODType) const

Definition at line 322 of file ATerrainSection.cpp.

323{
324 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
325
326 if ( a_eLODType == ATerrainLODType_High )
327 {
328 return m_pMatLibHigh != TNULL;
329 }
330 else
331 {
332 return m_pMatLibLow != TNULL;
333 }
334}

◆ LoadCollision()

void ATerrainSection::LoadCollision ( )

Definition at line 49 of file ATerrainSection.cpp.

50{
51 auto pTerrain = ATerrainInterface::GetSingleton();
52
53 if ( m_szCollisionFilename[ 0 ] != '\0' )
54 {
55 auto pBlock = ( !pTerrain->IsCollisionStreamed() ) ?
56 pTerrain->GetVIS()->m_pPersistantTerrainBlock :
57 m_ppHighLODBlocks[ m_iCollisionMemBlockID ];
58
59 m_pCollisionModelData = new ( pBlock->GetMemBlock() ) ModelNode();
60
61 auto pTRB = new ( pBlock->GetMemBlock() ) TTRB();
62 pBlock->SetupTRB( pTRB, pBlock );
63
64 auto pModelLoaderJob = pTerrain->GetFreeModelLoaderJob();
65 pModelLoaderJob->InitJob(
66 &m_pCollisionModelData->m_ModelRef,
67 pTRB,
68 m_szCollisionFilename,
69 pTerrain->IsCollisionStreamed()
70 );
71
72 auto pCollisionJob = pTerrain->GetFreeCollisionLoaderJob();
73 pCollisionJob->InitJob( this, TFALSE );
74
75 AAssetStreaming::GetSingleton()->AddMainThreadJob( pModelLoaderJob );
76 AAssetStreaming::GetSingleton()->AddMainThreadJob( pCollisionJob );
77 m_eFlags |= FLAGS_COLLISION_LOADING;
78 }
79}

◆ LoadMatlib()

void ATerrainSection::LoadMatlib ( ATerrainLODType a_eLODType)

Definition at line 164 of file ATerrainSection.cpp.

165{
166 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
167
168 TUINT8 uiAllocAtBlock;
169 ATerrainLODBlock** ppBlocks;
170
171 if ( a_eLODType == ATerrainLODType_High )
172 {
173 if ( m_szHighMatLibFilename[ 0 ] == '\0' ) return;
174 uiAllocAtBlock = m_iHighMatLibMemBlockID;
175 ppBlocks = m_ppHighLODBlocks;
176 }
177 else
178 {
179 if ( m_szLowMatLibFilename[ 0 ] == '\0' ) return;
180 uiAllocAtBlock = m_iLowMatLibMemBlockID;
181 ppBlocks = m_ppLowLODBlocks;
182 }
183
184 auto pBlock = ppBlocks[ uiAllocAtBlock ];
185 auto pMatlibJob = ATerrainInterface::GetSingleton()->GetFreeMatlibLoaderJob();
186
187 if ( a_eLODType == ATerrainLODType_High )
188 {
189 m_pMatLibHighTRB = new ( pBlock->GetMemBlock() ) TTRB();
190 pBlock->SetupTRB( m_pMatLibHighTRB, pBlock );
191
192 pMatlibJob->InitJob( m_szHighMatLibFilename, m_pMatLibHighTRB, m_pMatLibHigh, pBlock->GetMemBlock() );
193 }
194 else
195 {
196 m_pMatLibLowTRB = new ( pBlock->GetMemBlock() ) TTRB();
197 pBlock->SetupTRB( m_pMatLibLowTRB, pBlock );
198
199 pMatlibJob->InitJob( m_szLowMatLibFilename, m_pMatLibLowTRB, m_pMatLibLow, pBlock->GetMemBlock() );
200 }
201
202 AAssetStreaming::GetSingleton()->AddMainThreadJob( pMatlibJob );
203}
uint8_t TUINT8
Definition Typedefs.h:17

◆ LoadModels()

void ATerrainSection::LoadModels ( ATerrainLODType a_eLODType)

Definition at line 81 of file ATerrainSection.cpp.

82{
83 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
84
85 auto pTerrain = ATerrainInterface::GetSingleton();
86
87 if ( !IsLODLoading( a_eLODType ) && !IsLODLoaded( a_eLODType ) )
88 {
89 const TCHAR** ppLODNames;
90 TINT iNumLODs;
91 GetLODNames( a_eLODType, ppLODNames, iNumLODs );
92
93 if ( iNumLODs == 0 && m_szCollisionFilename[ 0 ] == '\0' )
94 {
95 SetLODQueued( a_eLODType, TFALSE );
96 SetLODEmpty( a_eLODType, TTRUE );
97 SetLODLoaded( a_eLODType, TTRUE );
98 }
99 else
100 {
101 ATerrainLODBlock** ppLODBlocks;
102 TUINT16 uiNumMemBlocks;
103 GetLODBlocks( a_eLODType, ppLODBlocks, uiNumMemBlocks );
104
105 TUINT8* pLODToBlock = ( a_eLODType == ATerrainLODType_High ) ? m_pHighLODToBlock : m_pLowLODToBlock;
106
107 for ( TINT i = 0; i < uiNumMemBlocks; i++ )
108 {
109 if ( ppLODBlocks[ i ] == TNULL )
110 {
111 ppLODBlocks[ i ] = pTerrain->AllocateLODBlock( a_eLODType, this );
112
113 if ( ppLODBlocks[ i ] == TNULL )
114 {
115 TASSERT( TFALSE, "Couldn't allocated new LOD block!" );
116 return;
117 }
118
119 ppLODBlocks[ i ]->m_bIsUnused = TFALSE;
120 }
121 }
122
123 if ( a_eLODType == ATerrainLODType_High && pTerrain->IsCollisionStreamed() )
124 {
126 }
127
128 LoadMatlib( a_eLODType );
129
130 for ( TINT i = 0; i < iNumLODs; i++ )
131 {
132 if ( m_ppLODModelsData[ a_eLODType ][ i ] == TNULL )
133 {
134 auto pBlock = ppLODBlocks[ pLODToBlock[ i ] ];
135 auto pModelData = new ( pBlock->GetMemBlock() ) ModelNode();
136
137 auto pTRB = new ( pBlock->GetMemBlock() ) TTRB();
138 pBlock->SetupTRB( pTRB, pBlock );
139 m_ppLODModelsData[ a_eLODType ][ i ] = pModelData;
140
141 auto pModelLoaderJob = pTerrain->GetFreeModelLoaderJob();
142 pModelLoaderJob->InitJob(
143 &pModelData->m_ModelRef,
144 pTRB,
145 ppLODNames[ i ],
146 TTRUE
147 );
148
149 AAssetStreaming::GetSingleton()->AddMainThreadJob( pModelLoaderJob );
150 }
151 }
152
153 auto pSectionJob = pTerrain->GetFreeSectionLoaderJob();
154 pSectionJob->InitJob( this, a_eLODType );
155
156 AAssetStreaming::GetSingleton()->AddMainThreadJob( pSectionJob );
157
158 SetLODQueued( a_eLODType, TFALSE );
159 SetLODLoading( a_eLODType, TTRUE );
160 }
161 }
162}
uint16_t TUINT16
Definition Typedefs.h:15
char TCHAR
Definition Typedefs.h:20
#define TTRUE
Definition Typedefs.h:25
void LoadMatlib(ATerrainLODType a_eLODType)
void GetLODNames(ATerrainLODType a_eLODType, const TCHAR **&a_rLODs, TINT &a_rNumLODs)
void SetLODLoaded(ATerrainLODType a_eLODType, TBOOL a_bLoaded)
void SetLODQueued(ATerrainLODType a_eLODType, TBOOL a_bQueued)
TBOOL IsLODLoading(ATerrainLODType a_eLODType) const
void SetLODLoading(ATerrainLODType a_eLODType, TBOOL a_bLoading)
void GetLODBlocks(ATerrainLODType a_eLODType, ATerrainLODBlock **&a_rMemBlocks, TUINT16 &a_rNumMemBlocks)

◆ RemoveFromStreamingQueue()

void ATerrainSection::RemoveFromStreamingQueue ( )

Definition at line 302 of file ATerrainSection.cpp.

303{
304 for ( TINT i = 0; i < ATerrainLODType_NUMOF; i++ )
305 {
306 if ( IsLODQueued( i ) )
307 {
308 ATerrainLODBlock** ppLODBlocks;
309 TUINT16 uiNumLODBlocks;
310 GetLODBlocks( i, ppLODBlocks, uiNumLODBlocks );
311
312 for ( TINT k = 0; k < uiNumLODBlocks; k++ )
313 {
314 ppLODBlocks[ k ]->Assign( TNULL, ATerrainLODType_None );
315 }
316
317 SetLODQueued( i, TFALSE );
318 }
319 }
320}
void Assign(ATerrainSection *a_pVISGroup, ATerrainLODType a_eLODType)
TBOOL IsLODQueued(ATerrainLODType a_eLODType) const

◆ SetLODEmpty()

void ATerrainSection::SetLODEmpty ( ATerrainLODType a_eLODType,
TBOOL a_bEmpty )

Definition at line 378 of file ATerrainSection.cpp.

379{
380 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
381
382 if ( a_bEmpty )
383 {
384 m_eFlags |= ( 64 << a_eLODType );
385 }
386 else
387 {
388 m_eFlags &= ~( 64 << a_eLODType );
389 }
390}

◆ SetLODLoaded()

void ATerrainSection::SetLODLoaded ( ATerrainLODType a_eLODType,
TBOOL a_bLoaded )

Definition at line 350 of file ATerrainSection.cpp.

351{
352 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
353
354 if ( a_bLoaded )
355 {
356 m_eFlags |= ( 1 << ( a_eLODType ) );
357 }
358 else
359 {
360 m_eFlags &= ~( 1 << ( a_eLODType ) );
361 }
362}

◆ SetLODLoading()

void ATerrainSection::SetLODLoading ( ATerrainLODType a_eLODType,
TBOOL a_bLoading )

Definition at line 364 of file ATerrainSection.cpp.

365{
366 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
367
368 if ( a_bLoading )
369 {
370 m_eFlags |= ( 1 << ( a_eLODType + ATerrainLODType_NUMOF ) );
371 }
372 else
373 {
374 m_eFlags &= ~( 1 << ( a_eLODType + ATerrainLODType_NUMOF ) );
375 }
376}

◆ SetLODQueued()

void ATerrainSection::SetLODQueued ( ATerrainLODType a_eLODType,
TBOOL a_bQueued )

Definition at line 336 of file ATerrainSection.cpp.

337{
338 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
339
340 if ( a_bQueued )
341 {
342 m_eFlags |= ( 16 << a_eLODType );
343 }
344 else
345 {
346 m_eFlags &= ~( 16 << a_eLODType );
347 }
348}

◆ UnloadMatlib()

void ATerrainSection::UnloadMatlib ( ATerrainLODType a_eLODType)

Definition at line 205 of file ATerrainSection.cpp.

206{
207 TASSERT( a_eLODType == ATerrainLODType_High || a_eLODType == ATerrainLODType_Low );
208
209 if ( a_eLODType == ATerrainLODType_High )
210 {
211 if ( m_pMatLibHigh )
212 {
213 AMaterialLibraryManager::GetSingleton()->UnloadTexturesOfLibrary( m_pMatLibHigh );
214 m_pMatLibHigh->Destroy();
215 m_pMatLibHigh = TNULL;
216 }
217
218 if ( m_pMatLibHighTRB )
219 {
220 delete m_pMatLibHighTRB;
221 m_pMatLibHighTRB = TNULL;
222 }
223 }
224 else
225 {
226 if ( m_pMatLibLow )
227 {
228 AMaterialLibraryManager::GetSingleton()->UnloadTexturesOfLibrary( m_pMatLibLow );
229 m_pMatLibLow->Destroy();
230 m_pMatLibLow = TNULL;
231 }
232
233 if ( m_pMatLibLowTRB )
234 {
235 delete m_pMatLibLowTRB;
236 m_pMatLibLowTRB = TNULL;
237 }
238 }
239}

Friends And Related Symbol Documentation

◆ ACollisionDoneJob

friend class ACollisionDoneJob
friend

Definition at line 63 of file ATerrainSection.h.

◆ ASectionDoneJob

friend class ASectionDoneJob
friend

Definition at line 62 of file ATerrainSection.h.

◆ ATerrainInterface

friend class ATerrainInterface
friend

Definition at line 61 of file ATerrainSection.h.


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