L L4D2node

CDispInfo::TesselateDisplacement

0x00134f60 · 6602 bytes · __thiscall

_ZN9CDispInfo21TesselateDisplacementEv

Decompiled

undefined (1 param)

/* CDispInfo::TesselateDisplacement() */

void __thiscall CDispInfo::TesselateDisplacement(CDispInfo *this)

{
  short *psVar1;
  short *psVar2;
  short *psVar3;
  short *psVar4;
  short *psVar5;
  short *psVar6;
  CVertIndex *pCVar7;
  short sVar8;
  short sVar9;
  short sVar10;
  short sVar11;
  short sVar12;
  int *piVar13;
  undefined2 *puVar14;
  undefined4 uVar15;
  short sVar16;
  int iVar17;
  undefined4 *puVar18;
  int iVar19;
  int iVar20;
  uint uVar21;
  undefined2 *puVar22;
  int iVar23;
  int iVar24;
  undefined2 *puVar25;
  int iVar26;
  int iVar27;
  undefined2 *puVar28;
  int iVar29;
  int iVar30;
  undefined2 *puVar31;
  int iVar32;
  int iVar33;
  undefined2 *puVar34;
  int iVar35;
  int iVar36;
  short sVar37;
  short sVar38;
  short sVar39;
  short sVar40;
  short sVar41;
  int iVar42;
  undefined4 *puVar43;
  int iVar44;
  byte bVar45;
  undefined2 local_328;
  undefined2 local_318;
  int local_314;
  undefined2 local_308;
  int local_304;
  CDispInfo *local_300;
  int local_2fc;
  undefined2 local_2f0;
  int local_2e8;
  int local_2e4;
  undefined2 local_2d8;
  int local_2cc;
  int local_2c8;
  int local_2b8;
  int local_2b4;
  int local_2b0;
  int local_2ac;
  undefined2 *local_298;
  int local_290;
  uint local_280 [24];
  CDispInfo *local_220;
  int local_21c;
  int local_218;
  short local_214 [6];
  undefined4 local_208 [39];
  undefined4 local_16c;
  int local_164;
  int local_158;
  int *local_154;
  undefined1 local_14c;
  int local_148;
  int local_13c;
  int *local_138;
  int local_134;
  int local_130;
  undefined4 local_12c;
  int local_128;
  undefined4 local_124;
  undefined4 local_120;
  undefined4 local_11c;
  undefined1 local_118;
  undefined4 local_114 [19];
  undefined4 local_c8;
  uint local_c4;
  undefined4 local_c0;
  undefined4 local_b4;
  undefined4 local_b0;
  undefined4 local_a8 [8];
  undefined4 local_88 [6];
  int *local_70;
  undefined1 local_6c;
  undefined4 local_68;
  undefined4 local_64;
  undefined4 local_60;
  undefined4 local_5c;
  undefined4 local_58;
  undefined4 local_54;
  undefined4 local_50 [8];
  undefined4 local_30;
  undefined4 local_2c;
  undefined4 local_28;
  CDispInfo *local_20;
  
  bVar45 = 0;
  ClearAllDecalFragments(this);
  ClearAllShadowDecalFragments(this);
  local_14c = 0;
  local_138 = (int *)0x0;
  local_134 = 0;
  iVar17 = *(int *)(*(int *)(this + 0x1dc) + 0x24) + -1;
  local_130 = 0;
  local_128 = 0;
  local_124 = 0;
  local_120 = 0xffffffff;
  local_11c = 0;
  local_70 = (int *)0x0;
  iVar17 = iVar17 * iVar17 * 6;
  local_2c = 0xffffffff;
  local_28 = 0;
  local_20 = this;
  local_64 = 0;
  local_60 = 0;
  local_68 = 0;
  local_30 = 0;
  local_c8 = 0xffffffff;
  piVar13 = (int *)**(int **)(this + 0x28);
                    /* try { // try from 0013507a to 00135327 has its CatchHandler @ 00136996 */
  local_154 = piVar13;
  (**(code **)(*piVar13 + 0x5c))(piVar13,0,0,0,*(undefined4 *)(this + 0x24),iVar17,local_208);
  local_130 = iVar17;
  local_138 = piVar13 + 1;
  local_134 = iVar17;
  puVar18 = local_208;
  puVar43 = local_114;
  for (iVar17 = 0x29; iVar17 != 0; iVar17 = iVar17 + -1) {
    *puVar43 = *puVar18;
    puVar18 = puVar18 + (uint)bVar45 * -2 + 1;
    puVar43 = puVar43 + (uint)bVar45 * -2 + 1;
  }
  local_70 = piVar13;
  local_12c = local_16c;
  local_118 = 1;
  local_128 = 0;
  local_64 = 0;
  local_148 = local_164;
  local_68 = 0;
  local_6c = 1;
  local_60 = 0;
  local_13c = local_158;
  local_c4 = ~-(uint)(local_c4 == 0) & 2;
  local_5c = local_c0;
  local_58 = local_b4;
  puVar18 = local_a8;
  do {
    puVar43 = puVar18 + 1;
    puVar18[0x16] = *puVar18;
    puVar18 = puVar43;
  } while (puVar43 != local_88);
  local_54 = local_b0;
  local_220 = this + 0x118;
  iVar17 = (**(code **)(*(int *)this + 0x48))(this);
  local_21c = iVar17;
  local_218 = 0;
  puVar14 = *(undefined2 **)(local_20 + 0x24c);
  if (1 < *(int *)(iVar17 + 0x1c)) {
    local_2b8 = 1;
    local_290 = 0;
    local_2ac = *(int *)(iVar17 + 0x24);
    sVar16 = *(short *)(iVar17 + 0x20);
    iVar44 = *(short *)(iVar17 + 0x22) * local_2ac;
    local_298 = puVar14;
LAB_0013538c:
    local_300 = local_220;
    local_2b0 = *(int *)(local_21c + 8);
    psVar1 = (short *)(local_2b0 + (iVar44 + sVar16) * 0x10 + local_290 * 4);
    sVar37 = psVar1[1];
    sVar8 = *psVar1;
    iVar20 = local_2ac * sVar37 + (int)sVar8;
    uVar21 = *(uint *)(local_220 + (iVar20 >> 5) * 4) & 1 << ((byte)iVar20 & 0x1f);
    local_280[local_290] = uVar21;
    iVar20 = local_218;
    if (uVar21 != 0) {
      puVar22 = local_298 + local_2b8 * 0xe;
      local_2d8 = (undefined2)local_218;
      if (2 < *(int *)(local_21c + 0x1c)) {
        local_2b4 = 0;
        iVar19 = *(int *)(local_21c + 0x24);
        local_2cc = local_2b8 + 1;
LAB_0013564d:
        iVar23 = local_21c;
        psVar2 = (short *)(local_2b0 + ((int)sVar8 + sVar37 * iVar19) * 0x10 + local_2b4 * 4);
        sVar38 = psVar2[1];
        sVar9 = *psVar2;
        iVar24 = local_2ac * sVar38 + (int)sVar9;
        uVar21 = *(uint *)(local_300 + (iVar24 >> 5) * 4) & 1 << ((byte)iVar24 & 0x1f);
        local_280[local_2b4 + 4] = uVar21;
        iVar24 = local_218;
        if (uVar21 != 0) {
          puVar25 = local_298 + local_2cc * 0xe;
          local_2f0 = (undefined2)local_218;
          if (3 < *(int *)(iVar23 + 0x1c)) {
            iVar26 = *(int *)(iVar23 + 0x24);
            local_2e8 = local_2cc + 1;
            local_2c8 = 0;
LAB_00135ba2:
            psVar3 = (short *)(local_2b0 + ((int)sVar9 + sVar38 * iVar26) * 0x10 + local_2c8 * 4);
            sVar39 = psVar3[1];
            sVar10 = *psVar3;
            iVar27 = local_2ac * sVar39 + (int)sVar10;
            uVar21 = *(uint *)(local_300 + (iVar27 >> 5) * 4) & 1 << ((byte)iVar27 & 0x1f);
            local_280[local_2c8 + 8] = uVar21;
            iVar27 = local_218;
            if (uVar21 != 0) {
              puVar28 = local_298 + local_2e8 * 0xe;
              local_308 = (undefined2)local_218;
              if (4 < *(int *)(iVar23 + 0x1c)) {
                iVar29 = *(int *)(iVar23 + 0x24);
                local_304 = local_2e8 + 1;
                local_2e4 = 0;
LAB_00135fa5:
                psVar4 = (short *)(local_2b0 + ((int)sVar10 + sVar39 * iVar29) * 0x10 +
                                  local_2e4 * 4);
                sVar40 = psVar4[1];
                sVar11 = *psVar4;
                iVar30 = local_2ac * sVar40 + (int)sVar11;
                uVar21 = 1 << ((byte)iVar30 & 0x1f) & *(uint *)(local_300 + (iVar30 >> 5) * 4);
                local_280[local_2e4 + 0xc] = uVar21;
                iVar30 = local_218;
                if (uVar21 != 0) {
                  local_318 = (undefined2)local_218;
                  puVar31 = local_298 + local_304 * 0xe;
                  if (5 < *(int *)(iVar23 + 0x1c)) {
                    local_2fc = 0;
                    iVar32 = *(int *)(iVar23 + 0x24);
                    local_314 = local_304 + 1;
                    do {
                      psVar5 = (short *)(((int)sVar11 + sVar40 * iVar32) * 0x10 + local_2b0 +
                                        local_2fc * 4);
                      sVar41 = psVar5[1];
                      sVar12 = *psVar5;
                      iVar33 = local_2ac * sVar41 + (int)sVar12;
                      uVar21 = *(uint *)(local_300 + (iVar33 >> 5) * 4) & 1 << ((byte)iVar33 & 0x1f)
                      ;
                      local_280[local_2fc + 0x10] = uVar21;
                      iVar33 = local_218;
                      if (uVar21 == 0) {
                        *(undefined1 *)(local_298 + local_314 * 0xe + 1) = 0;
                        *(undefined1 *)((int)local_298 + local_314 * 0x1c + 3) = 0;
                      }
                      else {
                        puVar34 = local_298 + local_314 * 0xe;
                        local_328 = (undefined2)local_218;
                        if (*(int *)(iVar23 + 0x1c) < 7) {
                          local_280[0x17] = 0;
                          local_280[0x16] = 0;
                          local_280[0x15] = 0;
                          local_280[0x14] = 0;
LAB_001364be:
                          *(undefined1 *)((int)puVar34 + 3) = 0;
                        }
                        else {
                          iVar23 = *(int *)(iVar23 + 0x24);
                          iVar35 = local_314 + 1;
                          iVar42 = 0;
                          while( true ) {
                            pCVar7 = (CVertIndex *)
                                     (local_2b0 + ((int)sVar12 + sVar41 * iVar23) * 0x10 +
                                     iVar42 * 4);
                            iVar36 = (int)*(short *)pCVar7 + *(short *)(pCVar7 + 2) * local_2ac;
                            uVar21 = 1 << ((byte)iVar36 & 0x1f) &
                                     *(uint *)(local_300 + (iVar36 >> 5) * 4);
                            local_280[iVar42 + 0x14] = uVar21;
                            if (uVar21 == 0) {
                              iVar36 = iVar35 * 0x1c + *(int *)(local_20 + 0x24c);
                              *(undefined1 *)(iVar36 + 2) = 0;
                              *(undefined1 *)(iVar36 + 3) = 0;
                            }
                            else {
                              TesselateDisplacement_R<CEngineTesselateHelper>
                                        ((CEngineTesselateHelper *)&local_220,pCVar7,iVar35,6);
                            }
                            iVar42 = iVar42 + 1;
                            if (iVar42 == 4) break;
                            iVar35 = iVar35 + *(int *)(local_21c + 0x4c);
                            local_2ac = *(int *)(local_21c + 0x24);
                            local_2b0 = *(int *)(local_21c + 8);
                            local_300 = local_220;
                          }
                          if (iVar33 == local_218) goto LAB_001364be;
                          *(undefined1 *)((int)puVar34 + 3) = 1;
                          local_328 = (undefined2)local_218;
                        }
                        local_298 = (undefined2 *)0x0;
                        uVar15 = *(undefined4 *)(local_21c + 0x1c);
                        iVar23 = 0;
                        if (0 < DAT_0033c118) {
                          do {
                            psVar6 = (short *)(g_TWinding + iVar23 * 6);
                            if ((psVar6[2] == -1) || (local_280[psVar6[2] + 0x14] == 0)) {
                              local_2ac._0_2_ = (short)(1 << ((char)uVar15 - 6U & 0x1f));
                              iVar33 = *(int *)(local_21c + 0x24);
                              iVar35 = (int)(short)(*psVar6 * (short)local_2ac + *psVar5) +
                                       (short)(psVar6[1] * (short)local_2ac + psVar5[1]) * iVar33;
                              if ((*(uint *)(local_220 + (iVar35 >> 5) * 4) &
                                  1 << ((byte)iVar35 & 0x1f)) != 0) {
                                local_214[(int)local_298] = (short)iVar35;
                                if (local_298 == (undefined2 *)0x1) {
                                  local_214[2] = *psVar5 + (short)iVar33 * psVar5[1];
                                  sVar41 = (short)*(undefined4 *)(local_20 + 0x2c);
                                  *(short *)(local_148 + local_128 * 2) =
                                       sVar41 + (short)local_12c + local_214[0];
                                  local_128 = local_128 + local_13c;
                                  if (local_130 < local_128) {
                                    local_130 = local_128;
                                  }
                                  *(short *)(local_148 + local_128 * 2) =
                                       sVar41 + (short)local_12c + local_214[1];
                                  local_128 = local_128 + local_13c;
                                  if (local_130 < local_128) {
                                    local_130 = local_128;
                                  }
                                  *(short *)(local_148 + local_128 * 2) =
                                       sVar41 + (short)local_12c + local_214[2];
                                  local_128 = local_128 + local_13c;
                                  if (local_130 < local_128) {
                                    local_130 = local_128;
                                  }
                                  *(short *)(*(int *)(local_20 + 0xf4) + local_218 * 2) =
                                       sVar41 + local_214[0];
                                  *(short *)(*(int *)(local_20 + 0xf4) + 2 + local_218 * 2) =
                                       sVar41 + local_214[1];
                                  *(short *)(*(int *)(local_20 + 0xf4) + 4 + local_218 * 2) =
                                       sVar41 + local_214[2];
                                  local_218 = local_218 + 3;
                                  local_214[0] = local_214[1];
                                }
                                else {
                                  local_298 = (undefined2 *)0x1;
                                }
                              }
                            }
                            else {
                              local_298 = (undefined2 *)0x0;
                            }
                            iVar23 = iVar23 + 1;
                          } while (iVar23 < DAT_0033c118);
                        }
                        *(char *)(puVar34 + 1) = (char)local_218 - (char)local_328;
                        *puVar34 = local_328;
                      }
                      local_2fc = local_2fc + 1;
                      local_314 = local_314 + *(int *)(local_21c + 0x48);
                      if (local_2fc == 4) goto LAB_001365bb;
                      local_2ac = *(int *)(local_21c + 0x24);
                      local_2b0 = *(int *)(local_21c + 8);
                      local_298 = *(undefined2 **)(local_20 + 0x24c);
                      iVar23 = local_21c;
                      local_300 = local_220;
                    } while( true );
                  }
                  local_280[0x13] = 0;
                  local_280[0x12] = 0;
                  local_280[0x11] = 0;
                  local_280[0x10] = 0;
                  goto LAB_001360c8;
                }
                *(undefined1 *)(local_298 + local_304 * 0xe + 1) = 0;
                *(undefined1 *)((int)local_298 + local_304 * 0x1c + 3) = 0;
                goto LAB_00136016;
              }
              local_280[0xf] = 0;
              local_280[0xe] = 0;
              local_280[0xd] = 0;
              local_280[0xc] = 0;
              goto LAB_00135cc0;
            }
            *(undefined1 *)(local_298 + local_2e8 * 0xe + 1) = 0;
            *(undefined1 *)((int)local_298 + local_2e8 * 0x1c + 3) = 0;
            goto LAB_00135c13;
          }
          local_280[0xb] = 0;
          local_280[10] = 0;
          local_280[9] = 0;
          local_280[8] = 0;
          goto LAB_001358b8;
        }
        *(undefined1 *)(local_298 + local_2cc * 0xe + 1) = 0;
        *(undefined1 *)((int)local_298 + local_2cc * 0x1c + 3) = 0;
        goto LAB_001356c2;
      }
      local_280[7] = 0;
      local_280[6] = 0;
      local_280[5] = 0;
      local_280[4] = 0;
      goto LAB_001354ae;
    }
    *(undefined1 *)(local_298 + local_2b8 * 0xe + 1) = 0;
    *(undefined1 *)((int)local_298 + local_2b8 * 0x1c + 3) = 0;
    goto LAB_00135407;
  }
  local_280[3] = 0;
  local_280[2] = 0;
  local_280[1] = 0;
  local_280[0] = 0;
LAB_001351ba:
  local_2b0._0_1_ = '\0';
  local_2b4._0_2_ = 0;
  *(undefined1 *)((int)puVar14 + 3) = 0;
LAB_001351d4:
  iVar44 = 0;
  local_2ac = 0;
  uVar15 = *(undefined4 *)(local_21c + 0x1c);
  if (0 < DAT_0033c118) {
    do {
      while( true ) {
        psVar1 = (short *)(g_TWinding + iVar44 * 6);
        sVar16 = *(short *)(iVar17 + 0x22);
        sVar37 = *(short *)(iVar17 + 0x20);
        if ((psVar1[2] == -1) || (local_280[psVar1[2]] == 0)) break;
        local_2ac = 0;
LAB_0013521a:
        iVar44 = iVar44 + 1;
        if (DAT_0033c118 <= iVar44) goto LAB_001352f0;
      }
      iVar20 = *(int *)(local_21c + 0x24);
      local_298._0_2_ = (short)(1 << ((char)uVar15 - 1U & 0x1f));
      iVar19 = (int)(short)(*psVar1 * (short)local_298 + sVar37) +
               (short)(psVar1[1] * (short)local_298 + sVar16) * iVar20;
      if ((*(uint *)(local_220 + (iVar19 >> 5) * 4) & 1 << ((byte)iVar19 & 0x1f)) == 0)
      goto LAB_0013521a;
      local_214[local_2ac] = (short)iVar19;
      if (local_2ac == 1) {
        local_214[2] = (short)iVar20 * sVar16 + sVar37;
        sVar16 = (short)*(undefined4 *)(local_20 + 0x2c);
        *(short *)(local_148 + local_128 * 2) = sVar16 + (short)local_12c + local_214[0];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar16 + (short)local_12c + local_214[1];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar16 + (short)local_12c + local_214[2];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(*(int *)(local_20 + 0xf4) + local_218 * 2) = sVar16 + local_214[0];
        *(short *)(*(int *)(local_20 + 0xf4) + 2 + local_218 * 2) = sVar16 + local_214[1];
        *(short *)(*(int *)(local_20 + 0xf4) + 4 + local_218 * 2) = sVar16 + local_214[2];
        local_218 = local_218 + 3;
        local_214[0] = local_214[1];
        goto LAB_0013521a;
      }
      iVar44 = iVar44 + 1;
      local_2ac = 1;
    } while (iVar44 < DAT_0033c118);
  }
LAB_001352f0:
  *(char *)(puVar14 + 1) = (char)local_218 - (char)local_2b0;
  *puVar14 = (undefined2)local_2b4;
  (**(code **)(*local_154 + 0x54))(local_154,local_208);
  *(int *)(this + 0x20) = local_218;
  return;
LAB_001365bb:
  if (iVar30 == local_218) {
LAB_001360c8:
    *(undefined1 *)((int)puVar31 + 3) = 0;
  }
  else {
    *(undefined1 *)((int)puVar31 + 3) = 1;
    local_318 = (undefined2)local_218;
  }
  local_298 = (undefined2 *)0x0;
  uVar15 = *(undefined4 *)(local_21c + 0x1c);
  iVar23 = 0;
  if (0 < DAT_0033c118) {
    do {
      while( true ) {
        psVar5 = (short *)(g_TWinding + iVar23 * 6);
        if ((psVar5[2] == -1) || (local_280[psVar5[2] + 0x10] == 0)) break;
        local_298 = (undefined2 *)0x0;
LAB_0013611a:
        iVar23 = iVar23 + 1;
        if (DAT_0033c118 <= iVar23) goto LAB_001361e0;
      }
      local_2ac._0_2_ = (short)(1 << ((char)uVar15 - 5U & 0x1f));
      iVar30 = *(int *)(local_21c + 0x24);
      iVar32 = (int)(short)(*psVar5 * (short)local_2ac + *psVar4) +
               (short)(psVar5[1] * (short)local_2ac + psVar4[1]) * iVar30;
      if ((*(uint *)(local_220 + (iVar32 >> 5) * 4) & 1 << ((byte)iVar32 & 0x1f)) == 0)
      goto LAB_0013611a;
      local_214[(int)local_298] = (short)iVar32;
      if (local_298 == (undefined2 *)0x1) {
        local_214[2] = *psVar4 + (short)iVar30 * psVar4[1];
        sVar40 = (short)*(undefined4 *)(local_20 + 0x2c);
        *(short *)(local_148 + local_128 * 2) = sVar40 + (short)local_12c + local_214[0];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar40 + (short)local_12c + local_214[1];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar40 + (short)local_12c + local_214[2];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(*(int *)(local_20 + 0xf4) + local_218 * 2) = sVar40 + local_214[0];
        *(short *)(*(int *)(local_20 + 0xf4) + 2 + local_218 * 2) = sVar40 + local_214[1];
        *(short *)(*(int *)(local_20 + 0xf4) + 4 + local_218 * 2) = sVar40 + local_214[2];
        local_218 = local_218 + 3;
        local_214[0] = local_214[1];
        goto LAB_0013611a;
      }
      iVar23 = iVar23 + 1;
      local_298 = (undefined2 *)0x1;
    } while (iVar23 < DAT_0033c118);
  }
LAB_001361e0:
  *(char *)(puVar31 + 1) = (char)local_218 - (char)local_318;
  *puVar31 = local_318;
LAB_00136016:
  local_2e4 = local_2e4 + 1;
  if (local_2e4 == 4) goto LAB_00136202;
  local_304 = local_304 + *(int *)(local_21c + 0x44);
  local_2b0 = *(int *)(local_21c + 8);
  local_2ac = *(int *)(local_21c + 0x24);
  local_300 = local_220;
  local_298 = *(undefined2 **)(local_20 + 0x24c);
  iVar23 = local_21c;
  goto LAB_00135fa5;
LAB_00136202:
  if (iVar27 == local_218) {
LAB_00135cc0:
    *(undefined1 *)((int)puVar28 + 3) = 0;
  }
  else {
    *(undefined1 *)((int)puVar28 + 3) = 1;
    local_308 = (undefined2)local_218;
  }
  local_298 = (undefined2 *)0x0;
  uVar15 = *(undefined4 *)(local_21c + 0x1c);
  iVar23 = 0;
  if (0 < DAT_0033c118) {
    do {
      while( true ) {
        psVar4 = (short *)(g_TWinding + iVar23 * 6);
        if ((psVar4[2] == -1) || (local_280[psVar4[2] + 0xc] == 0)) break;
        local_298 = (undefined2 *)0x0;
LAB_00135d0a:
        iVar23 = iVar23 + 1;
        if (DAT_0033c118 <= iVar23) goto LAB_00135dd0;
      }
      local_2ac._0_2_ = (short)(1 << ((char)uVar15 - 4U & 0x1f));
      iVar27 = *(int *)(local_21c + 0x24);
      iVar29 = (int)(short)(*psVar4 * (short)local_2ac + *psVar3) +
               (short)(psVar4[1] * (short)local_2ac + psVar3[1]) * iVar27;
      if ((*(uint *)(local_220 + (iVar29 >> 5) * 4) & 1 << ((byte)iVar29 & 0x1f)) == 0)
      goto LAB_00135d0a;
      local_214[(int)local_298] = (short)iVar29;
      if (local_298 == (undefined2 *)0x1) {
        local_214[2] = *psVar3 + (short)iVar27 * psVar3[1];
        sVar39 = (short)*(undefined4 *)(local_20 + 0x2c);
        *(short *)(local_148 + local_128 * 2) = sVar39 + (short)local_12c + local_214[0];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar39 + (short)local_12c + local_214[1];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar39 + (short)local_12c + local_214[2];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(*(int *)(local_20 + 0xf4) + local_218 * 2) = sVar39 + local_214[0];
        *(short *)(*(int *)(local_20 + 0xf4) + 2 + local_218 * 2) = sVar39 + local_214[1];
        *(short *)(*(int *)(local_20 + 0xf4) + 4 + local_218 * 2) = sVar39 + local_214[2];
        local_218 = local_218 + 3;
        local_214[0] = local_214[1];
        goto LAB_00135d0a;
      }
      iVar23 = iVar23 + 1;
      local_298 = (undefined2 *)0x1;
    } while (iVar23 < DAT_0033c118);
  }
LAB_00135dd0:
  *(char *)(puVar28 + 1) = (char)local_218 - (char)local_308;
  *puVar28 = local_308;
LAB_00135c13:
  local_2c8 = local_2c8 + 1;
  local_2e8 = local_2e8 + *(int *)(local_21c + 0x40);
  if (local_2c8 == 4) goto LAB_00135df8;
  local_2b0 = *(int *)(local_21c + 8);
  local_2ac = *(int *)(local_21c + 0x24);
  local_298 = *(undefined2 **)(local_20 + 0x24c);
  local_300 = local_220;
  iVar23 = local_21c;
  goto LAB_00135ba2;
LAB_00135df8:
  if (iVar24 == local_218) {
LAB_001358b8:
    *(undefined1 *)((int)puVar25 + 3) = 0;
  }
  else {
    *(undefined1 *)((int)puVar25 + 3) = 1;
    local_2f0 = (undefined2)local_218;
  }
  local_298 = (undefined2 *)0x0;
  uVar15 = *(undefined4 *)(local_21c + 0x1c);
  iVar23 = 0;
  if (0 < DAT_0033c118) {
    do {
      while( true ) {
        psVar3 = (short *)(g_TWinding + iVar23 * 6);
        if ((psVar3[2] == -1) || (local_280[psVar3[2] + 8] == 0)) break;
        local_298 = (undefined2 *)0x0;
LAB_0013590a:
        iVar23 = iVar23 + 1;
        if (DAT_0033c118 <= iVar23) goto LAB_001359d0;
      }
      local_2ac._0_2_ = (short)(1 << ((char)uVar15 - 3U & 0x1f));
      iVar24 = *(int *)(local_21c + 0x24);
      iVar26 = (int)(short)(*psVar3 * (short)local_2ac + *psVar2) +
               (short)(psVar3[1] * (short)local_2ac + psVar2[1]) * iVar24;
      if ((*(uint *)(local_220 + (iVar26 >> 5) * 4) & 1 << ((byte)iVar26 & 0x1f)) == 0)
      goto LAB_0013590a;
      local_214[(int)local_298] = (short)iVar26;
      if (local_298 == (undefined2 *)0x1) {
        local_214[2] = *psVar2 + (short)iVar24 * psVar2[1];
        sVar38 = (short)*(undefined4 *)(local_20 + 0x2c);
        *(short *)(local_148 + local_128 * 2) = sVar38 + (short)local_12c + local_214[0];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar38 + (short)local_12c + local_214[1];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar38 + (short)local_12c + local_214[2];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(*(int *)(local_20 + 0xf4) + local_218 * 2) = sVar38 + local_214[0];
        *(short *)(*(int *)(local_20 + 0xf4) + 2 + local_218 * 2) = sVar38 + local_214[1];
        *(short *)(*(int *)(local_20 + 0xf4) + 4 + local_218 * 2) = sVar38 + local_214[2];
        local_218 = local_218 + 3;
        local_214[0] = local_214[1];
        goto LAB_0013590a;
      }
      iVar23 = iVar23 + 1;
      local_298 = (undefined2 *)0x1;
    } while (iVar23 < DAT_0033c118);
  }
LAB_001359d0:
  *(char *)(puVar25 + 1) = (char)local_218 - (char)local_2f0;
  *puVar25 = local_2f0;
LAB_001356c2:
  local_2b4 = local_2b4 + 1;
  local_2cc = local_2cc + *(int *)(local_21c + 0x3c);
  if (local_2b4 == 4) goto LAB_001359f8;
  local_2b0 = *(int *)(local_21c + 8);
  local_2ac = *(int *)(local_21c + 0x24);
  local_298 = *(undefined2 **)(local_20 + 0x24c);
  local_300 = local_220;
  goto LAB_0013564d;
LAB_001359f8:
  if (iVar20 == local_218) {
LAB_001354ae:
    *(undefined1 *)((int)puVar22 + 3) = 0;
  }
  else {
    *(undefined1 *)((int)puVar22 + 3) = 1;
    local_2d8 = (undefined2)local_218;
  }
  local_298 = (undefined2 *)0x0;
  uVar15 = *(undefined4 *)(local_21c + 0x1c);
  iVar20 = 0;
  if (0 < DAT_0033c118) {
    do {
      while( true ) {
        psVar2 = (short *)(g_TWinding + iVar20 * 6);
        if ((psVar2[2] == -1) || (local_280[psVar2[2] + 4] == 0)) break;
        local_298 = (undefined2 *)0x0;
LAB_001354fa:
        iVar20 = iVar20 + 1;
        if (DAT_0033c118 <= iVar20) goto LAB_001355c0;
      }
      local_2ac._0_2_ = (short)(1 << ((char)uVar15 - 2U & 0x1f));
      iVar19 = *(int *)(local_21c + 0x24);
      iVar23 = (int)(short)(*psVar2 * (short)local_2ac + *psVar1) +
               (short)(psVar2[1] * (short)local_2ac + psVar1[1]) * iVar19;
      if ((*(uint *)(local_220 + (iVar23 >> 5) * 4) & 1 << ((byte)iVar23 & 0x1f)) == 0)
      goto LAB_001354fa;
      local_214[(int)local_298] = (short)iVar23;
      if (local_298 == (undefined2 *)0x1) {
        local_214[2] = (short)iVar19 * psVar1[1] + *psVar1;
        sVar37 = (short)*(undefined4 *)(local_20 + 0x2c);
        *(short *)(local_148 + local_128 * 2) = sVar37 + (short)local_12c + local_214[0];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar37 + (short)local_12c + local_214[1];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(local_148 + local_128 * 2) = sVar37 + (short)local_12c + local_214[2];
        local_128 = local_128 + local_13c;
        if (local_130 < local_128) {
          local_130 = local_128;
        }
        *(short *)(*(int *)(local_20 + 0xf4) + local_218 * 2) = sVar37 + local_214[0];
        *(short *)(*(int *)(local_20 + 0xf4) + 2 + local_218 * 2) = sVar37 + local_214[1];
        *(short *)(*(int *)(local_20 + 0xf4) + 4 + local_218 * 2) = sVar37 + local_214[2];
        local_218 = local_218 + 3;
        local_214[0] = local_214[1];
        goto LAB_001354fa;
      }
      iVar20 = iVar20 + 1;
      local_298 = (undefined2 *)0x1;
    } while (iVar20 < DAT_0033c118);
  }
LAB_001355c0:
  *(char *)(puVar22 + 1) = (char)local_218 - (char)local_2d8;
  *puVar22 = local_2d8;
LAB_00135407:
  local_290 = local_290 + 1;
  local_2b8 = local_2b8 + *(int *)(local_21c + 0x38);
  if (local_290 == 4) goto LAB_001355e8;
  local_2ac = *(int *)(local_21c + 0x24);
  local_298 = *(undefined2 **)(local_20 + 0x24c);
  goto LAB_0013538c;
LAB_001355e8:
  if (local_218 != 0) {
    *(undefined1 *)((int)puVar14 + 3) = 1;
    local_2b0._0_1_ = (char)local_218;
    local_2b4._0_2_ = (undefined2)local_218;
    goto LAB_001351d4;
  }
  goto LAB_001351ba;
}

SourceMod gamedata

paste into addons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)

Just a Signatures{} block, ready to drop into a gamedata file. Wire it up in your plugin however you like - SDKCall, DHooks, raw memory ops, or anything else.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)