L L4D2node

COverlayMgr::BuildClipPlanes

0x001cffb0 · 638 bytes · __thiscall

_ZN11COverlayMgr15BuildClipPlanesEP11msurface2_tR18moverlayfragment_tRK6VectorR10CUtlVectorI8cplane_t10CUtlMemoryIS8_iEE

Decompiled

undefined (5 params)

/* COverlayMgr::BuildClipPlanes(msurface2_t*, moverlayfragment_t&, Vector const&,
   CUtlVector<cplane_t, CUtlMemory<cplane_t, int> >&) */

void __thiscall
COverlayMgr::BuildClipPlanes
          (COverlayMgr *this,msurface2_t *param_1,moverlayfragment_t *param_2,Vector *param_3,
          CUtlVector *param_4)

{
  float *pfVar1;
  float fVar2;
  float fVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  void *pvVar7;
  int iVar8;
  float *pfVar9;
  int iVar10;
  int iVar11;
  bool bVar12;
  float fVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  int local_38;
  int local_34;
  float local_28;
  float local_24;
  float local_20;
  
  iVar4 = *(int *)(param_2 + 0x1c);
  if (0 < iVar4) {
    local_34 = 0;
    local_38 = 1;
    do {
      iVar5 = local_34 * 0x34;
      pfVar1 = (float *)(*(int *)(param_2 + 0x10) + iVar5);
      local_34 = local_38;
      pfVar9 = (float *)(*(int *)(param_2 + 0x10) + (local_38 % iVar4) * 0x34);
      local_28 = *pfVar9 - *pfVar1;
      local_24 = pfVar9[1] - pfVar1[1];
      local_20 = pfVar9[2] - pfVar1[2];
      VectorNormalize((Vector *)&local_28);
      iVar11 = *(int *)(param_4 + 0xc);
      iVar8 = *(int *)(param_4 + 4);
      iVar10 = iVar11 + 1;
      if (iVar8 < iVar10) {
        iVar6 = *(int *)(param_4 + 8);
        if (iVar6 < 0) goto LAB_001d0054;
        if (iVar6 == 0) {
          if (iVar8 == 0) {
            if (iVar10 < 3) {
              iVar6 = 2;
              goto LAB_001d01d7;
            }
            iVar8 = 2;
          }
          do {
            iVar6 = iVar8 * 2;
            if (iVar10 <= iVar6) break;
            iVar6 = iVar8 * 4;
            iVar8 = iVar6;
          } while (iVar6 < iVar10);
        }
        else {
          for (iVar6 = (iVar11 / iVar6 + 1) * iVar6; iVar6 < iVar10; iVar6 = (iVar6 + iVar10) / 2) {
          }
        }
LAB_001d01d7:
        *(int *)(param_4 + 4) = iVar6;
        if (*(void **)param_4 == (void *)0x0) {
          pvVar7 = malloc(iVar6 * 0x14);
          *(void **)param_4 = pvVar7;
        }
        else {
          pvVar7 = realloc(*(void **)param_4,iVar6 * 0x14);
          *(void **)param_4 = pvVar7;
          iVar10 = *(int *)(param_4 + 0xc) + 1;
        }
      }
      else {
LAB_001d0054:
        pvVar7 = *(void **)param_4;
      }
      *(int *)(param_4 + 0xc) = iVar10;
      iVar10 = (iVar10 - iVar11) + -1;
      *(void **)(param_4 + 0x10) = pvVar7;
      iVar11 = iVar11 * 0x14;
      if (0 < iVar10) {
        _V_memmove((void *)((int)pvVar7 + iVar11 + 0x14),(void *)((int)pvVar7 + iVar11),
                   iVar10 * 0x14);
        pvVar7 = *(void **)param_4;
      }
      pfVar1 = (float *)((int)pvVar7 + iVar11);
      fVar13 = *(float *)(param_3 + 4);
      fVar2 = *(float *)(param_3 + 8);
      fVar3 = *(float *)param_3;
      fVar16 = local_20 * fVar13 - local_24 * fVar2;
      *pfVar1 = fVar16;
      fVar14 = local_24 * fVar3 - fVar13 * local_28;
      fVar15 = fVar2 * local_28 - local_20 * fVar3;
      pfVar1[2] = fVar14;
      pfVar1[1] = fVar15;
      pfVar9 = (float *)(iVar5 + *(int *)(param_2 + 0x10));
      fVar13 = pfVar9[1];
      fVar2 = *pfVar9;
      fVar3 = pfVar9[2];
      *(undefined1 *)(pfVar1 + 4) = 3;
      fVar13 = fVar13 * fVar15 + fVar2 * fVar16 + fVar3 * fVar14;
      pfVar1[3] = fVar13;
      pfVar9 = (float *)(((local_38 + 1) % iVar4) * 0x34 + *(int *)(param_2 + 0x10));
      if (0.0 < (pfVar9[1] * fVar15 + *pfVar9 * fVar16 + pfVar9[2] * fVar14) - fVar13) {
        *pfVar1 = -fVar16;
        pfVar1[1] = -fVar15;
        pfVar1[2] = -fVar14;
        pfVar1[3] = -fVar13;
      }
      bVar12 = local_38 != iVar4;
      local_38 = local_38 + 1;
    } while (bVar12);
  }
  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)