10#ifdef TOSHI_SKU_WINDOWS
26 m_pTerrainVIS =
TNULL;
28 m_iPreloadTerrainBlockSize = a_iPreloadTerrainBlockSize;
31 auto pJobSlot = &m_pJobs[ 0 ];
35 pJobSlot->SetNodeValue( &m_aModelLoaderJobs[ i ] );
36 m_FreeModelLoaderJobs.PushFront( pJobSlot );
42 pJobSlot->SetNodeValue( &m_aKeylibLoaderJobs[ i ] );
43 m_FreeKeylibLoaderJobs.PushFront( pJobSlot );
49 pJobSlot->SetNodeValue( &m_aMatlibLoaderJobs[ i ] );
50 m_FreeMatlibLoaderJobs.PushFront( pJobSlot );
56 pJobSlot->SetNodeValue( &m_aSectionDoneJobs[ i ] );
57 m_FreeSectionLoaderJobs.PushFront( pJobSlot );
63 pJobSlot->SetNodeValue( &m_aTRBLoaderJobs[ i ] );
64 m_FreeTRBLoaderJobs.PushFront( pJobSlot );
70 pJobSlot->SetNodeValue( &m_aSkeletonDoneJobs[ i ] );
71 m_FreeSkeletonLoaderJobs.PushFront( pJobSlot );
77 pJobSlot->SetNodeValue( &m_aCollisionDoneJobs[ i ] );
78 m_FreeCollisionLoaderJobs.PushFront( pJobSlot );
82 TTODO(
"Call FUN_00619040() and initialise some other values" );
83 m_iCurrentSection = a_iStartVISGroup;
84 m_iPreviousSection = -1;
88 m_cbOnCollsionModelLoaded =
TNULL;
89 m_cbOnModelLoaded =
TNULL;
90 m_cbOnVISGroupChanged =
TNULL;
91 m_fnGetCurrentVISGroup = GetCurrentSectionID;
99 m_UsedModelLoaderJobs.Clear();
100 m_FreeModelLoaderJobs.Clear();
101 m_UsedUnknownLoaderJobs.Clear();
102 m_FreeUnknownLoaderJobs.Clear();
103 m_UsedSectionLoaderJobs.Clear();
104 m_FreeSectionLoaderJobs.Clear();
105 m_UsedKeylibLoaderJobs.Clear();
106 m_FreeKeylibLoaderJobs.Clear();
107 m_UsedMatlibLoaderJobs.Clear();
108 m_FreeMatlibLoaderJobs.Clear();
109 m_UsedTRBLoaderJobs.Clear();
110 m_FreeTRBLoaderJobs.Clear();
111 m_UsedSkeletonLoaderJobs.Clear();
112 m_FreeSkeletonLoaderJobs.Clear();
113 m_UsedCollisionLoaderJobs.Clear();
114 m_FreeCollisionLoaderJobs.Clear();
121 if ( !m_pTerrainVIS )
return;
123 if ( m_fnGetCurrentVISGroup )
125 TINT iCurrentGroup = m_fnGetCurrentVISGroup();
127 if ( iCurrentGroup != -1 )
129 m_iCurrentSection = iCurrentGroup;
133 if ( m_iCurrentSection >= 0 )
135 if ( m_iPreviousSection != m_iCurrentSection )
143 if ( m_cbOnVISGroupChanged )
145 auto pPrevious = m_iPreviousSection >= 0 ? &m_pTerrainVIS->m_pSections[ m_iPreviousSection ] :
TNULL;
146 auto pCurrent = m_iCurrentSection >= 0 ? &m_pTerrainVIS->m_pSections[ m_iCurrentSection ] :
TNULL;
148 m_cbOnVISGroupChanged( pPrevious, pCurrent );
151 m_iPreviousSection = m_iCurrentSection;
157 TFIXME(
"Create and push ATerrainLoadingStallState if needed" );
162 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
168 bSkipLoadingModels =
TTRUE;
173 if ( !bSkipLoadingModels )
177 auto pGroups = m_pTerrainVIS->m_pSections;
182 auto pDVIS = &m_pOrderDVIS[ m_iCurrentSection ];
184 for (
TINT i = 0; i < pDVIS->iCount; i++ )
186 auto uiGroupIndex = pDVIS->pInfo[ i ].uiGroupIndex;
187 auto eLODType = pDVIS->pInfo[ i ].eLODType;
189 if ( pGroups[ uiGroupIndex ].IsLODQueued( eLODType ) )
191 pGroups[ uiGroupIndex ].LoadModels( eLODType );
205 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
223 TFIXME(
"Restore value of m_fnGetCurrentVISGroup if it was saved" );
226 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
237 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
249 auto pDVIS = &m_pOrderDVIS[ m_iCurrentSection ];
251 for (
TINT i = 0; i < pDVIS->iCount; i++ )
253 auto pInfo = &pDVIS->pInfo[ i ];
254 auto pGroup = &m_pTerrainVIS->m_pSections[ pInfo->uiGroupIndex ];
256 if ( pGroup->IsLODLoaded( pInfo->eLODType ) && !pGroup->IsLODEmpty( pInfo->eLODType ) )
259 pGroup->DestroyLOD( pInfo->eLODType );
269static TFLOAT s_ShadowColor2Multiplier = 0.6f;
273 m_pTerrainVIS->m_pPersistantTerrainBlock->UpdateLastAccessTime();
282 m_DefaultShadowColor = pWorldShader->GetShadowColour();
283 m_DefaultAmbientColor = pWorldShader->GetAmbientColour();
285 m_LitShadowColor.x = 0.5f;
286 m_LitShadowColor.y = 0.5f;
287 m_LitShadowColor.z = 0.3254902f;
288 m_LitShadowColor.w = 1.0f;
289 m_LitShadowColor.Multiply( s_ShadowColor2Multiplier );
291 m_LitAmbientColor = m_LitShadowColor;
296 auto pTerrainVIS = m_pTerrainVIS;
298 if (
TNULL != pTerrainVIS )
301 if ( pTerrainVIS->m_iNumSections <= m_iCurrentSection || m_iCurrentSection < 0 )
303 m_iCurrentSection = 0;
306 auto pSections = pTerrainVIS->m_pSections;
307 auto iCurrentSection = m_iCurrentSection;
308 auto pCurrentSection = &pSections[ iCurrentSection ];
310 if (
TNULL == m_pOrderDVIS )
315 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
317 ATerrainLODType eSectionVisibility = pCurrentSection->m_pVisibility[ i ];
321 pSections[ i ].Draw( eSectionVisibility );
330 if ( m_pTerrainVIS ==
TNULL )
335 if ( m_pTerrainVIS->GetLocatorList() && m_pTerrainVIS->GetLocatorList()->GetTRB() )
337 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
339 if (
HASANYFLAG( m_pTerrainVIS->m_pSections[ i ].m_eFlags, 0xF3C ) )
353 TFIXME(
"Do something with ATerrainSectionHudElement" );
358 m_VISTRB.Load( a_szFilePath, 0 );
360 m_pTerrainVIS = m_VISTRB.CastSymbol<
ATerrainVIS>(
"terrainvis" );
363 if ( m_VISTRB.GetSymbolAddress(
"preloadcollision" ) )
366 a_bStreamCollision =
TFALSE;
367 m_iPreloadTerrainBlockSize = m_pTerrainVIS->m_uiPersistantTerrainBlockSize;
370 m_VISTRB.DeleteSymbolTable();
372 if ( !a_bStreamCollision )
374 m_pTerrainVIS->m_uiPersistantTerrainBlockSize = m_iPreloadTerrainBlockSize;
377 if ( m_pTerrainVIS->m_uiPersistantTerrainBlockSize > 0 )
380 m_pTerrainVIS->m_uiPersistantTerrainBlockSize,
386 if ( m_pTerrainVIS->m_iNumHighBlocks > 0 )
388 m_pTerrainVIS->m_ppHighBlocks =
new ATerrainLODBlock*[ m_pTerrainVIS->m_iNumHighBlocks ];
390 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumHighBlocks; i++ )
392 TCHAR szBlockName[ 64 ];
396 m_pTerrainVIS->m_uiHighBlockSize,
403 if ( m_pTerrainVIS->m_iNumLowBlocks > 0 )
405 m_pTerrainVIS->m_ppLowBlocks =
new ATerrainLODBlock*[ m_pTerrainVIS->m_iNumLowBlocks ];
407 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumLowBlocks; i++ )
409 TCHAR szBlockName[ 64 ];
413 m_pTerrainVIS->m_uiLowBlockSize,
419 m_pTerrainVIS->LoadSkeleton();
422 if ( *m_pTerrainVIS->m_szMatLibrary !=
'\0' )
425 auto pPersitantBlock = m_pTerrainVIS->m_pPersistantTerrainBlock;
427 auto pTRB =
new ( pPersitantBlock->GetMemBlock() )
TTRB();
428 m_pTerrainVIS->m_pMaterialLibraryTRB = pTRB;
429 pPersitantBlock->SetupTRB( pTRB, pPersitantBlock );
432 m_pTerrainVIS->m_szMatLibrary,
433 m_pTerrainVIS->m_pMaterialLibraryTRB,
434 m_pTerrainVIS->m_pMaterialLibrary,
435 pPersitantBlock->GetMemBlock()
438 AAssetStreaming::GetSingleton()->AddMainThreadJob( pMatlibJob );
441 m_bStreamCollision = a_bStreamCollision;
444 if ( !a_bStreamCollision )
446 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
448 m_pTerrainVIS->m_pSections[ i ].LoadCollision();
455 while ( AAssetStreaming::GetSingleton()->HasActiveJobs() )
457 AAssetStreaming::GetSingleton()->Update();
459#ifndef BARNYARD_COMMUNITY_PATCH
480 AAssetStreaming::GetSingleton()->Update();
482#ifndef BARNYARD_COMMUNITY_PATCH
492 if ( a_pModelData->IsLinked() )
494 m_llModelNodes.Erase( a_pModelData );
510 iNumBlocks = m_pTerrainVIS->m_iNumHighBlocks;
511 ppBlocks = m_pTerrainVIS->m_ppHighBlocks;
515 iNumBlocks = m_pTerrainVIS->m_iNumLowBlocks;
516 ppBlocks = m_pTerrainVIS->m_ppLowBlocks;
519 auto pCurrentVISGroup = m_pTerrainVIS->m_pSections + m_iCurrentSection;
521 for (
TINT i = 0; i < iNumBlocks; i++ )
523 auto pBlock = ppBlocks[ i ];
532 auto pVIS = m_pTerrainVIS;
534 for (
TINT k = 0; k < pVIS->m_iNumSections; k++ )
536 if ( pCurrentVISGroup->m_pVisibility[ k ] == a_eLODType &&
537 pBlock->m_pVISGroup == &pVIS->m_pSections[ k ] )
548 TASSERT( m_iCurrentSection != -1 );
550 auto pCurrentGroup = &m_pTerrainVIS->m_pSections[ m_iCurrentSection ];
552 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
554 auto eLODType = pCurrentGroup->m_pVisibility[ i ];
558 auto pGroup = &m_pTerrainVIS->m_pSections[ i ];
560 if ( ( pGroup->m_eFlags & ( 21 << eLODType ) ) == 0 )
562 pGroup->SetLODQueued( eLODType,
TTRUE );
568 pCurrentGroup->m_eFlags,
578 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
580 m_pTerrainVIS->m_pSections[ i ].RemoveFromStreamingQueue();
586 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
588 auto pGroup = &m_pTerrainVIS->m_pSections[ i ];
606 iNumBlocks = m_pTerrainVIS->m_iNumHighBlocks;
607 ppBlocks = m_pTerrainVIS->m_ppHighBlocks;
611 iNumBlocks = m_pTerrainVIS->m_iNumLowBlocks;
612 ppBlocks = m_pTerrainVIS->m_ppLowBlocks;
616 TINT iPrevFoundIndex = -1;
619 for (
TINT i = 0; i < iNumBlocks; i++ )
621 auto pBlock = ppBlocks[ i ];
622 iFoundIndex = iPrevFoundIndex;
624 if ( !pBlock->IsUsed() )
627 if ( pBlock->m_pVISGroup ==
TNULL )
break;
629 iFoundIndex = iPrevFoundIndex;
630 if ( !pBlock->m_pVISGroup->IsLODLoading( a_eLODType ) )
633 if ( pBlock->m_pVISGroup =
TNULL )
break;
635 iFoundIndex = iPrevFoundIndex;
636 if ( pBlock->m_fLastAccessTime < fMinAccessTime )
638 fMinAccessTime = pBlock->m_fLastAccessTime;
644 iPrevFoundIndex = iFoundIndex;
647 if ( iFoundIndex >= 0 )
649 auto pBlock = ppBlocks[ iFoundIndex ];
650 auto pVISGroup = pBlock->m_pVISGroup;
654 if ( pVISGroup->IsLODEmpty( pBlock->m_eLODType ) )
656 pVISGroup->SetLODEmpty( pBlock->m_eLODType,
TFALSE );
662 if ( ( pVISGroup->m_eFlags & ( 21 << a_eLODType ) ) != 0 )
664 if ( pVISGroup->IsMatLibLoaded( pBlock->m_eLODType ) )
666 pVISGroup->SetLODEmpty( pBlock->m_eLODType,
TFALSE );
668 if ( pBlock->m_pVISGroup )
670 pBlock->m_pVISGroup->UnloadMatlib( pBlock->m_eLODType );
673 else if ( pBlock->m_pVISGroup )
675 pBlock->m_pVISGroup->DestroyLOD( pBlock->m_eLODType );
683 pVISGroup->DestroyLOD( pBlock->m_eLODType );
688 pBlock->Assign( a_pVISGroup, a_eLODType );
711 a_rOutTransform.
Multiply( matLocator );
729 matTransformed.
Multiply( matLocator );
749 matTransformed.
Multiply( matLocator );
752 a_rOutRotation =
TQuaternion( -vecUp.
x, -vecUp.
y, -vecUp.
z, 1.0f );
759 if ( !m_pTerrainVIS )
767 TASSERT( m_FreeTRBLoaderJobs.Size() > 0,
"No free ATRBLoaderJobs left!" );
769 if ( m_FreeTRBLoaderJobs.Size() > 0 )
771 auto pTRBJobSlot = m_FreeTRBLoaderJobs.PopFront();
772 m_UsedTRBLoaderJobs.PushFront( pTRBJobSlot );
784 TASSERT( m_FreeSkeletonLoaderJobs.Size() > 0,
"No free ASkeletonDoneJobs left!" );
786 if ( m_FreeSkeletonLoaderJobs.Size() > 0 )
788 auto pTRBJobSlot = m_FreeSkeletonLoaderJobs.PopFront();
789 m_UsedSkeletonLoaderJobs.PushFront( pTRBJobSlot );
801 TASSERT( m_FreeMatlibLoaderJobs.Size() > 0,
"No free AMatlibLoaderJobs left!" );
803 if ( m_FreeMatlibLoaderJobs.Size() > 0 )
805 auto pTRBJobSlot = m_FreeMatlibLoaderJobs.PopFront();
806 m_UsedMatlibLoaderJobs.PushFront( pTRBJobSlot );
818 TASSERT( m_FreeCollisionLoaderJobs.Size() > 0,
"No free ACollisionDoneJob left!" );
820 if ( m_FreeCollisionLoaderJobs.Size() > 0 )
822 auto pTRBJobSlot = m_FreeCollisionLoaderJobs.PopFront();
823 m_UsedCollisionLoaderJobs.PushFront( pTRBJobSlot );
835 TASSERT( m_FreeModelLoaderJobs.Size() > 0,
"No free AModelLoaderJob left!" );
837 if ( m_FreeModelLoaderJobs.Size() > 0 )
839 auto pTRBJobSlot = m_FreeModelLoaderJobs.PopFront();
840 m_UsedModelLoaderJobs.PushFront( pTRBJobSlot );
852 TASSERT( m_FreeSectionLoaderJobs.Size() > 0,
"No free ASectionDoneJob left!" );
854 if ( m_FreeSectionLoaderJobs.Size() > 0 )
856 auto pTRBJobSlot = m_FreeSectionLoaderJobs.PopFront();
857 m_UsedSectionLoaderJobs.PushFront( pTRBJobSlot );
867void ATerrainInterface::FlushJobs()
869 MoveAllFinishedJobs( m_FreeModelLoaderJobs, m_UsedModelLoaderJobs );
870 MoveAllFinishedJobs( m_FreeUnknownLoaderJobs, m_UsedUnknownLoaderJobs );
871 MoveAllFinishedJobs( m_FreeSectionLoaderJobs, m_UsedSectionLoaderJobs );
872 MoveAllFinishedJobs( m_FreeKeylibLoaderJobs, m_UsedKeylibLoaderJobs );
873 MoveAllFinishedJobs( m_FreeMatlibLoaderJobs, m_UsedMatlibLoaderJobs );
874 MoveAllFinishedJobs( m_FreeTRBLoaderJobs, m_UsedTRBLoaderJobs );
875 MoveAllFinishedJobs( m_FreeSkeletonLoaderJobs, m_UsedSkeletonLoaderJobs );
876 MoveAllFinishedJobs( m_FreeCollisionLoaderJobs, m_UsedCollisionLoaderJobs );
879void ATerrainInterface::MoveAllFinishedJobs( Toshi::T2SList<JobSlot>& a_rFreeJobs, Toshi::T2SList<JobSlot>& a_rUsedJobs )
881 for (
auto it = a_rUsedJobs.Begin(); it != a_rUsedJobs.End(); )
883 auto pNext = it.Next();
885 if ( it->GetNodeValue()->IsFinished() )
887 a_rUsedJobs.Erase( it );
888 a_rFreeJobs.PushFront( it );
895#ifdef TOSHI_SKU_WINDOWS
901 if (
TNULL != pSkeletonInstance )
903 pSkeletonInstance->UpdateState(
TFALSE );
908 auto pModel = a_pModelInstance->
GetModel();
909 auto pLOD = &pModel->
GetLOD( a_pModelInstance->
GetLOD() );
911 for (
TINT i = 0; pLOD->iNumMeshes; i++ )
914 pLOD->ppMeshes[ i ]->Render();
931 TTODO(
"Calculate real lighting colour" );
936 colour.
z = 0.1952941f;
943static void RenderWorldVisWin(
TModelInstance* a_pModelInstance,
void* a_pModelNode )
945 auto pModel = a_pModelInstance->
GetModel();
948 if (
TNULL != pModel->GetTRB() )
950 auto pWorldDatabase = pModel->CastSymbol<
WorldDatabase>(
"Database" );
953 if (
TNULL != pWorldDatabase )
958 TFLOAT fAlphaBlend = pRenderContext->GetAlphaBlend();
961 pRenderContext->ComputePerspectiveProjection(
963 pRenderContext->GetViewportParameters(),
964 pRenderContext->GetProjectionParams()
967 TMatrix44 modelView = pRenderContext->GetModelViewMatrix();
969 const TBOOL bIsDefaultRenderer =
970 ( pModelNode->m_WorldVis.m_pfnRenderCallback == RenderCellMeshDefault );
973 if ( bIsDefaultRenderer && pModelNode->IsUsingLighting() )
974 pModelNode->m_WorldVis.m_pfnRenderCallback = RenderCellMeshWin;
977 pModelNode->m_WorldVis.Reset();
978 pModelNode->m_WorldVis.Build( modelView, projection, 0 );
979 pModelNode->m_WorldVis.Render( modelView );
982 if ( bIsDefaultRenderer )
983 pModelNode->m_WorldVis.m_pfnRenderCallback = RenderCellMeshDefault;
985 pRenderContext->SetAlphaBlend( fAlphaBlend );
995 auto pModel = a_pModelNode->
m_ModelRef.GetModel();
996 if ( !pModel || !pModel->IsCreated() )
1004 auto pInstance = a_pModelNode->
m_ModelRef.CreateSceneObject();
1005 auto pInstanceTransform = &pInstance->GetTransform();
1007 pInstanceTransform->SetEuler(
TVector3( 1.570796f, 0.0f, 0.0f ) );
1011 pInstanceTransform->GetLocalMatrixImp( collisionLocalMatrix );
1012 pInstanceTransform->SetMatrix( collisionLocalMatrix );
1016 pInstance->GetSomeVector1().x = 1.0f;
1017 pInstance->GetSomeVector1().y = 1.0f;
1018 pInstance->GetSomeVector2().x = 10000000.0f;
1019 pInstance->GetSomeVector2().y = 10000001.0f;
1020 pInstance->EnableSkeletonUpdate();
1021 pInstance->EnableUnknown1();
1023 TTODO(
"Create collision model set" );
1025 auto pModelInstance = pInstance->GetInstance();
1026 pModel = pModelInstance->GetModel();
1028 auto pWorldDatabase = pModel->CastSymbol<
WorldDatabase>(
"Database" );
1030 if (
TNULL == pWorldDatabase )
1033 pModelInstance->SetPreRenderCallback( RenderWorldWin );
1038 auto& rLOD = pModel->GetLOD( 0 );
1040 if ( rLOD.iNumMeshes < 1 )
1043 pModelInstance->SetPreRenderCallback( RenderNothing );
1047 pModelInstance->SetCustomRenderMethod( RenderWorldVisWin, a_pModelNode );
1055 TTODO(
"Setup materials" );
1064 if (
TNULL != a_szType )
1070 m_llModelNodes.PushBack( a_pModelNode );
1072 return a_pModelNode;
1077 if ( m_iCurrentSection != m_iPreviousSection && m_iPreviousSection >= 0 )
1079 for (
TINT i = 0; i < m_pTerrainVIS->m_iNumSections; i++ )
1081 auto pGroup = &m_pTerrainVIS->m_pSections[ i ];
1085 if ( i < 0 )
return;
1086 if ( pGroup->m_pVisibility[ i ] == ( ( pGroup->m_eFlags >> 2 ) - 1 ) %
ATerrainLODType_NUMOF )
return;
1087 if ( i == m_iCurrentSection )
return;
1089 AAssetStreaming::GetSingleton()->CancelAllJobs();
1096void ATerrainInterface::UpdateNightMaterials()
1101TINT ATerrainInterface::GetCurrentSectionID()
1107TINT ATerrainInterface::GetPersistantSectionID()
1109 return ms_iPersistantVISGroupIndex;
@ BASISVECTOR_TRANSLATION
#define TSTATICCAST(POINTERTYPE, VALUE)
#define HASANYFLAG(STATE, FLAG)
#define TOSHI_NAMESPACE_USING
#define TPROFILER_SCOPE()
#define TDYNAMICCAST(T, OBJECT)
void ThreadSleep(TUINT dwMilliseconds)
constexpr TFLOAT MAXFLOAT
const TVector3 & AsBasisVector3(BASISVECTOR a_iIndex) const
const TVector4 & AsBasisVector4(BASISVECTOR a_iIndex) const
void Multiply(const TMatrix44 &a_rLeft, const TMatrix44 &a_rRight)
static constinit const TVector3 VEC_ZERO
TModel * GetModel() const
TSkeletonInstance * GetSkeletonInstance() const
TModelLOD & GetLOD(TUINT32 a_uiLOD)
void SetSkeletonInstance(TSkeletonInstance *a_pSkeletonInstance)
TCameraObject * GetCameraObject() const
TRenderContext * GetCurrentContext() const
virtual TBOOL Update(float a_fDeltaTime)=0
static TFORCEINLINE TRenderInterface * GetSingleton()
static TSIZE String8Length(const TCHAR *str)
static void String8Format(TCHAR *str, TINT size, const TCHAR *format,...)
static TCHAR * String8Copy(TCHAR *dst, const TCHAR *src, TSIZE size=-1)
static Toshi::TTRB * GetAssetTRB(AAssetType a_eAssetType)
ASectionDoneJob * GetFreeSectionLoaderJob()
static constexpr TUINT MAX_NUM_SECTION_LOADER_JOBS
AMatLibLoaderJob * GetFreeMatlibLoaderJob()
ATerrainLocator * FindLocator(const TCHAR *a_pszLocatorName)
Finds a locator (bone) by the specified name and returns it if found.
void UpdateUsedBlocks(ATerrainLODType a_eLODType)
Sets visible blocks of specified LOD type to be used.
virtual ~ATerrainInterface()
void QueueStreamingAssets()
void UnqueueStreamingAssets()
void LoadFromFile(const TCHAR *a_szFilePath, TBOOL a_bLoadLater, TBOOL a_bStreamCollision)
Loads information about terrain.
Toshi::TVector4 GetLocatorPos(const TCHAR *a_pszLocatorName)
Finds a locator (bone) by the specified name and obtains it current position if found.
static constexpr TUINT MAX_NUM_TRB_LOADER_JOBS
ASkeletonDoneJob * GetFreeSkeletonLoaderJob()
void DestroyModelData(ATerrainSection::ModelNode *a_pModelData)
void GetLocatorTransform(const TCHAR *a_pszLocatorName, Toshi::TMatrix44 &a_rOutTransform)
Finds a locator (bone) by the specified name and obtains it current transform if found.
static constexpr TUINT MAX_NUM_MATLIB_LOADER_JOBS
ACollisionDoneJob * GetFreeCollisionLoaderJob()
ATerrainSection::ModelNode * CreateModelInstance(ATerrainSection::ModelNode *a_pModelNode, const char *a_szModelName, const char *a_szType)
static constexpr TUINT MAX_NUM_MODEL_LOADER_JOBS
ATerrainLocatorList * GetLocatorList() const
ATerrainLODBlock * AllocateLODBlock(ATerrainLODType a_eLODType, ATerrainSection *a_pVISGroup)
Allocates free LODBlock of specified type and assigns it to the section.
static constexpr TUINT MAX_NUM_SKELETON_LOADER_JOBS
static constexpr TUINT NUM_TOTAL_JOBS
ATerrainInterface(TINT a_iUnused1, TINT a_iUnused2, TINT a_iPreloadTerrainBlockSize, TINT a_iStartVISGroup)
static constexpr TUINT MAX_NUM_COLLISION_LOADER_JOBS
void GetLocatorPosAndRot(const TCHAR *a_pszLocatorName, Toshi::TVector4 &a_rOutPosition, Toshi::TQuaternion &a_rOutRotation)
Finds a locator (bone) by the specified name and obtains it current position and rotation if found.
AModelLoaderJob * GetFreeModelLoaderJob()
static constexpr TUINT MAX_NUM_KEYLIB_LOADER_JOBS
void CancelUnrequiredJobs()
Toshi::T2SListNodeWrapper< AMainThreadJob > JobSlot
ATRBLoaderJob * GetFreeTRBLoaderJob()
void GetMatrix(Toshi::TMatrix44 &a_rOutMatrix)
Toshi::TTransformObject & GetWorldTransform()
ATerrainLocator * FindLocator(const TCHAR *a_pszLocatorName)
Toshi::TSceneObject * m_pSceneObject
Toshi::TManagedModel m_ModelRef
static constexpr TUINT TYPE_NAME_MAX_SIZE
char m_szType[TYPE_NAME_MAX_SIZE+1]
t_RenderCallback m_pfnRenderCallback
void Create(World *a_pWorld)