Advertisement
expired6978

FaceGen Dynamic Texture

Aug 15th, 2016
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.91 KB | None | 0 0
  1. __int64 __fastcall UpdateFaceGenTints(__int64 a1)
  2. {
  3.   __int64 facegenManager; // r14@1
  4.   __int64 v2; // r13@1
  5.   signed __int64 v3; // r15@1
  6.   int v4; // edi@1
  7.   unsigned int v5; // ebx@1
  8.   DWORD v6; // ecx@3
  9.   int v7; // ecx@6
  10.   int v8; // ecx@7
  11.   int v9; // ecx@8
  12.   __int64 v10; // rcx@10
  13.   __int64 v11; // rax@15
  14.   void (__fastcall *v12)(_QWORD); // rax@17
  15.   __int64 v13; // rcx@20
  16.   __int64 npcTarget1; // r15@26
  17.   int v15; // ebx@31
  18.   int i; // er13@31
  19.   __int64 npcTarget; // rbx@36
  20.   __int64 tintList; // rdx@37
  21.   __int64 chargenData; // rax@41
  22.   __int64 npcTarget2; // rcx@41
  23.   __int64 *v21; // rcx@42
  24.   __int64 v22; // rax@45
  25.   void (__fastcall *v23)(_QWORD); // rax@47
  26.   __int64 v24; // rcx@51
  27.   __int64 v25; // r14@51
  28.   __int64 v26; // rbx@51
  29.   unsigned int v27; // edx@64
  30.   unsigned int v28; // eax@65
  31.   __int64 npc1; // rbx@66
  32.   __int64 v30; // rdx@67
  33.   __int64 v31; // rax@71
  34.   __int64 v32; // rcx@71
  35.   __int64 v33; // rax@71
  36.   __int64 v34; // rbx@71
  37.   signed __int64 v35; // r14@71
  38.   __int64 result; // rax@86
  39.   __int64 a5; // [sp+20h] [bp-A8h]@0
  40.   __int64 a6; // [sp+28h] [bp-A0h]@0
  41.   __int64 tintListTarget; // [sp+30h] [bp-98h]@36
  42.   unsigned int v40; // [sp+40h] [bp-88h]@36
  43.   __int64 tintListTarget2; // [sp+48h] [bp-80h]@26
  44.   __int16 v42; // [sp+50h] [bp-78h]@26
  45.   char v43; // [sp+52h] [bp-76h]@26
  46.   __int64 v44; // [sp+58h] [bp-70h]@26
  47.   __int64 v45; // [sp+60h] [bp-68h]@26
  48.   __int64 v46; // [sp+68h] [bp-60h]@26
  49.   __int64 v47; // [sp+70h] [bp-58h]@26
  50.   __int64 v48; // [sp+78h] [bp-50h]@26
  51.   __int64 v49; // [sp+80h] [bp-48h]@34
  52.   __int16 v50; // [sp+88h] [bp-40h]@34
  53.   char v51; // [sp+8Ah] [bp-3Eh]@34
  54.   __int64 v52; // [sp+90h] [bp-38h]@34
  55.   __int64 v53; // [sp+98h] [bp-30h]@42
  56.   __int64 v54; // [sp+A0h] [bp-28h]@42
  57.   __int64 v55; // [sp+A8h] [bp-20h]@42
  58.   __int64 v56; // [sp+B0h] [bp-18h]@42
  59.   __int64 v57; // [sp+B8h] [bp-10h]@42
  60.   __int16 v58; // [sp+C0h] [bp-8h]@42
  61.   char v59; // [sp+C2h] [bp-6h]@42
  62.   __int64 v60; // [sp+C8h] [bp+0h]@42
  63.   __int64 v61; // [sp+D0h] [bp+8h]@19
  64.   __int64 v62; // [sp+D8h] [bp+10h]@19
  65.   __int64 v63; // [sp+E0h] [bp+18h]@19
  66.   __int64 v64; // [sp+E8h] [bp+20h]@19
  67.   __int64 v65; // [sp+F0h] [bp+28h]@19
  68.   __int16 v66; // [sp+F8h] [bp+30h]@19
  69.   char v67; // [sp+FAh] [bp+32h]@19
  70.   __int64 v68; // [sp+100h] [bp+38h]@19
  71.   __int64 v69; // [sp+108h] [bp+40h]@49
  72.   __int64 v70; // [sp+110h] [bp+48h]@49
  73.   __int64 v71; // [sp+118h] [bp+50h]@49
  74.   __int64 v72; // [sp+120h] [bp+58h]@49
  75.   __int64 v73; // [sp+128h] [bp+60h]@49
  76.   __int16 v74; // [sp+130h] [bp+68h]@49
  77.   char v75; // [sp+132h] [bp+6Ah]@49
  78.   __int64 v76; // [sp+138h] [bp+70h]@49
  79.   __int64 vars10; // [sp+198h] [bp+D0h]@1
  80.   __int64 vars18; // [sp+1A0h] [bp+D8h]@24
  81.   __int64 vars20; // [sp+1A8h] [bp+E0h]@53
  82.   __int64 vars28; // [sp+1B0h] [bp+E8h]@73
  83.  
  84.   facegenManager = a1;
  85.   v2 = a1 + 0x3228;
  86.   v3 = *(_QWORD *)(*MK_FP(__GS__, 88i64) + 8i64 * (unsigned int)TlsIndex) + 2496i64;
  87.   v4 = *(_DWORD *)v3;
  88.   *(_DWORD *)v3 = 78;
  89.   vars10 = v3;
  90.   sub_1400244C0(a1 + 0x3228);
  91.   v5 = 0;
  92.   while ( _InterlockedCompareExchange((volatile signed __int32 *)&dword_1458A6EF4, 1, 0) != 1 )
  93.   {
  94.     if ( v5 >= 0x2710 )
  95.     {
  96.       v6 = 1;
  97.     }
  98.     else
  99.     {
  100.       ++v5;
  101.       v6 = 0;
  102.     }
  103.     Sleep(v6);
  104.   }
  105.   _mm_mfence();
  106.   v7 = *(_DWORD *)(facegenManager + 0x34A0);
  107.   if ( !v7 )
  108.   {
  109.     vars18 = facegenManager;
  110.     if ( *(_QWORD *)(facegenManager + 0x31F0) && *(_QWORD *)(facegenManager + 0x31F8) )
  111.     {
  112.       npcTarget1 = facegenManager + 0x31B8;
  113.       sub_140677C60(facegenManager + 0x31B8, facegenManager + 0x31F0);
  114.       v45 = 0i64;
  115.       v46 = 0i64;
  116.       v47 = 0i64;
  117.       v48 = 0i64;
  118.       tintListTarget2 = 0i64;
  119.       v42 = 0;
  120.       v43 = 0;
  121.       v44 = 0i64;
  122.       sub_140677C60(facegenManager + 0x31F0, (__int64)&v45);
  123.       sub_140677BC0((__int64)&v45);
  124.     }
  125.     else
  126.     {
  127.       npcTarget1 = facegenManager + 0x31B8;
  128.       if ( !(unsigned __int8)sub_140679020((__int64)&vars18, facegenManager + 0x31B8) )
  129.         goto LABEL_64;
  130.     }
  131.     if ( *(_QWORD *)npcTarget1 && *(_QWORD *)(facegenManager + 0x31C0) )
  132.     {
  133.       if ( *(_BYTE *)(facegenManager + 0x31E2) )
  134.       {
  135.         v15 = *(_DWORD *)(facegenManager + 0x31B0);
  136.         for ( i = v15 + (unsigned __int64)sub_14067BB30(facegenManager + 0x80); i; --i )
  137.         {
  138.           if ( !(unsigned __int8)sub_140679020((__int64)&vars18, facegenManager + 0x31F0) )
  139.             break;
  140.           if ( *(_QWORD *)(facegenManager + 0x31F0) != *(_QWORD *)npcTarget1 )
  141.             break;
  142.           sub_140677C60(npcTarget1, facegenManager + 0x31F0);
  143.           v45 = 0i64;
  144.           v46 = 0i64;
  145.           v47 = 0i64;
  146.           v48 = 0i64;
  147.           v49 = 0i64;
  148.           v50 = 0;
  149.           v51 = 0;
  150.           v52 = 0i64;
  151.           sub_140677C60(facegenManager + 0x31F0, (__int64)&v45);
  152.           sub_140677BC0((__int64)&v45);
  153.           *(_BYTE *)(facegenManager + 0x31E2) = 1;
  154.         }
  155.         v2 = facegenManager + 0x3228;
  156.       }
  157.       sub_141AEF440((__int64)&tintListTarget);
  158.       unknown_libname_6459((__int64)&v40);
  159.       npcTarget = *(_QWORD *)npcTarget1;
  160.       v40 = 0;
  161.       if ( npcTarget == GetBaseForm(g_player) )
  162.         tintList = *(_QWORD *)(g_player + 0xD00);
  163.       else
  164.         tintList = *(_QWORD *)(npcTarget + 0x300);
  165.       if ( tintList )
  166.         CopyCharacterTints(&tintListTarget, tintList);
  167.       chargenData = TESNPC::GetChargenData(npcTarget);
  168.       sub_1402A2920((__int64)&tintListTarget, chargenData);
  169.       npcTarget2 = *(_QWORD *)npcTarget1;
  170.       if ( *(_BYTE *)(facegenManager + 0x31E2) )
  171.       {
  172.         sub_140687190(npcTarget2, (__int64)&tintListTarget, 0i64);
  173.         sub_1406782E0(facegenManager, npcTarget1);
  174.         v53 = 0i64;
  175.         v54 = 0i64;
  176.         v55 = 0i64;
  177.         v56 = 0i64;
  178.         v57 = 0i64;
  179.         v58 = 0;
  180.         v59 = 0;
  181.         v60 = 0i64;
  182.         sub_140677C60(npcTarget1, (__int64)&v53);
  183.         v21 = &v53;
  184.       }
  185.       else
  186.       {
  187.         LOBYTE(a6) = 0;
  188.         LODWORD(a5) = 0;
  189.         if ( (unsigned __int8)sub_1406873A0(
  190.                                 npcTarget2,
  191.                                 (__int64)&tintListTarget,
  192.                                 *(_QWORD *)(facegenManager + 0x31E8),
  193.                                 *(_QWORD *)(facegenManager + 0x3230),
  194.                                 a5,
  195.                                 a6) )
  196.         {
  197.           *(_DWORD *)(facegenManager + 0x34A0) = 1;
  198.           *(_BYTE *)(facegenManager + 0x34F9) = *(_QWORD *)npcTarget1 == GetBaseForm(g_player);
  199. LABEL_51:
  200.           v24 = tintListTarget;
  201.           v25 = 0i64;
  202.           v26 = tintListTarget;
  203.           if ( !v40 )
  204.             v26 = 0i64;
  205.           vars20 = v26;
  206.           if ( v40 )
  207.             v25 = tintListTarget + 8i64 * v40;
  208.           if ( v26 != v25 )
  209.           {
  210.             do
  211.             {
  212.               if ( *(_QWORD *)v26 )
  213.                 (***(void (__fastcall ****)(_QWORD, _QWORD))v26)(*(_QWORD *)v26, 1i64);
  214.               v26 += 8i64;
  215.             }
  216.             while ( v26 != v25 );
  217.             v24 = tintListTarget;
  218.             vars20 = v26;
  219.           }
  220.           if ( v24 )
  221.           {
  222.             sub_141AEF660(&tintListTarget);
  223.             v40 = 0;
  224.             if ( tintListTarget )
  225.             {
  226.               sub_141AEF660(&tintListTarget);
  227.               v40 = 0;
  228.             }
  229.           }
  230.           nullsub_681(&v40);
  231.           nullsub_682(&tintListTarget);
  232. LABEL_85:
  233.           v3 = vars10;
  234.           goto LABEL_86;
  235.         }
  236.         v22 = *(_QWORD *)(npcTarget1 + 0x10);
  237.         if ( v22 )
  238.           *(_BYTE *)(v22 + 0x83) = 0;
  239.         v23 = *(void (__fastcall **)(_QWORD))(npcTarget1 + 0x18);
  240.         if ( v23 )
  241.           v23(*(_QWORD *)(npcTarget1 + 0x20));
  242.         v69 = 0i64;
  243.         v70 = 0i64;
  244.         v71 = 0i64;
  245.         v72 = 0i64;
  246.         v73 = 0i64;
  247.         v74 = 0;
  248.         v75 = 0;
  249.         v76 = 0i64;
  250.         sub_140677C60(npcTarget1, (__int64)&v69);
  251.         v21 = &v69;
  252.       }
  253.       sub_140677BC0((__int64)v21);
  254.       goto LABEL_51;
  255.     }
  256. LABEL_64:
  257.     v27 = *(_DWORD *)(facegenManager + 0x3498);
  258.     if ( v27 == -1 )
  259.     {
  260.       sub_1406851F0(facegenManager + 0x3238);
  261.     }
  262.     else
  263.     {
  264.       v28 = sub_140678390(facegenManager, v27);
  265.       *(_DWORD *)(facegenManager + 0x3498) = v28;
  266.       if ( v28 != -1 )
  267.       {
  268.         npc1 = *(_QWORD *)(*(_QWORD *)(facegenManager + 0x3480) + 8i64 * v28);
  269.         sub_141AEF440((__int64)&tintListTarget2);
  270.         unknown_libname_6459((__int64)&v44);
  271.         LODWORD(v44) = 0;
  272.         if ( npc1 == GetBaseForm(g_player) )
  273.           v30 = *(_QWORD *)(g_player + 0xD00);
  274.         else
  275.           v30 = *(_QWORD *)(npc1 + 0x300);
  276.         if ( v30 )
  277.           CopyCharacterTints(&tintListTarget2, v30);
  278.         v31 = TESNPC::GetChargenData(npc1);
  279.         sub_1402A2920((__int64)&tintListTarget2, v31);
  280.         LOBYTE(a6) = 1;
  281.         LODWORD(a5) = 0;
  282.         sub_1406873A0(
  283.           npc1,
  284.           (__int64)&tintListTarget2,
  285.           *(_QWORD *)(facegenManager + 0x3478),
  286.           *(_QWORD *)(facegenManager + 0x3230),
  287.           a5,
  288.           a6);
  289.         v32 = tintListTarget2;
  290.         v33 = (unsigned int)v44;
  291.         v34 = tintListTarget2;
  292.         *(_DWORD *)(facegenManager + 0x34A0) = 3;
  293.         v35 = 0i64;
  294.         if ( !(_DWORD)v33 )
  295.           v34 = 0i64;
  296.         vars28 = v34;
  297.         if ( (_DWORD)v33 )
  298.           v35 = v32 + 8 * v33;
  299.         if ( v34 != v35 )
  300.         {
  301.           do
  302.           {
  303.             if ( *(_QWORD *)v34 )
  304.               (***(void (__fastcall ****)(_QWORD, _QWORD))v34)(*(_QWORD *)v34, 1i64);
  305.             v34 += 8i64;
  306.           }
  307.           while ( v34 != v35 );
  308.           v32 = tintListTarget2;
  309.           vars28 = v34;
  310.         }
  311.         if ( v32 )
  312.         {
  313.           sub_141AEF660(&tintListTarget2);
  314.           LODWORD(v44) = 0;
  315.           if ( tintListTarget2 )
  316.           {
  317.             sub_141AEF660(&tintListTarget2);
  318.             LODWORD(v44) = 0;
  319.           }
  320.         }
  321.         nullsub_681(&v44);
  322.         nullsub_682(&tintListTarget2);
  323.       }
  324.     }
  325.     goto LABEL_85;
  326.   }
  327.   v8 = v7 - 1;
  328.   if ( v8 )
  329.   {
  330.     v9 = v8 - 1;
  331.     if ( v9 )
  332.     {
  333.       if ( v9 == 1 )
  334.       {
  335.         v10 = *(_QWORD *)(facegenManager + 0x3478);
  336.         if ( !v10 || (unsigned __int8)sub_140688250(v10) )
  337.           *(_DWORD *)(facegenManager + 0x34A0) = 0;
  338.       }
  339.     }
  340.     else
  341.     {
  342.       if ( sub_140677FD0(facegenManager) )
  343.       {
  344.         v11 = *(_QWORD *)(facegenManager + 0x31C8);
  345.         if ( v11 )
  346.           *(_BYTE *)(v11 + 131) = 0;
  347.         v12 = *(void (__fastcall **)(_QWORD))(facegenManager + 0x31D0);
  348.         if ( v12 )
  349.           v12(*(_QWORD *)(facegenManager + 0x31D8));
  350.       }
  351.       else
  352.       {
  353.         sub_1406782E0(facegenManager, facegenManager + 0x31B8);
  354.         sub_1406851F0(facegenManager + 0x3238);
  355.       }
  356.       v61 = 0i64;
  357.       v62 = 0i64;
  358.       v63 = 0i64;
  359.       v64 = 0i64;
  360.       v65 = 0i64;
  361.       v66 = 0;
  362.       v67 = 0;
  363.       v68 = 0i64;
  364.       sub_140677C60(facegenManager + 0x31B8, (__int64)&v61);
  365.       sub_140677BC0((__int64)&v61);
  366.       *(_DWORD *)(facegenManager + 0x34A0) = 0;
  367.       *(_BYTE *)(facegenManager + 0x34F9) = 0;
  368.     }
  369.   }
  370.   else
  371.   {
  372.     v13 = *(_QWORD *)(facegenManager + 0x31E8);
  373.     if ( v13 )
  374.     {
  375.       if ( (unsigned __int8)sub_140688250(v13) )
  376.       {
  377.         sub_1406882D0(*(_QWORD *)(facegenManager + 0x31E8), *(_QWORD *)(facegenManager + 0x3230));
  378.         *(_DWORD *)(facegenManager + 0x34A0) = 2;
  379.       }
  380.     }
  381.     else
  382.     {
  383.       *(_DWORD *)(facegenManager + 0x34A0) = 0;
  384.     }
  385.   }
  386. LABEL_86:
  387.   result = *(_DWORD *)(v2 + 4);
  388.   if ( (_DWORD)result == 1 )
  389.   {
  390.     *(_DWORD *)v2 = 0;
  391.     _mm_mfence();
  392.     result = (unsigned int)_InterlockedCompareExchange((volatile signed __int32 *)(v2 + 4), 0, 1);
  393.   }
  394.   else
  395.   {
  396.     _InterlockedDecrement((volatile signed __int32 *)(v2 + 4));
  397.   }
  398.   _mm_mfence();
  399.   _InterlockedExchange((volatile signed __int32 *)&dword_1458A6EF4, 0);
  400.   *(_DWORD *)v3 = v4;
  401.   return result;
  402. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement