Advertisement
expired6978

MergedTexture

Dec 28th, 2016
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.56 KB | None | 0 0
  1. __int64 __fastcall MergeTintTextures(__int64 npc, __int64 tintTextureArray, __int64 sharedTarget, __int64 unk2, __int64 unk3, __int64 unk4)
  2. {
  3.   signed __int64 v6; // rax@0
  4.   int v7; // xmm0_4@0
  5.   void *v8; // rsp@1
  6.   bool v9; // zf@1
  7.   __int64 _unk2; // rsi@1
  8.   __int64 sharedTarget3; // rbx@1
  9.   __int64 tintTextureArray1; // r12@1
  10.   __int64 npc2; // r15@1
  11.   signed int v14; // ecx@3
  12.   int *v15; // rax@3
  13.   __int64 headData; // rcx@5
  14.   __int64 defaultTexture; // rcx@6
  15.   __int64 v18; // rbx@7
  16.   __int64 chargenData; // rcx@7
  17.   __int64 textureSet; // rbx@9
  18.   __int64 *v21; // rdx@10
  19.   __int64 *v22; // r9@10
  20.   unsigned __int64 v23; // r8@10
  21.   __int64 *v24; // rcx@10
  22.   __int64 *v25; // r8@10
  23.   unsigned __int64 v26; // rdx@10
  24.   __int64 *v27; // rcx@10
  25.   __int64 *v28; // r8@10
  26.   unsigned __int64 v29; // rdx@10
  27.   __int64 *v30; // rcx@10
  28.   __int64 *v31; // r8@10
  29.   unsigned __int64 v32; // rdx@10
  30.   __int64 race; // rbx@22
  31.   __int64 chargenData1; // rax@22
  32.   __int64 v35; // rdx@22
  33.   __int64 v36; // r8@22
  34.   __int64 morphGroups; // rax@23
  35.   __int64 v38; // rcx@24
  36.   __int64 *v39; // rbx@24
  37.   signed __int64 v40; // rdi@27
  38.   __int64 v41; // r9@32
  39.   int numTintTextures; // eax@32
  40.   __int64 i; // r14@32
  41.   __int64 tintEntry; // rbx@33
  42.   int tintType; // eax@35
  43.   __int64 v46; // rdi@37
  44.   __int64 *v47; // rcx@38
  45.   __int64 *v48; // r8@38
  46.   unsigned __int64 v49; // rdx@38
  47.   __int64 *v50; // rcx@38
  48.   __int64 *v51; // r8@38
  49.   unsigned __int64 v52; // rdx@38
  50.   __int64 *v53; // rcx@38
  51.   __int64 *v54; // r8@38
  52.   unsigned __int64 v55; // rdx@38
  53.   __int64 *v56; // rcx@38
  54.   __int64 *v57; // r8@38
  55.   unsigned __int64 v58; // rdx@38
  56.   signed __int64 diffuse; // rax@38
  57.   __int64 v60; // rax@40
  58.   unsigned __int64 v61; // rcx@40
  59.   signed int v62; // edx@46
  60.   __int64 v63; // rax@52
  61.   signed int v64; // xmm0_4@54
  62.   signed __int64 v65; // rax@56
  63.   signed __int64 normal; // rax@58
  64.   __int64 v67; // rax@60
  65.   unsigned __int64 v68; // rcx@60
  66.   signed __int64 specular; // rax@63
  67.   __int64 v70; // rax@65
  68.   unsigned __int64 v71; // rcx@65
  69.   __int64 tintTemplate; // rdi@69
  70.   signed __int64 tintTexture; // rax@70
  71.   __int64 v74; // rax@72
  72.   unsigned __int64 v75; // rcx@72
  73.   __int64 *v76; // rcx@74
  74.   __int64 *v77; // r8@74
  75.   unsigned __int64 v78; // rdx@74
  76.   __int64 *v79; // rcx@74
  77.   __int64 *v80; // r8@74
  78.   unsigned __int64 v81; // rdx@74
  79.   __int64 *v82; // rcx@74
  80.   __int64 *v83; // r8@74
  81.   unsigned __int64 v84; // rdx@74
  82.   __int64 *v85; // rcx@74
  83.   __int64 *v86; // r8@74
  84.   unsigned __int64 v87; // rdx@74
  85.   int tintPaletteColor; // er15@74
  86.   float v89; // xmm7_4@74
  87.   float v90; // xmm6_4@74
  88.   float v91; // xmm8_4@74
  89.   float v92; // xmm7_4@74
  90.   float v93; // xmm0_4@74
  91.   signed __int64 v94; // rax@74
  92.   signed int v95; // eax@75
  93.   int v96; // eax@77
  94.   int v97; // eax@78
  95.   int v98; // eax@79
  96.   signed int v99; // edx@81
  97.   int v100; // esi@89
  98.   __int64 v101; // r14@89
  99.   __int64 v102; // r15@89
  100.   __int64 v103; // rdi@89
  101.   char *v104; // r10@89
  102.   signed __int64 v105; // r12@89
  103.   char v106; // bl@90
  104.   unsigned int v107; // er8@90
  105.   int v108; // er11@92
  106.   unsigned __int64 v109; // rdx@92
  107.   unsigned int v110; // er13@96
  108.   __int64 v111; // rdi@96
  109.   int v112; // er15@96
  110.   signed int v113; // er10@96
  111.   int *v114; // rbx@96
  112.   char v115; // si@96
  113.   char *v116; // r14@98
  114.   __int64 v117; // rsi@100
  115.   unsigned int v118; // er8@100
  116.   int v119; // er9@101
  117.   signed __int64 v120; // rdx@102
  118.   __int64 v121; // rax@102
  119.   unsigned __int64 v122; // rcx@102
  120.   __int64 v123; // rax@108
  121.   __int64 v124; // rcx@110
  122.   int v125; // eax@119
  123.   signed __int64 hairColorPalettePath; // rax@122
  124.   signed __int64 v127; // rax@123
  125.   __int64 v128; // r8@123
  126.   int v130; // [sp+30h] [bp-B8h]@0
  127.   int v131; // [sp+40h] [bp-A8h]@0
  128.   char v132; // [sp+48h] [bp-A0h]@0
  129.   unsigned int v133; // [sp+50h] [bp-98h]@3
  130.   __int64 v134; // [sp+58h] [bp-90h]@38
  131.   int v135; // [sp+60h] [bp-88h]@38
  132.   __int64 *v136; // [sp+68h] [bp-80h]@5
  133.   __int64 *v137; // [sp+70h] [bp-78h]@5
  134.   __int64 v138; // [sp+78h] [bp-70h]@5
  135.   int v139; // [sp+80h] [bp-68h]@70
  136.   __int64 v140; // [sp+88h] [bp-60h]@1
  137.   int v141; // [sp+90h] [bp-58h]@1
  138.   __int64 v142; // [sp+98h] [bp-50h]@3
  139.   __int64 v143; // [sp+A0h] [bp-48h]@3
  140.   __int64 v144; // [sp+A8h] [bp-40h]@3
  141.   __int64 v145; // [sp+B0h] [bp-38h]@3
  142.   __int64 v146; // [sp+B8h] [bp-30h]@3
  143.   __int64 v147; // [sp+C0h] [bp-28h]@3
  144.   __int64 v148; // [sp+C8h] [bp-20h]@5
  145.   char v149; // [sp+D0h] [bp-18h]@122
  146.   __int64 v150; // [sp+D8h] [bp-10h]@96
  147.   __int64 *v151; // [sp+E0h] [bp-8h]@26
  148.   __int64 v152; // [sp+E8h] [bp+0h]@5
  149.   __int64 sharedTarget4; // [sp+F0h] [bp+8h]@5
  150.   __int64 *v154; // [sp+F8h] [bp+10h]@5
  151.   int *v155; // [sp+100h] [bp+18h]@5
  152.   __int64 *v156; // [sp+108h] [bp+20h]@5
  153.   int *v157; // [sp+110h] [bp+28h]@5
  154.   __int64 v158; // [sp+118h] [bp+30h]@22
  155.   __int64 *v159; // [sp+120h] [bp+38h]@22
  156.   __int64 *v160; // [sp+128h] [bp+40h]@22
  157.   __int64 *v161; // [sp+130h] [bp+48h]@22
  158.   __int64 *v162; // [sp+138h] [bp+50h]@22
  159.   int *v163; // [sp+140h] [bp+58h]@22
  160.   __int64 *v164; // [sp+148h] [bp+60h]@22
  161.   __int64 *v165; // [sp+150h] [bp+68h]@22
  162.   char v166; // [sp+158h] [bp+70h]@60
  163.   char v167; // [sp+164h] [bp+7Ch]@72
  164.   char v168; // [sp+170h] [bp+88h]@40
  165.   char v169; // [sp+17Ch] [bp+94h]@65
  166.   char v170; // [sp+18Ch] [bp+A4h]@89
  167.   char v171; // [sp+1B8h] [bp+D0h]@40
  168.   __int64 v172; // [sp+2C0h] [bp+1D8h]@40
  169.   char v173; // [sp+2C8h] [bp+1E0h]@65
  170.   __int64 v174; // [sp+3D0h] [bp+2E8h]@65
  171.   char v175; // [sp+3D8h] [bp+2F0h]@72
  172.   __int64 v176; // [sp+4E0h] [bp+3F8h]@72
  173.   char v177; // [sp+4E8h] [bp+400h]@60
  174.   __int64 v178; // [sp+5F0h] [bp+508h]@60
  175.   int v179; // [sp+5F8h] [bp+510h]@5
  176.   int v180; // [sp+5FCh] [bp+514h]@92
  177.   int v181[1540]; // [sp+600h] [bp+518h]@3
  178.   __int64 npc3; // [sp+1ED8h] [bp+1DF0h]@86
  179.   char vars18; // [sp+1EE0h] [bp+1DF8h]@3
  180.   char *retaddr; // [sp+1EE8h] [bp+1E00h]@98
  181.   __int64 npc1; // [sp+1EF0h] [bp+1E08h]@1
  182.   int v186; // [sp+1EF8h] [bp+1E10h]@96
  183.   __int64 sharedTarget1; // [sp+1F00h] [bp+1E18h]@1
  184.  
  185.   sharedTarget1 = sharedTarget;
  186.   npc1 = npc;
  187.   v8 = alloca(v6);
  188.   v9 = (*(_DWORD *)(sharedTarget + 0x234))++ == -1;
  189.   v140 = 0i64;
  190.   v141 = 0;
  191.   _unk2 = unk2;
  192.   sharedTarget3 = sharedTarget;
  193.   tintTextureArray1 = tintTextureArray;
  194.   npc2 = npc;
  195.   if ( v9 )
  196.     memset((void *)(sharedTarget + 0x34), 0, 0x200ui64);
  197.   v133 = 0;
  198.   vars18 = 1;
  199.   v142 = 0i64;
  200.   v143 = 0i64;
  201.   v144 = 0i64;
  202.   v145 = 0i64;
  203.   v146 = 0i64;
  204.   v147 = 0i64;
  205.   v14 = 511;
  206.   v15 = v181;
  207.   do
  208.   {
  209.     --v14;
  210.     *((_QWORD *)v15 - 1) = 0i64;
  211.     *v15 = 0;
  212.     v15 += 3;
  213.   }
  214.   while ( v14 >= 0 );
  215.   memset((void *)_unk2, 0, 0x1400ui64);
  216.   headData = *(_QWORD *)(npc2 + 0x248);
  217.   v148 = _unk2 + 0xA00;
  218.   v138 = _unk2;
  219.   v152 = _unk2 + 0xC00;
  220.   sharedTarget4 = sharedTarget3;
  221.   v136 = &v142;
  222.   v137 = &v140;
  223.   v154 = &v142;
  224.   v155 = &v179;
  225.   v156 = &v152;
  226.   v157 = (int *)&v133;
  227.   if ( headData && (defaultTexture = *(_QWORD *)(headData + 0x10)) != 0
  228.     || (v18 = *(_QWORD *)(npc2 + 0x1B8), (chargenData = *(_QWORD *)(v18 + 8i64 * TESNPC::GetSex(npc2) + 0x698)) != 0)
  229.     && (defaultTexture = *(_QWORD *)(chargenData + 0x10)) != 0 )
  230.   {
  231.     textureSet = sub_1404C14F0(defaultTexture);
  232.     if ( textureSet )
  233.     {
  234.       v21 = v137;
  235.       v22 = v136;
  236.       *((_DWORD *)v136 + 2) = *((_DWORD *)v137 + 2);
  237.       v23 = *(_DWORD *)v21 | ((unsigned __int64)*((_DWORD *)v21 + 1) << 32);
  238.       *(_DWORD *)v22 = *(_DWORD *)v21;
  239.       *((_DWORD *)v22 + 1) = HIDWORD(v23);
  240.       v24 = v137;
  241.       v25 = v136;
  242.       *((_DWORD *)v136 + 5) = *((_DWORD *)v137 + 2);
  243.       v26 = *(_DWORD *)v24 | ((unsigned __int64)*((_DWORD *)v24 + 1) << 32);
  244.       *((_DWORD *)v25 + 3) = *(_DWORD *)v24;
  245.       *((_DWORD *)v25 + 4) = HIDWORD(v26);
  246.       v27 = v137;
  247.       v28 = v136;
  248.       *((_DWORD *)v136 + 8) = *((_DWORD *)v137 + 2);
  249.       v29 = *(_DWORD *)v27 | ((unsigned __int64)*((_DWORD *)v27 + 1) << 32);
  250.       *((_DWORD *)v28 + 6) = *(_DWORD *)v27;
  251.       *((_DWORD *)v28 + 7) = HIDWORD(v29);
  252.       v30 = v137;
  253.       v31 = v136;
  254.       *((_DWORD *)v136 + 11) = *((_DWORD *)v137 + 2);
  255.       v32 = *(_DWORD *)v30 | ((unsigned __int64)*((_DWORD *)v30 + 1) << 32);
  256.       *((_DWORD *)v31 + 9) = *(_DWORD *)v30;
  257.       *((_DWORD *)v31 + 10) = HIDWORD(v32);
  258.       v136 = 0i64;
  259.       LODWORD(v137) = 0;
  260.       if ( (unsigned __int8)BSTextureSet::GetTexture(textureSet, 0i64, (__int64)&v136) && sub_141C6B360((__int64)&v136) )
  261.       {
  262.         HIDWORD(v144) = (_DWORD)v137;
  263.         HIDWORD(v143) = (_DWORD)v136;
  264.         LODWORD(v144) = ((unsigned int)v136 | ((unsigned __int64)HIDWORD(v136) << 32)) >> 32;
  265.       }
  266.       if ( (unsigned __int8)BSTextureSet::GetTexture(textureSet, 1i64, (__int64)&v136) && sub_141C6B360((__int64)&v136) )
  267.       {
  268.         LODWORD(v146) = (_DWORD)v137;
  269.         LODWORD(v145) = (_DWORD)v136;
  270.         HIDWORD(v145) = ((unsigned int)v136 | ((unsigned __int64)HIDWORD(v136) << 32)) >> 32;
  271.       }
  272.       if ( (unsigned __int8)BSTextureSet::GetTexture(textureSet, 7i64, (__int64)&v136) && sub_141C6B360((__int64)&v136) )
  273.       {
  274.         HIDWORD(v147) = (_DWORD)v137;
  275.         HIDWORD(v146) = (_DWORD)v136;
  276.         LODWORD(v147) = ((unsigned int)v136 | ((unsigned __int64)HIDWORD(v136) << 32)) >> 32;
  277.       }
  278.       *(_DWORD *)(v138 + 4i64 * v133) = 14;
  279.       *(_DWORD *)(v138 + 4i64 * v133) |= 0x80u;
  280.       if ( *(_BYTE *)(npc2 + 0x73) & 1 )
  281.         *(_DWORD *)(v138 + 4i64 * v133) |= 0x40u;
  282.       *(_DWORD *)(v148 + 4i64 * v133) = 1065353216;
  283.       sub_14068CC50((__int64)&sharedTarget4);
  284.       ++v133;
  285.     }
  286.   }
  287.   race = *(_QWORD *)(npc2 + 0x1B8);
  288.   v159 = (__int64 *)&v136;
  289.   v158 = npc2;
  290.   v160 = &npc1;
  291.   v161 = &v142;
  292.   v162 = &v138;
  293.   v163 = (int *)&v133;
  294.   v164 = &v148;
  295.   v165 = &sharedTarget4;
  296.   chargenData1 = *(_QWORD *)(race + 8i64 * TESNPC::GetSex(npc2) + 0x698);
  297.   if ( chargenData1 )
  298.   {
  299.     morphGroups = *(_QWORD *)(chargenData1 + 56);
  300.     if ( morphGroups )
  301.     {
  302.       v38 = *(_DWORD *)(morphGroups + 0x10);
  303.       v39 = 0i64;
  304.       if ( (_DWORD)v38 )
  305.         v39 = *(__int64 **)morphGroups;
  306.       v151 = v39;
  307.       if ( (_DWORD)v38 )
  308.         v40 = *(_QWORD *)morphGroups + 8 * v38;
  309.       else
  310.         v40 = 0i64;
  311.       for ( ; v39 != (__int64 *)v40; v151 = v39 )
  312.       {
  313.         if ( (unsigned int)sub_14068CF40(*v39, (__int64)&v158, v7) != 1 )
  314.           break;
  315.         ++v39;
  316.       }
  317.     }
  318.   }
  319.   v41 = v133;
  320.   numTintTextures = *(_DWORD *)(tintTextureArray1 + 0x10) - 1;
  321.   for ( i = numTintTextures; i >= 0; --i )
  322.   {
  323.     tintEntry = *(_QWORD *)(*(_QWORD *)tintTextureArray1 + 8 * i);
  324.     if ( tintEntry && (float)((float)*(_BYTE *)(tintEntry + 0x12) * 0.0099999998) > 0.0 )
  325.     {
  326.       tintType = (*(int (__fastcall **)(_QWORD, __int64, __int64, __int64))(*(_QWORD *)tintEntry + 40i64))(
  327.                    *(_QWORD *)(*(_QWORD *)tintTextureArray1 + 8 * i),
  328.                    v35,
  329.                    v36,
  330.                    v41);
  331.       if ( tintType == 1 )
  332.       {
  333.         tintTemplate = *(_QWORD *)(tintEntry + 8);
  334.         if ( tintTemplate )
  335.         {
  336.           v138 = 0i64;
  337.           v139 = 0;
  338.           tintTexture = BSFixedString::GetCString(tintTemplate + 0x20);
  339.           if ( *(_BYTE *)tintTexture )
  340.           {
  341.             sub_141C69D20((__int64)&v175, (char *)tintTexture);
  342.             v74 = sub_141B43160((__int64)&v167, v176);
  343.             v139 = *(_DWORD *)(v74 + 8);
  344.             v75 = *(_DWORD *)v74 | ((unsigned __int64)*(_DWORD *)(v74 + 4) << 32);
  345.             LODWORD(v138) = *(_DWORD *)v74;
  346.             HIDWORD(v138) = HIDWORD(v75);
  347.             nullsub_753(&v175);
  348.           }
  349.           else
  350.           {
  351.             *(__int64 *)((char *)&v138 + 4) = 0i64;
  352.             LODWORD(v138) = 0;
  353.           }
  354.           if ( sub_141C6B360((__int64)&v138) )
  355.           {
  356.             v76 = v137;
  357.             v77 = v136;
  358.             *((_DWORD *)v136 + 2) = *((_DWORD *)v137 + 2);
  359.             v78 = *(_DWORD *)v76 | ((unsigned __int64)*((_DWORD *)v76 + 1) << 32);
  360.             *(_DWORD *)v77 = *(_DWORD *)v76;
  361.             *((_DWORD *)v77 + 1) = HIDWORD(v78);
  362.             v79 = v137;
  363.             v80 = v136;
  364.             *((_DWORD *)v136 + 5) = *((_DWORD *)v137 + 2);
  365.             v81 = *(_DWORD *)v79 | ((unsigned __int64)*((_DWORD *)v79 + 1) << 32);
  366.             *((_DWORD *)v80 + 3) = *(_DWORD *)v79;
  367.             *((_DWORD *)v80 + 4) = HIDWORD(v81);
  368.             v82 = v137;
  369.             v83 = v136;
  370.             *((_DWORD *)v136 + 8) = *((_DWORD *)v137 + 2);
  371.             v84 = *(_DWORD *)v82 | ((unsigned __int64)*((_DWORD *)v82 + 1) << 32);
  372.             *((_DWORD *)v83 + 6) = *(_DWORD *)v82;
  373.             *((_DWORD *)v83 + 7) = HIDWORD(v84);
  374.             v85 = v137;
  375.             v86 = v136;
  376.             *((_DWORD *)v136 + 11) = *((_DWORD *)v137 + 2);
  377.             v87 = *(_DWORD *)v85 | ((unsigned __int64)*((_DWORD *)v85 + 1) << 32);
  378.             *((_DWORD *)v86 + 9) = *(_DWORD *)v85;
  379.             *((_DWORD *)v86 + 10) = HIDWORD(v87);
  380.             LODWORD(v143) = v139;
  381.             LODWORD(v142) = v138;
  382.             HIDWORD(v142) = ((unsigned int)v138 | ((unsigned __int64)HIDWORD(v138) << 32)) >> 32;
  383.             *(_DWORD *)(v138 + 4i64 * v133) |= 1u;
  384.             tintPaletteColor = *(_DWORD *)(tintEntry + 0x18);
  385.             v89 = (float)(unsigned __int8)(signed int)ffloor((float)((float)(unsigned __int8)((unsigned __int16)*(_DWORD *)(tintEntry + 0x18) >> 8)
  386.                                                                    * 0.0039215689) * 255.0)
  387.                 * 0.0039215689;
  388.             v90 = (float)(unsigned __int8)(signed int)ffloor((float)((float)(unsigned __int8)(*(_DWORD *)(tintEntry + 0x18) >> 16)
  389.                                                                    * 0.0039215689) * 255.0)
  390.                 * 0.0039215689;
  391.             v91 = powf(
  392.                     (float)(unsigned __int8)(signed int)ffloor((float)((float)(unsigned __int8)*(_DWORD *)(tintEntry + 0x18)
  393.                                                                      * 0.0039215689) * 255.0)
  394.                   * 0.0039215689,
  395.                     2.2);
  396.             v92 = powf(v89, 2.2);
  397.             v93 = powf(v90, 2.2);
  398.             v94 = 2i64 * v133;
  399.             *(float *)(_unk2 + 8 * v94 + 0x200) = v91;
  400.             *(float *)(_unk2 + 8 * v94 + 0x204) = v92;
  401.             *(float *)(_unk2 + 8 * v94 + 0x208) = v93;
  402.             *(_DWORD *)(_unk2 + 8 * v94 + 0x20C) = 998277249;
  403.             *(_DWORD *)(v138 + 4i64 * v133) |= 0x10u;
  404.             *(float *)(v148 + 4i64 * v133) = (float)*(_BYTE *)(tintEntry + 18) * 0.0099999998;
  405.             if ( *(_DWORD *)(tintTemplate + 0x18) == 12 )
  406.               v95 = 3;
  407.             else
  408.               v95 = sub_1402A4630(tintTemplate, tintPaletteColor, (float)*(_BYTE *)(tintEntry + 0x12) * 0.0099999998);
  409.             v96 = v95 - 1;
  410.             if ( v96 )
  411.             {
  412.               v97 = v96 - 1;
  413.               if ( v97 )
  414.               {
  415.                 v98 = v97 - 1;
  416.                 if ( v98 )
  417.                 {
  418.                   if ( v98 == 1 )
  419.                     v99 = 2048;
  420.                   else
  421.                     v99 = 128;
  422.                 }
  423.                 else
  424.                 {
  425.                   v99 = 1024;
  426.                 }
  427.               }
  428.               else
  429.               {
  430.                 v99 = 512;
  431.               }
  432.             }
  433.             else
  434.             {
  435.               v99 = 256;
  436.             }
  437.             *(_DWORD *)(v138 + 4i64 * v133) |= v99;
  438.             sub_14068CC50((__int64)&sharedTarget4);
  439.             npc2 = npc3;
  440.             v41 = v133++ + 1;
  441.             continue;
  442.           }
  443.         }
  444.       }
  445.       else if ( tintType == 2 )
  446.       {
  447.         v46 = *(_QWORD *)(tintEntry + 8);
  448.         if ( v46 )
  449.         {
  450.           v47 = v137;
  451.           v48 = v136;
  452.           *((_DWORD *)v136 + 2) = *((_DWORD *)v137 + 2);
  453.           v49 = *(_DWORD *)v47 | ((unsigned __int64)*((_DWORD *)v47 + 1) << 32);
  454.           *(_DWORD *)v48 = *(_DWORD *)v47;
  455.           *((_DWORD *)v48 + 1) = HIDWORD(v49);
  456.           v50 = v137;
  457.           v51 = v136;
  458.           *((_DWORD *)v136 + 5) = *((_DWORD *)v137 + 2);
  459.           v52 = *(_DWORD *)v50 | ((unsigned __int64)*((_DWORD *)v50 + 1) << 32);
  460.           *((_DWORD *)v51 + 3) = *(_DWORD *)v50;
  461.           *((_DWORD *)v51 + 4) = HIDWORD(v52);
  462.           v53 = v137;
  463.           v54 = v136;
  464.           *((_DWORD *)v136 + 8) = *((_DWORD *)v137 + 2);
  465.           v55 = *(_DWORD *)v53 | ((unsigned __int64)*((_DWORD *)v53 + 1) << 32);
  466.           *((_DWORD *)v54 + 6) = *(_DWORD *)v53;
  467.           *((_DWORD *)v54 + 7) = HIDWORD(v55);
  468.           v56 = v137;
  469.           v57 = v136;
  470.           *((_DWORD *)v136 + 11) = *((_DWORD *)v137 + 2);
  471.           v58 = *(_DWORD *)v56 | ((unsigned __int64)*((_DWORD *)v56 + 1) << 32);
  472.           *((_DWORD *)v57 + 9) = *(_DWORD *)v56;
  473.           *((_DWORD *)v57 + 10) = HIDWORD(v58);
  474.           *(float *)(v148 + 4i64 * v133) = (float)*(_BYTE *)(tintEntry + 18) * 0.0099999998;
  475.           v134 = 0i64;
  476.           v135 = 0;
  477.           diffuse = BSFixedString::GetCString(v46 + 0x20);
  478.           if ( *(_BYTE *)diffuse )
  479.           {
  480.             sub_141C69D20((__int64)&v171, (char *)diffuse);
  481.             v60 = sub_141B43160((__int64)&v168, v172);
  482.             v135 = *(_DWORD *)(v60 + 8);
  483.             v61 = *(_DWORD *)v60 | ((unsigned __int64)*(_DWORD *)(v60 + 4) << 32);
  484.             LODWORD(v134) = *(_DWORD *)v60;
  485.             HIDWORD(v134) = HIDWORD(v61);
  486.             nullsub_753(&v171);
  487.           }
  488.           else
  489.           {
  490.             *(__int64 *)((char *)&v134 + 4) = 0i64;
  491.             LODWORD(v134) = 0;
  492.           }
  493.           if ( sub_141C6B360((__int64)&v134) )
  494.           {
  495.             *(_DWORD *)(v138 + 4i64 * v133) |= 2u;
  496.             switch ( *(_DWORD *)(v46 + 0x38) )
  497.             {
  498.               case 1:
  499.                 v62 = 256;
  500.                 break;
  501.               case 2:
  502.                 v62 = 512;
  503.                 break;
  504.               case 3:
  505.                 v62 = 1024;
  506.                 break;
  507.               case 4:
  508.                 v62 = 2048;
  509.                 break;
  510.               default:
  511.                 v62 = 128;
  512.                 break;
  513.             }
  514.             *(_DWORD *)(v138 + 4i64 * v133) |= v62;
  515.             if ( *(_DWORD *)(v46 + 24) == 23 )
  516.             {
  517.               *(_DWORD *)(v138 + 4i64 * v133) |= 0x20u;
  518.               v63 = TESNPC::GetHairColor(npc2);
  519.               if ( v63 && *(_BYTE *)(v63 + 0x40) & 2 )
  520.                 v64 = *(_DWORD *)(v63 + 0x30);
  521.               else
  522.                 v64 = 0x7F7FFFFF;
  523.               v65 = 2i64 * v133;
  524.               *(_DWORD *)(_unk2 + 8 * v65 + 0x200) = v64;
  525.               *(_DWORD *)(_unk2 + 8 * v65 + 0x204) = 0;
  526.               *(_DWORD *)(_unk2 + 8 * v65 + 0x208) = 0;
  527.               *(_DWORD *)(_unk2 + 8 * v65 + 0x20C) = 0;
  528.             }
  529.             HIDWORD(v144) = v135;
  530.             HIDWORD(v143) = v134;
  531.             LODWORD(v144) = ((unsigned int)v134 | ((unsigned __int64)HIDWORD(v134) << 32)) >> 32;
  532.           }
  533.           normal = BSFixedString::GetCString(v46 + 0x28);
  534.           if ( *(_BYTE *)normal )
  535.           {
  536.             sub_141C69D20((__int64)&v177, (char *)normal);
  537.             v67 = sub_141B43160((__int64)&v166, v178);
  538.             v135 = *(_DWORD *)(v67 + 8);
  539.             v68 = *(_DWORD *)v67 | ((unsigned __int64)*(_DWORD *)(v67 + 4) << 32);
  540.             LODWORD(v134) = *(_DWORD *)v67;
  541.             HIDWORD(v134) = HIDWORD(v68);
  542.             nullsub_753(&v177);
  543.           }
  544.           else
  545.           {
  546.             *(__int64 *)((char *)&v134 + 4) = 0i64;
  547.             LODWORD(v134) = 0;
  548.           }
  549.           if ( sub_141C6B360((__int64)&v134) )
  550.           {
  551.             *(_DWORD *)(v138 + 4i64 * v133) |= 4u;
  552.             LODWORD(v146) = v135;
  553.             LODWORD(v145) = v134;
  554.             HIDWORD(v145) = ((unsigned int)v134 | ((unsigned __int64)HIDWORD(v134) << 32)) >> 32;
  555.           }
  556.           specular = BSFixedString::GetCString(v46 + 0x30);
  557.           if ( *(_BYTE *)specular )
  558.           {
  559.             sub_141C69D20((__int64)&v173, (char *)specular);
  560.             v70 = sub_141B43160((__int64)&v169, v174);
  561.             v135 = *(_DWORD *)(v70 + 8);
  562.             v71 = *(_DWORD *)v70 | ((unsigned __int64)*(_DWORD *)(v70 + 4) << 32);
  563.             LODWORD(v134) = *(_DWORD *)v70;
  564.             HIDWORD(v134) = HIDWORD(v71);
  565.             nullsub_753(&v173);
  566.           }
  567.           else
  568.           {
  569.             *(__int64 *)((char *)&v134 + 4) = 0i64;
  570.             LODWORD(v134) = 0;
  571.           }
  572.           if ( sub_141C6B360((__int64)&v134) )
  573.           {
  574.             *(_DWORD *)(v138 + 4i64 * v133) |= 8u;
  575.             HIDWORD(v147) = v135;
  576.             HIDWORD(v146) = v134;
  577.             LODWORD(v147) = ((unsigned int)v134 | ((unsigned __int64)HIDWORD(v134) << 32)) >> 32;
  578.           }
  579.           sub_14068CC50((__int64)&sharedTarget4);
  580.           v41 = v133++ + 1;
  581.           continue;
  582.         }
  583.       }
  584.       v41 = v133;
  585.     }
  586.   }
  587.   v100 = v141;
  588.   v101 = HIDWORD(v140);
  589.   v102 = (unsigned int)v140;
  590.   v103 = 0i64;
  591.   v104 = &v170;
  592.   v105 = 4i64;
  593.   do
  594.   {
  595.     v106 = 0;
  596.     v107 = 0;
  597.     if ( (_DWORD)v41 )
  598.     {
  599.       do
  600.       {
  601.         if ( v106 )
  602.           break;
  603.         v108 = v181[3 * (v103 + v107)];
  604.         v109 = (unsigned int)*(&v179 + 3 * (v103 + v107)) | ((unsigned __int64)(unsigned int)*(&v180 + 3 * (v103 + v107)) << 32);
  605.         if ( v109 != (v102 | (v101 << 32)) || v108 != v100 )
  606.         {
  607.           *((_DWORD *)v104 - 1) = *(&v179 + 3 * (v103 + v107));
  608.           *((_DWORD *)v104 + 1) = v108;
  609.           *(_DWORD *)v104 = HIDWORD(v109);
  610.           v106 = 1;
  611.         }
  612.         ++v107;
  613.       }
  614.       while ( v107 < (unsigned int)v41 );
  615.     }
  616.     v103 += 128i64;
  617.     v104 += 12;
  618.     --v105;
  619.   }
  620.   while ( v105 );
  621.   sub_141AEDA20((__int64)&v150, 0x18i64 * (unsigned int)v41, 8ui64);
  622.   v110 = v133;
  623.   v111 = v150;
  624.   v112 = v186;
  625.   v113 = 128;
  626.   v114 = &v180;
  627.   v115 = 1;
  628.   if ( (_BYTE)sharedTarget1 )
  629.     v110 = 128;
  630.   v116 = retaddr + 8;
  631.   do
  632.   {
  633.     if ( !v115 )
  634.       break;
  635.     v117 = 0i64;
  636.     v118 = 0;
  637.     do
  638.     {
  639.       v119 = v114[1];
  640.       if ( ((unsigned int)*(v114 - 1) | ((unsigned __int64)(unsigned int)*v114 << 32)) != ((unsigned int)v140 | ((unsigned __int64)HIDWORD(v140) << 32))
  641.         || v119 != v141 )
  642.       {
  643.         v120 = 3 * v117;
  644.         *(_DWORD *)(v111 + 8 * v120 + 8) = v119;
  645.         v121 = (unsigned int)*(v114 - 1);
  646.         v122 = v121 | ((unsigned __int64)(unsigned int)*v114 << 32);
  647.         *(_DWORD *)(v111 + 8 * v120) = v121;
  648.         v117 = (unsigned int)(v117 + 1);
  649.         *(_DWORD *)(v111 + 8 * v120 + 4) = HIDWORD(v122);
  650.         *(_DWORD *)(v111 + 8 * v120 + 12) = v118;
  651.         *(_DWORD *)(v111 + 8 * v120 + 16) = v112;
  652.         *(_BYTE *)(v111 + 8 * v120 + 20) = 0;
  653.       }
  654.       ++v118;
  655.       v114 += 3;
  656.     }
  657.     while ( v118 < v113 );
  658.     if ( (_DWORD)v117 )
  659.     {
  660.       if ( !*(_QWORD *)v116 )
  661.       {
  662.         if ( dword_143766600 != 2 )
  663.           sub_141AEE1B0((__int64)&unk_143766180, (volatile signed __int32 *)&dword_143766600);
  664.         v123 = Heap::Allocate((__int64)&unk_143766180, 0x78ui64, 0, 0);
  665.         if ( v123 )
  666.           v123 = sub_141CBA8D0(v123, v110, 1, (_DWORD)v105 == 1);
  667.         v124 = *(_QWORD *)v116;
  668.         if ( *(_QWORD *)v116 != v123 )
  669.         {
  670.           if ( v123 )
  671.             _InterlockedIncrement((volatile signed __int32 *)(v123 + 8));
  672.           *(_QWORD *)v116 = v123;
  673.           if ( v124 )
  674.           {
  675.             _InterlockedDecrement((volatile signed __int32 *)(v124 + 8));
  676.             if ( !v124 )
  677.               (*(void (**)(void))(v0 + 8))();
  678.           }
  679.         }
  680.         if ( !(dword_14589B1F8 & 1) )
  681.         {
  682.           dword_14589B1F8 |= 1u;
  683.           StringCache::Ref::ctor(aHwj3, "[FaceGen]");
  684.           atexit(sub_142AB9820);
  685.         }
  686.         sub_141B16540(*(_QWORD *)v116 + 16i64, (__int64)aHwj3);
  687.       }
  688.       v125 = (*(int (__fastcall **)(_QWORD, __int64, _QWORD))(**(_QWORD **)v116 + 0x148i64))(
  689.                *(_QWORD *)v116,
  690.                v111,
  691.                (unsigned int)v117);
  692.       v113 = 128;
  693.       v115 = v125 == (_DWORD)v117;
  694.       vars18 = v115;
  695.     }
  696.     else
  697.     {
  698.       v115 = vars18;
  699.     }
  700.     LODWORD(v105) = v105 + 1;
  701.     v116 += 8;
  702.   }
  703.   while ( (unsigned int)v105 < 4 );
  704.   hairColorPalettePath = BSFixedString::GetCString(*(_QWORD *)(npc3 + 0x1B8) + 0x6C0i64);
  705.   StringCache::Ref::ctor(&v149, hairColorPalettePath);
  706.   if ( sub_141B167E0((__int64)&v149) )
  707.   {
  708.     v127 = BSFixedString::GetCString((__int64)&v149);
  709.     LOBYTE(v131) = 1;
  710.     LOBYTE(v130) = 0;
  711.     LOBYTE(v128) = 1;
  712.     sub_141C6A050((char *)v127, (__int64)(retaddr + 0x28), v128, 0, 0, v112, v130, 1, v131, v132);
  713.   }
  714.   *((_DWORD *)retaddr + 12) = v133;
  715.   j_StringCache::Ref::Release(&v149);
  716.   sub_141AEDAA0((unsigned __int64 *)&v150);
  717.   return (unsigned __int8)v115;
  718. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement