Advertisement
Martymoose98

CModelData::CreateDrawGroupInfo

Nov 2nd, 2020
2,487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.51 KB | None | 0 0
  1. // creates LODS
  2. BOOL __fastcall CModelData::CreateDrawGroupInfo(CModelData *pThis, __int64 a2)
  3. {
  4.   WMBHdr *pWmb; // rax
  5.   __int64 v3; // r15
  6.   CModelData *pData; // rbx
  7.   signed __int64 nLODS; // r13
  8.   PVOID v6; // rax
  9.   __int64 LODOffset; // rcx
  10.   char *pLODS; // rsi
  11.   __int64 v9; // rcx
  12.   CHeapInstance *v10; // r10
  13.   __int64 LODSize; // r8
  14.   __int64 *v12; // rax
  15.   __int64 v13; // rax
  16.   signed __int64 i; // rbp
  17.   __int64 idx; // r14
  18.   __int64 pnBatchInfosOffset; // rsi
  19.   __int64 nameOffset; // rax
  20.   CDrawGroupInfo *pLOD; // rdi
  21.   const char *szLODName; // rdx
  22.   __int64 batchInfoOffset; // rax
  23.   CBatchInfo *pBatchInfo; // rax
  24.   int v22; // eax
  25.   int iLODLevel; // ecx
  26.   unsigned int k; // er9
  27.   __int64 batchInfoIdx; // r8
  28.   int lod; // ecx
  29.   CMesh *pMesh; // rdx
  30.   unsigned __int64 v28; // rcx
  31.   __int64 v29; // r10
  32.   bool v30; // of
  33.   signed __int64 v31; // rax
  34.   CHeapInstance *v32; // rcx
  35.   __int64 v33; // r8
  36.   __int64 *v34; // rax
  37.   __int64 v35; // rax
  38.   PVOID v36; // rax
  39.   int l; // er9
  40.   __int64 v38; // r11
  41.   int v39; // er10
  42.   signed int iCurLODLevel; // er8
  43.   __int64 _nLODS; // rdx
  44.   int v42; // ecx
  45.   CDrawGroupInfo *pCurLOD; // rax
  46.   HeapAlloc_t pThisa; // [rsp+30h] [rbp-58h]
  47.   __int64 v46; // [rsp+40h] [rbp-48h]
  48.   signed int v47; // [rsp+50h] [rbp-38h]
  49.   signed int v48; // [rsp+54h] [rbp-34h]
  50.   __int64 pModelAnalyzer; // [rsp+90h] [rbp+8h]
  51.  
  52.   pWmb = pThis->m_pHdr;
  53.   v3 = a2;
  54.   pData = pThis;
  55.   nLODS = pThis->m_pHdr->numLods;
  56.   if ( nLODS <= 0 )
  57.   {
  58.     LODWORD(v6) = 1;
  59.     return v6;
  60.   }
  61.   pModelAnalyzer = *(a2 + 0x48);
  62.   LODOffset = pWmb->ofsLods;
  63.   pLODS = 0i64;
  64.   if ( LODOffset )
  65.     pLODS = pWmb + LODOffset;
  66.   v9 = *a2;
  67.   v10 = **a2;
  68.   v48 = -1;
  69.   v47 = 0;
  70.   LODSize = 32 * nLODS;
  71.   v12 = *(v9 + 0x28);
  72.   if ( !is_mul_ok(nLODS, 32ui64) )
  73.     LODSize = -1i64;
  74.   if ( v12 )
  75.   {
  76.     v13 = *v12;
  77.     v47 = 1;
  78.     v46 = v13;
  79.   }
  80.   CHeapInstance::ReserveMemory(v10, &pThisa, LODSize, v10->m_qwMemoryAlignment, 0, &v46);
  81.   v6 = pThisa.Pointer;
  82.   pData->m_pLODS = pThisa.Pointer;
  83.   if ( v6 )
  84.   {
  85.     pData->gapE8[2] = 0;
  86.     i = 0i64;
  87.     if ( nLODS > 0 )
  88.     {
  89.       idx = 0i64;
  90.       pnBatchInfosOffset = (pLODS + 16);
  91.       do
  92.       {
  93.         nameOffset = *(pnBatchInfosOffset - 16);
  94.         pLOD = &pData->m_pLODS[idx];
  95.         szLODName = (nameOffset ? (pData->m_pHdr + nameOffset) : 0i64);
  96.         batchInfoOffset = *(pnBatchInfosOffset - 4);
  97.         pBatchInfo = (batchInfoOffset ? (pData->m_pHdr + batchInfoOffset) : 0i64);
  98.         pLOD->m_pBatchInfos = pBatchInfo;
  99.         pLOD->m_nBatchInfos = *pnBatchInfosOffset;
  100.         pLOD->m_uBatchStart = *(pnBatchInfosOffset - 8);
  101.         pLOD->m_iLODLevel = *(pnBatchInfosOffset - 12);
  102.         v22 = (*(*pModelAnalyzer + 8i64))(pModelAnalyzer, szLODName);// CModelAnalyzer__LOD_sub_143F4B620
  103.         pLOD->dword0 = v22;
  104.         if ( v22 < 0 || v22 >= *(v3 + 0x78) )
  105.           goto FAIL;
  106.         if ( pData->pad9 > v22 )
  107.           v22 = pData->pad9;
  108.         pData->pad9 = v22;
  109.         iLODLevel = pLOD->m_iLODLevel;
  110.         if ( iLODLevel != -1 )
  111.         {
  112.           if ( pData->gapE8[2] > iLODLevel )
  113.             iLODLevel = pData->gapE8[2];
  114.           k = 0;
  115.           pData->gapE8[2] = iLODLevel;
  116.           if ( pLOD->m_nBatchInfos )
  117.           {
  118.             batchInfoIdx = 0i64;
  119.             do
  120.             {
  121.               ++batchInfoIdx;
  122.               lod = pLOD->m_iLODLevel;
  123.               pMesh = &pData->m_pMeshes[*(&pLOD->m_pBatchInfos[batchInfoIdx] - 5)];// pLOD->m_pBatchInfos[batchInfoIdx - 1].m_iMeshIndex;
  124.               if ( pMesh->m_uHighestLod > lod )
  125.                 lod = pMesh->m_uHighestLod;
  126.               ++k;
  127.               pMesh->m_uHighestLod = lod;
  128.             }
  129.             while ( k < pLOD->m_nBatchInfos );
  130.           }
  131.         }
  132.         ++i;
  133.         ++idx;
  134.         pnBatchInfosOffset += 20i64;
  135.       }
  136.       while ( i < nLODS );
  137.     }
  138.     ++pData->pad9;
  139.     pData->m_nLODS = nLODS;
  140.     if ( pData->gapE8[2] > *(v3 + 0x10C) )
  141.       goto FAIL;
  142.     v28 = pData->pad9;
  143.     v29 = *v3;
  144.     v48 = -1;
  145.     v47 = 0;
  146.     v31 = 4 * v28;
  147.     v30 = v28 * 4ui64 >> 64 != 0;
  148.     v32 = *v29;
  149.     v33 = v31;
  150.     v34 = *(v29 + 40);
  151.     if ( v30 )
  152.       v33 = -1i64;
  153.     if ( v34 )
  154.     {
  155.       v35 = *v34;
  156.       v47 = 1;
  157.       v46 = v35;
  158.     }
  159.     CHeapInstance::ReserveMemory(v32, &pThisa, v33, v32->m_qwMemoryAlignment, 0, &v46);
  160.     v36 = pThisa.Pointer;
  161.     *&pData->padAC[4] = pThisa.Pointer;
  162.     if ( !v36 )
  163.     {
  164. FAIL:
  165.       LODWORD(v6) = 0;
  166.       return v6;
  167.     }
  168.     l = 0;
  169.     if ( pData->pad9 > 0 )
  170.     {
  171.       v38 = 0i64;
  172.       do
  173.       {
  174.         v39 = 0;
  175.         iCurLODLevel = -1;
  176.         for ( *(v38 + *&pData->padAC[4]) = 0; iCurLODLevel <= pData->gapE8[2]; ++iCurLODLevel )
  177.         {
  178.           _nLODS = pData->m_nLODS;
  179.           v42 = 0;
  180.  
  181.           if ( _nLODS > 0 )
  182.           {
  183.             pCurLOD = pData->m_pLODS;
  184.             do
  185.             {
  186.               if ( l == pCurLOD->dword0 && iCurLODLevel == pCurLOD->m_iLODLevel )
  187.                 v42 += pCurLOD->m_nBatchInfos;
  188.               ++pCurLOD;
  189.               --_nLODS;
  190.             }
  191.             while ( _nLODS );
  192.             if ( v42 > 0 )
  193.             {
  194.               if ( v39 > v42 )
  195.                 v42 = v39;
  196.               *(v38 + *&pData->padAC[4]) = 1;
  197.               v39 = v42;
  198.             }
  199.           }
  200.         }
  201.         pData->gapE8[0] += v39;
  202.         ++l;
  203.         v38 += 4i64;
  204.       }
  205.       while ( l < pData->pad9 );
  206.     }
  207.     LODWORD(v6) = 1;
  208.   }
  209.   return v6;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement