L L4D2node

BlendCorners

0x000d24f0 · 1282 bytes · __regparm3

_ZL12BlendCornersPP13CCoreDispInfoi

Decompiled

undefined (2 params)

/* BlendCorners(CCoreDispInfo**, int) */

void __regparm3 BlendCorners(CCoreDispInfo **param_1,int param_2)

{
  CCoreDispInfo CVar1;
  short sVar2;
  short sVar3;
  CCoreDispInfo *pCVar4;
  int iVar5;
  CPowerInfo *pCVar6;
  short *psVar7;
  int iVar8;
  int iVar9;
  CCoreDispInfo *pCVar10;
  int iVar11;
  int iVar12;
  CUtlMemory<int,int> *local_874;
  int local_870;
  int local_864;
  float local_848;
  float local_844;
  float local_840;
  float local_83c;
  float local_838;
  float local_834;
  void *local_830;
  int local_82c;
  int local_828;
  int local_824;
  void *local_820;
  uint local_81c [515];
  
  local_830 = (void *)0x0;
  local_82c = 0;
  local_828 = 0;
  local_820 = (void *)0x0;
  if (0 < param_2) {
    local_870 = 0;
    do {
      iVar12 = 0;
      pCVar4 = param_1[local_870];
      iVar9 = 0;
      pCVar10 = pCVar4 + 0x160;
      do {
        CVar1 = pCVar10[8];
        if (CVar1 != (CCoreDispInfo)0x0) {
          iVar5 = 0;
          do {
            if (iVar9 < 0x200) {
              local_81c[iVar9] = (uint)*(ushort *)(pCVar10 + iVar5);
              iVar9 = iVar9 + 1;
            }
            iVar5 = iVar5 + 2;
          } while (iVar5 != (uint)(byte)CVar1 * 2);
        }
        iVar12 = iVar12 + 1;
        pCVar10 = pCVar10 + 10;
      } while (iVar12 != 4);
      iVar12 = 4;
      pCVar10 = pCVar4 + 0x130;
      do {
        if (*(ushort *)pCVar10 == 0xffff) {
LAB_000d25fb:
          if ((*(ushort *)(pCVar10 + 6) != 0xffff) && (iVar9 < 0x200)) {
            local_81c[iVar9] = (uint)*(ushort *)(pCVar10 + 6);
            iVar9 = iVar9 + 1;
          }
        }
        else if (iVar9 < 0x200) {
          local_81c[iVar9] = (uint)*(ushort *)pCVar10;
          iVar9 = iVar9 + 1;
          goto LAB_000d25fb;
        }
        pCVar10 = pCVar10 + 0xc;
        iVar12 = iVar12 + -1;
      } while (iVar12 != 0);
      iVar12 = 0;
      local_824 = 0;
      if ((local_82c < iVar9) && (-1 < local_828)) {
        local_82c = iVar9;
        if (local_830 == (void *)0x0) {
          local_830 = malloc(iVar9 << 2);
        }
        else {
          local_830 = realloc(local_830,iVar9 << 2);
          iVar12 = local_824;
        }
      }
      local_820 = local_830;
      if (iVar9 != 0) {
        CUtlVector<int,CUtlMemory<int,int>>::GrowVector
                  ((CUtlVector<int,CUtlMemory<int,int>> *)&local_830,iVar9);
        iVar5 = (local_824 - iVar12) - iVar9;
        if (0 < iVar5) {
          _V_memmove((void *)((int)local_830 + (iVar12 + iVar9) * 4),
                     (void *)((int)local_830 + iVar12 * 4),iVar5 * 4);
        }
      }
      local_864 = 0;
      do {
                    /* try { // try from 000d269b to 000d298f has its CatchHandler @ 000d29f6 */
        pCVar6 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar4)(pCVar4);
        psVar7 = (short *)CPowerInfo::GetCornerPointIndex(pCVar6,local_864);
        sVar2 = *psVar7;
        sVar3 = psVar7[1];
        iVar12 = (*(code *)**(undefined4 **)pCVar4)(pCVar4);
        iVar12 = (int)sVar3 * *(int *)(iVar12 + 0x24) + (int)sVar2;
        iVar11 = 0;
        iVar5 = iVar12 * 0x90 + *(int *)(pCVar4 + 0x1b8);
        local_848 = *(float *)(iVar5 + 0x40);
        local_83c = *(float *)(iVar5 + 0x4c);
        local_838 = *(float *)(iVar5 + 0x50);
        local_844 = *(float *)(iVar5 + 0x44);
        local_834 = *(float *)(iVar5 + 0x54);
        local_840 = *(float *)(iVar5 + 0x48);
        if (iVar9 != 0) {
          do {
            while( true ) {
              pCVar10 = param_1[local_81c[iVar11]];
              iVar8 = FindNeighborCornerVert(pCVar10,(Vector *)(iVar5 + 0x28));
              if (iVar8 == -1) break;
              pCVar6 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar10)(pCVar10);
              psVar7 = (short *)CPowerInfo::GetCornerPointIndex(pCVar6,iVar8);
              sVar2 = *psVar7;
              sVar3 = psVar7[1];
              iVar8 = (*(code *)**(undefined4 **)pCVar10)(pCVar10);
              iVar8 = (int)sVar2 + (int)sVar3 * *(int *)(iVar8 + 0x24);
              *(int *)((int)local_830 + iVar11 * 4) = iVar8;
              iVar11 = iVar11 + 1;
              iVar8 = iVar8 * 0x90 + *(int *)(pCVar10 + 0x1b8);
              local_848 = local_848 + *(float *)(iVar8 + 0x40);
              local_844 = local_844 + *(float *)(iVar8 + 0x44);
              local_840 = local_840 + *(float *)(iVar8 + 0x48);
              local_83c = local_83c + *(float *)(iVar8 + 0x4c);
              local_838 = local_838 + *(float *)(iVar8 + 0x50);
              local_834 = local_834 + *(float *)(iVar8 + 0x54);
              if (iVar11 == iVar9) goto LAB_000d286b;
            }
            *(undefined4 *)((int)local_830 + iVar11 * 4) = 0xffffffff;
            iVar11 = iVar11 + 1;
          } while (iVar11 != iVar9);
        }
LAB_000d286b:
        VectorNormalize((Vector *)&local_848);
        VectorNormalize((Vector *)&local_83c);
        UpdateTangentSpace(pCVar4,iVar12,(Vector *)&local_848,(Vector *)&local_83c);
        if (iVar9 != 0) {
          iVar12 = 0;
          do {
            iVar5 = *(int *)((int)local_830 + iVar12 * 4);
            if (iVar5 != -1) {
              UpdateTangentSpace(param_1[local_81c[iVar12]],iVar5,(Vector *)&local_848,
                                 (Vector *)&local_83c);
            }
            iVar12 = iVar12 + 1;
          } while (iVar12 != iVar9);
        }
        local_864 = local_864 + 1;
      } while (local_864 != 4);
      local_870 = local_870 + 1;
    } while (local_870 != param_2);
  }
  local_874 = (CUtlMemory<int,int> *)&local_830;
  local_824 = 0;
  CUtlMemory<int,int>::Purge(local_874);
  local_820 = local_830;
  CUtlMemory<int,int>::Purge(local_874);
  return;
}

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)