OpenBarnyard
 
Loading...
Searching...
No Matches
AModelLoader_World.cpp
Go to the documentation of this file.
1#include "pch.h"
2#include "AModelLoader.h"
3#include "World/AWorldVIS.h"
4#include "AAssetLoader.h"
6
7#ifdef TOSHI_SKU_WINDOWS
13#endif // TOSHI_SKU_WINDOWS
14
16
17//-----------------------------------------------------------------------------
18// Enables memory debugging.
19// Note: Should be the last include!
20//-----------------------------------------------------------------------------
21#include <Core/TMemoryDebugOn.h>
22
24
25static TUINT s_iMeshIndex = 0;
26static TUINT s_iGrassMeshIndex = 0;
28Toshi::T2Texture* g_aGrassLayers[ 7 ];
29static TClass* s_pWorldMaterialClass = TNULL;
30
31// $Barnyard: FUNCTION 00613270
32void AModelLoader::InitialiseGrassLayersTextures()
33{
34 g_pGrassLayersMatLib = AMaterialLibraryManager::List::GetSingleton()->CreateLibraryFromAsset(
35 "Data\\MiscTextures\\GrasslayertexWin.ttl",
37 );
38
40
41 g_aGrassLayers[ 1 ] = g_pGrassLayersMatLib->GetTexture( g_pGrassLayersMatLib->FindTextureIndex( "treeb3.tga" ) )->pTexture;
43 g_aGrassLayers[ 3 ] = g_pGrassLayersMatLib->GetTexture( g_pGrassLayersMatLib->FindTextureIndex( "treeb2.tga" ) )->pTexture;
45 g_aGrassLayers[ 5 ] = g_pGrassLayersMatLib->GetTexture( g_pGrassLayersMatLib->FindTextureIndex( "treeb1.tga" ) )->pTexture;
47}
48
49static void LoadTreeIntersect( CellSphereTreeBranchNode* a_pRenderGroup, Cell*& a_ppModel, TModelLOD* a_pModelLOD )
50{
51 TVALIDPTR( a_pRenderGroup );
52
53 // Load sub groups
54 auto pShader = TDYNAMICCAST( AWorldShaderHAL, AWorldShader::GetSingleton() );
55 auto pRenderGroup = a_pRenderGroup;
56 while ( !pRenderGroup->IsLeaf() )
57 {
58 LoadTreeIntersect( pRenderGroup->GetSubNode(), a_ppModel, a_pModelLOD );
59 pRenderGroup = pRenderGroup->m_pRight;
60 }
61
62 TASSERT( pRenderGroup->IsLeaf() );
63 auto pRenderData = pRenderGroup->GetLeafNode();
64
65 for ( TUINT i = 0; i < pRenderData->m_uiNumMeshes; i++ )
66 {
67 auto pTerrainMesh = a_ppModel->ppCellMeshSpheres[ pRenderData->GetMeshIndex( i ) ]->m_pCellMesh;
68 auto pMesh = pShader->CreateMesh( TNULL );
69
70 pMesh->Create( 0, pTerrainMesh->uiNumVertices1 );
71 pTerrainMesh->pMesh = pMesh;
72
73 if ( TNULL == s_pWorldMaterialClass )
74 {
75 s_pWorldMaterialClass = TClass::Find( "AWorldMaterial" );
76 }
77
78 TVALIDPTR( s_pWorldMaterialClass );
79
80 pMesh->SetMaterial( AModelLoader::CreateMaterial( pShader, pTerrainMesh->szMaterialName ) );
81 a_pModelLOD->ppMeshes[ s_iMeshIndex++ ] = pMesh;
82
83 auto pSubMesh = pMesh->GetSubMesh( 0 );
84 pSubMesh->pAssociatedMesh = pMesh;
85
86 // Create index pool
87 if ( pSubMesh->pIndexPool == TNULL )
88 {
90 TVALIDPTR( pIndexFactory );
91
92 pSubMesh->pIndexPool = pIndexFactory->CreatePoolResource( pTerrainMesh->uiNumIndices, 9 );
93 }
94
95 pSubMesh->uiNumVertices = pTerrainMesh->uiNumVertices2;
96
97 // Write vertices
98 if ( pTerrainMesh->uiNumVertices1 != 0 )
99 {
100 AWorldMesh::LockBuffer lockBuffer;
101 TBOOL bLocked = pMesh->Lock( lockBuffer );
102
103 if ( bLocked )
104 {
105 TUtil::MemCopy( lockBuffer.apStreams[ 0 ], pTerrainMesh->pVertices, sizeof( WorldVertex ) * pTerrainMesh->uiNumVertices1 );
106 pMesh->Unlock( pTerrainMesh->uiNumVertices1 );
107 }
108 else
109 {
110 TASSERT( !"Couldn't lock buffer" );
111 }
112 }
113
114 // Write indices
115 if ( pTerrainMesh->uiNumIndices != 0 )
116 {
117 TVALIDPTR( pSubMesh->pIndexPool );
119
120 pSubMesh->pIndexPool->Lock( &lockBuffer );
121 TUtil::MemCopy( lockBuffer.pBuffer, pTerrainMesh->pIndices, pTerrainMesh->uiNumIndices * sizeof( TUINT16 ) );
122 pSubMesh->pIndexPool->Unlock( pTerrainMesh->uiNumIndices );
123 }
124 }
125}
126
127void AModelLoader::LoadWorldMeshTRB( Toshi::TModel* a_pModel, TINT a_iLODIndex, Toshi::TModelLOD* a_pLOD, Toshi::TTMDWin::TRBLODHeader* a_pLODHeader )
128{
130
131 TVALIDPTR( a_pModel );
132 TVALIDPTR( a_pLOD );
133
134 s_iMeshIndex = 0;
135 auto pDatabase = a_pModel->CastSymbol<WorldDatabase>( "Database" );
136
137 for ( TUINT i = 0; i < pDatabase->m_uiNumWorlds; i++ )
138 {
139 auto pWorld = pDatabase->m_ppWorlds[ i ];
140
141 for ( TINT k = 0; k < pWorld->m_iNumCells; k++ )
142 {
143 auto pModel = pWorld->m_ppCells[ k ];
144 LoadTreeIntersect( pModel->pTreeBranchNodes, pModel, a_pLOD );
145 }
146 }
147}
148
149static void LoadGrassTreeIntersect( CellSphereTreeBranchNode* a_pRenderGroup, Cell*& a_ppModel, TModelLOD* a_pModelLOD )
150{
151 TVALIDPTR( a_pRenderGroup );
152
153 // Load sub groups
154 auto pShader = TDYNAMICCAST( AGrassShaderHAL, AGrassShader::GetSingleton() );
155 auto pRenderGroup = a_pRenderGroup;
156 while ( !pRenderGroup->IsLeaf() )
157 {
158 LoadGrassTreeIntersect( pRenderGroup->GetSubNode(), a_ppModel, a_pModelLOD );
159 pRenderGroup = pRenderGroup->m_pRight;
160 }
161
162 TASSERT( pRenderGroup->IsLeaf() );
163 auto pRenderData = pRenderGroup->GetLeafNode();
164
165 for ( TUINT i = 0; i < pRenderData->m_uiNumMeshes; i++ )
166 {
167 CellMeshSphere* pCellMeshSphere = a_ppModel->ppCellMeshSpheres[ pRenderData->GetMeshIndex( i ) ];
168 CellMesh* pTerrainMesh = pCellMeshSphere->m_pCellMesh;
169 AGrassMeshHAL* pMesh = TSTATICCAST( AGrassMeshHAL, pShader->CreateMesh( TNULL ) );
170
171 pMesh->CreateHAL( 0, pTerrainMesh->uiNumVertices1, pCellMeshSphere );
172 pTerrainMesh->pMesh = pMesh;
173
175
176 if ( !pMaterial )
177 {
178 pMaterial = TSTATICCAST( AGrassMaterialHAL, pShader->CreateMaterial( TNULL ) );
179 pMaterial->Create( 0 );
180 pMaterial->SetFlags( TMaterial::FLAGS_NO_CULL, TFALSE );
181 pMaterial->SetTexture( 0, TNULL );
182 pMaterial->SetTextureNum( 1 );
183 }
184
185 pMesh->SetMaterial( pMaterial );
186 a_pModelLOD->ppMeshes[ s_iGrassMeshIndex++ ] = pMesh;
187
188 auto pSubMesh = pMesh->GetSubMesh( 0 );
189 pSubMesh->pAssociatedMesh = pMesh;
190
191 // Create index pool
192 if ( pSubMesh->pIndexPool == TNULL )
193 {
195 TVALIDPTR( pIndexFactory );
196
197 pSubMesh->pIndexPool = pIndexFactory->CreatePoolResource( pTerrainMesh->uiNumIndices, 9 );
198 }
199
200 pSubMesh->uiNumVertices = pTerrainMesh->uiNumVertices2;
201
202 // Write vertices
203 if ( pTerrainMesh->uiNumVertices1 != 0 )
204 {
205 AWorldMesh::LockBuffer lockBuffer;
206 TBOOL bLocked = pMesh->Lock( lockBuffer );
207
208 if ( bLocked )
209 {
210 TUtil::MemCopy( lockBuffer.apStreams[ 0 ], pTerrainMesh->pVertices, sizeof( WorldVertex ) * pTerrainMesh->uiNumVertices1 );
211 pMesh->Unlock( pTerrainMesh->uiNumVertices1 );
212 }
213 else
214 {
215 TASSERT( !"Couldn't lock buffer" );
216 }
217 }
218
219 // Write indices
220 if ( pTerrainMesh->uiNumIndices != 0 )
221 {
222 TVALIDPTR( pSubMesh->pIndexPool );
224
225 pSubMesh->pIndexPool->Lock( &lockBuffer );
226 TUtil::MemCopy( lockBuffer.pBuffer, pTerrainMesh->pIndices, pTerrainMesh->uiNumIndices * sizeof( TUINT16 ) );
227 pSubMesh->pIndexPool->Unlock( pTerrainMesh->uiNumIndices );
228 }
229 }
230}
231
232void AModelLoader::LoadGrassMeshTRB( TModel* a_pModel, TINT a_iLODIndex, TModelLOD* a_pLOD, Toshi::TTMDWin::TRBLODHeader* a_pLODHeader )
233{
235
236 TVALIDPTR( a_pModel );
237 TVALIDPTR( a_pLOD );
238
239 s_iGrassMeshIndex = 0;
240 auto pDatabase = a_pModel->CastSymbol<WorldDatabase>( "Database" );
241
242 for ( TUINT i = 0; i < pDatabase->m_uiNumWorlds; i++ )
243 {
244 auto pWorld = pDatabase->m_ppWorlds[ i ];
245
246 for ( TINT k = 0; k < pWorld->m_iNumCells; k++ )
247 {
248 auto pModel = pWorld->m_ppCells[ k ];
249 LoadGrassTreeIntersect( pModel->pTreeBranchNodes, pModel, a_pLOD );
250 }
251 }
252}
@ SYSRESOURCE_IFSYS
Definition TRender.h:18
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 TPROFILER_SCOPE()
Definition Profiler.h:17
#define TDYNAMICCAST(T, OBJECT)
Definition TObject.h:227
uint16_t TUINT16
Definition Typedefs.h:15
unsigned int TUINT
Definition Typedefs.h:8
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
bool TBOOL
Definition Typedefs.h:6
@ AAssetType_Startup
Definition AAssetLoader.h:8
Toshi::T2Texture * g_aGrassLayers[7]
AMaterialLibrary * g_pGrassLayersMatLib
@ FLAGS_NO_CULL
Definition TMaterial.h:24
TMesh ** ppMeshes
Definition TModel.h:28
T * CastSymbol(const TCHAR *a_szSymbolName)
Definition TModel.h:133
T * GetSystemResource(SYSRESOURCE systemResource)
Definition TClass.h:8
static TClass * Find(const TCHAR *name, TClass *parent=TNULL)
Definition TClass.cpp:110
static TFORCEINLINE TRenderInterface * GetSingleton()
Definition TSingleton.h:49
static void * MemCopy(void *dst, const void *src, TSIZE size)
Definition TUtil.h:90
static Toshi::TTRB * GetAssetTRB(AAssetType a_eAssetType)
static Toshi::TMaterial * CreateMaterial(Toshi::TShader *a_pShader, const TCHAR *a_szMaterialName)
void CreateHAL(TUINT32 a_eFlags, TUINT16 a_uiMaxVertices, CellMeshSphere *a_pCellMeshSphere)
virtual TBOOL Create(BLENDMODE a_eBlendMode)
void SetTexture(TUINT a_uiStage, Toshi::TTexture *a_pTexture)
virtual TBOOL Lock(LockBuffer &a_rLockBuffer)
virtual void Unlock(TUINT32 a_uiNumVertices)
AWorldMesh::SubMesh * GetSubMesh(TUINT a_uiIndex)
Definition AGrassMesh.h:38
Toshi::TVertexPoolResourceInterface::LockBuffer LockBuffer
Definition AWorldMesh.h:20
TMesh * pAssociatedMesh
Definition AWorldMesh.h:13
TUINT32 uiNumVertices1
Definition AWorld.h:73
WorldVertex * pVertices
Definition AWorld.h:76
Toshi::TMesh * pMesh
Definition AWorld.h:71
TUINT32 uiNumIndices
Definition AWorld.h:72
TUINT16 * pIndices
Definition AWorld.h:77
TUINT16 uiNumVertices2
Definition AWorld.h:74
TCHAR * szMaterialName
Definition AWorld.h:75
CellMesh * m_pCellMesh
Definition AWorld.h:83
Definition AWorld.h:128
CellMeshSphere ** ppCellMeshSpheres
Definition AWorld.h:141