Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // creates LODS
- BOOL __fastcall CModelData::CreateDrawGroupInfo(CModelData *pThis, __int64 a2)
- {
- WMBHdr *pWmb; // rax
- __int64 v3; // r15
- CModelData *pData; // rbx
- signed __int64 nLODS; // r13
- PVOID v6; // rax
- __int64 LODOffset; // rcx
- char *pLODS; // rsi
- __int64 v9; // rcx
- CHeapInstance *v10; // r10
- __int64 LODSize; // r8
- __int64 *v12; // rax
- __int64 v13; // rax
- signed __int64 i; // rbp
- __int64 idx; // r14
- __int64 pnBatchInfosOffset; // rsi
- __int64 nameOffset; // rax
- CDrawGroupInfo *pLOD; // rdi
- const char *szLODName; // rdx
- __int64 batchInfoOffset; // rax
- CBatchInfo *pBatchInfo; // rax
- int v22; // eax
- int iLODLevel; // ecx
- unsigned int k; // er9
- __int64 batchInfoIdx; // r8
- int lod; // ecx
- CMesh *pMesh; // rdx
- unsigned __int64 v28; // rcx
- __int64 v29; // r10
- bool v30; // of
- signed __int64 v31; // rax
- CHeapInstance *v32; // rcx
- __int64 v33; // r8
- __int64 *v34; // rax
- __int64 v35; // rax
- PVOID v36; // rax
- int l; // er9
- __int64 v38; // r11
- int v39; // er10
- signed int iCurLODLevel; // er8
- __int64 _nLODS; // rdx
- int v42; // ecx
- CDrawGroupInfo *pCurLOD; // rax
- HeapAlloc_t pThisa; // [rsp+30h] [rbp-58h]
- __int64 v46; // [rsp+40h] [rbp-48h]
- signed int v47; // [rsp+50h] [rbp-38h]
- signed int v48; // [rsp+54h] [rbp-34h]
- __int64 pModelAnalyzer; // [rsp+90h] [rbp+8h]
- pWmb = pThis->m_pHdr;
- v3 = a2;
- pData = pThis;
- nLODS = pThis->m_pHdr->numLods;
- if ( nLODS <= 0 )
- {
- LODWORD(v6) = 1;
- return v6;
- }
- pModelAnalyzer = *(a2 + 0x48);
- LODOffset = pWmb->ofsLods;
- pLODS = 0i64;
- if ( LODOffset )
- pLODS = pWmb + LODOffset;
- v9 = *a2;
- v10 = **a2;
- v48 = -1;
- v47 = 0;
- LODSize = 32 * nLODS;
- v12 = *(v9 + 0x28);
- if ( !is_mul_ok(nLODS, 32ui64) )
- LODSize = -1i64;
- if ( v12 )
- {
- v13 = *v12;
- v47 = 1;
- v46 = v13;
- }
- CHeapInstance::ReserveMemory(v10, &pThisa, LODSize, v10->m_qwMemoryAlignment, 0, &v46);
- v6 = pThisa.Pointer;
- pData->m_pLODS = pThisa.Pointer;
- if ( v6 )
- {
- pData->gapE8[2] = 0;
- i = 0i64;
- if ( nLODS > 0 )
- {
- idx = 0i64;
- pnBatchInfosOffset = (pLODS + 16);
- do
- {
- nameOffset = *(pnBatchInfosOffset - 16);
- pLOD = &pData->m_pLODS[idx];
- szLODName = (nameOffset ? (pData->m_pHdr + nameOffset) : 0i64);
- batchInfoOffset = *(pnBatchInfosOffset - 4);
- pBatchInfo = (batchInfoOffset ? (pData->m_pHdr + batchInfoOffset) : 0i64);
- pLOD->m_pBatchInfos = pBatchInfo;
- pLOD->m_nBatchInfos = *pnBatchInfosOffset;
- pLOD->m_uBatchStart = *(pnBatchInfosOffset - 8);
- pLOD->m_iLODLevel = *(pnBatchInfosOffset - 12);
- v22 = (*(*pModelAnalyzer + 8i64))(pModelAnalyzer, szLODName);// CModelAnalyzer__LOD_sub_143F4B620
- pLOD->dword0 = v22;
- if ( v22 < 0 || v22 >= *(v3 + 0x78) )
- goto FAIL;
- if ( pData->pad9 > v22 )
- v22 = pData->pad9;
- pData->pad9 = v22;
- iLODLevel = pLOD->m_iLODLevel;
- if ( iLODLevel != -1 )
- {
- if ( pData->gapE8[2] > iLODLevel )
- iLODLevel = pData->gapE8[2];
- k = 0;
- pData->gapE8[2] = iLODLevel;
- if ( pLOD->m_nBatchInfos )
- {
- batchInfoIdx = 0i64;
- do
- {
- ++batchInfoIdx;
- lod = pLOD->m_iLODLevel;
- pMesh = &pData->m_pMeshes[*(&pLOD->m_pBatchInfos[batchInfoIdx] - 5)];// pLOD->m_pBatchInfos[batchInfoIdx - 1].m_iMeshIndex;
- if ( pMesh->m_uHighestLod > lod )
- lod = pMesh->m_uHighestLod;
- ++k;
- pMesh->m_uHighestLod = lod;
- }
- while ( k < pLOD->m_nBatchInfos );
- }
- }
- ++i;
- ++idx;
- pnBatchInfosOffset += 20i64;
- }
- while ( i < nLODS );
- }
- ++pData->pad9;
- pData->m_nLODS = nLODS;
- if ( pData->gapE8[2] > *(v3 + 0x10C) )
- goto FAIL;
- v28 = pData->pad9;
- v29 = *v3;
- v48 = -1;
- v47 = 0;
- v31 = 4 * v28;
- v30 = v28 * 4ui64 >> 64 != 0;
- v32 = *v29;
- v33 = v31;
- v34 = *(v29 + 40);
- if ( v30 )
- v33 = -1i64;
- if ( v34 )
- {
- v35 = *v34;
- v47 = 1;
- v46 = v35;
- }
- CHeapInstance::ReserveMemory(v32, &pThisa, v33, v32->m_qwMemoryAlignment, 0, &v46);
- v36 = pThisa.Pointer;
- *&pData->padAC[4] = pThisa.Pointer;
- if ( !v36 )
- {
- FAIL:
- LODWORD(v6) = 0;
- return v6;
- }
- l = 0;
- if ( pData->pad9 > 0 )
- {
- v38 = 0i64;
- do
- {
- v39 = 0;
- iCurLODLevel = -1;
- for ( *(v38 + *&pData->padAC[4]) = 0; iCurLODLevel <= pData->gapE8[2]; ++iCurLODLevel )
- {
- _nLODS = pData->m_nLODS;
- v42 = 0;
- if ( _nLODS > 0 )
- {
- pCurLOD = pData->m_pLODS;
- do
- {
- if ( l == pCurLOD->dword0 && iCurLODLevel == pCurLOD->m_iLODLevel )
- v42 += pCurLOD->m_nBatchInfos;
- ++pCurLOD;
- --_nLODS;
- }
- while ( _nLODS );
- if ( v42 > 0 )
- {
- if ( v39 > v42 )
- v42 = v39;
- *(v38 + *&pData->padAC[4]) = 1;
- v39 = v42;
- }
- }
- }
- pData->gapE8[0] += v39;
- ++l;
- v38 += 4i64;
- }
- while ( l < pData->pad9 );
- }
- LODWORD(v6) = 1;
- }
- return v6;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement