4#ifdef TOSHI_SKU_WINDOWS
23void AModelLoader::LoadSkinLOD( Toshi::TModel* a_pModel,
TINT a_iLODIndex, Toshi::TModelLOD* a_pLOD, Toshi::TTMDWin::TRBLODHeader* a_pLODHeader )
27 auto pShader =
TDYNAMICCAST( ASkinShaderHAL, ASkinShader::GetSingleton() );
29 TINT iMeshCount = a_pLODHeader->m_iMeshCount1 + a_pLODHeader->m_iMeshCount2;
31 for (
TINT i = 0; i < iMeshCount; i++ )
34 symbolName.
Format(
"LOD%d_Mesh_%d", a_iLODIndex, i );
36 auto pTRBMesh = a_pModel->CastSymbol<TTMDWin::TRBLODMesh>( symbolName.
Get() );
38 auto pMesh = pShader->CreateMesh(
TNULL );
39 pMesh->Create( 0, pTRBMesh->m_uiNumVertices, pTRBMesh->m_uiNumSubMeshes );
41 if (
TNULL == s_pSkinMaterialClass )
46 auto pMaterial =
CreateMaterial( pShader, pTRBMesh->m_szMaterialName );
47 pMesh->SetMaterial( pMaterial );
49 a_pLOD->ppMeshes[ i ] = pMesh;
51 for (
TUINT k = 0; k < pTRBMesh->m_uiNumSubMeshes; k++ )
53 auto pSubMesh = pMesh->GetSubMesh( k );
54 auto pTRBSubMesh = &pTRBMesh->m_pSubMeshes[ k ];
56 TUtil::MemCopy( pSubMesh->aBones, pTRBSubMesh->m_pBones, pTRBSubMesh->m_uiNumBones *
sizeof(
TINT ) );
59 if ( pSubMesh->pIndexPool ==
TNULL )
64 pSubMesh->pIndexPool = pIndexFactory->CreatePoolResource( pTRBMesh->m_uiNumIndices, 9 );
67 pSubMesh->uiNumBones = pTRBSubMesh->m_uiNumBones;
68 pSubMesh->uiNumVertices = pTRBSubMesh->m_uiNumVertices2;
69 pSubMesh->Zero = pTRBSubMesh->m_Zero;
70 pSubMesh->Unk2 = pTRBSubMesh->m_Unk2;
71 pSubMesh->Unk3 = pTRBSubMesh->m_Unk3;
72 pSubMesh->Unk4 = pTRBSubMesh->m_Unk4;
73 pSubMesh->Unk5 = pTRBSubMesh->m_Unk5;
74 pSubMesh->Unk6 = pTRBSubMesh->m_Unk6;
76 if ( pTRBSubMesh->m_uiNumVertices1 != 0 )
78 auto pVertexPool = pMesh->GetVertexPool();
80 TVertexPoolResourceInterface::LockBuffer vertexLockBuffer;
81 TBOOL bLocked = pVertexPool->Lock( &vertexLockBuffer );
83 TASSERT( bLocked &&
"Couldn't lock vertex buffer" );
87 TUtil::MemCopy( vertexLockBuffer.
apStreams[ 0 ], pTRBSubMesh->m_pVertices, pTRBSubMesh->m_uiNumVertices1 * 40 );
88 pVertexPool->Unlock( pTRBSubMesh->m_uiNumVertices1 );
92 auto pIndexPool = pSubMesh->pIndexPool;
95 if ( pTRBSubMesh->m_uiNumIndices != 0 )
97 TIndexPoolResourceInterface::LockBuffer indexLockBuffer;
99 pIndexPool->Lock( &indexLockBuffer );
101 pIndexPool->Unlock( pTRBSubMesh->m_uiNumIndices );
Rendering system interface for the Toshi engine.
#define TOSHI_NAMESPACE_USING
#define TPROFILER_SCOPE()
T2FormatString< 128, T2StringTraits< TCHAR > > T2FormatString128
#define TDYNAMICCAST(T, OBJECT)
T * GetSystemResource(SYSRESOURCE systemResource)
TBYTE * apStreams[TVertexFactoryFormat::MAX_NUM_STREAMS]
void Format(const CharType *a_szFormat,...)
constexpr CharType * Get()
static TClass * Find(const TCHAR *name, TClass *parent=TNULL)
static TFORCEINLINE TRenderInterface * GetSingleton()
static void * MemCopy(void *dst, const void *src, TSIZE size)
static Toshi::TMaterial * CreateMaterial(Toshi::TShader *a_pShader, const TCHAR *a_szMaterialName)