L L4D2node

COcclusionSystem::AddPolygonToEdgeList

0x001cd570 · 742 bytes · __thiscall

_ZN16COcclusionSystem20AddPolygonToEdgeListER9CEdgeListPP6Vectoriib

Decompiled

undefined (6 params)

/* COcclusionSystem::AddPolygonToEdgeList(CEdgeList&, Vector**, int, int, bool) */

void __thiscall
COcclusionSystem::AddPolygonToEdgeList
          (COcclusionSystem *this,CEdgeList *param_1,Vector **param_2,int param_3,int param_4,
          bool param_5)

{
  float *pfVar1;
  int iVar2;
  COcclusionSystem *pCVar3;
  int iVar4;
  int iVar5;
  uint uVar6;
  undefined4 *puVar7;
  int iVar8;
  float fVar9;
  int in_GS_OFFSET;
  float fVar10;
  float fVar11;
  float fVar12;
  undefined3 in_stack_00000019;
  int aiStack_80 [2];
  float afStack_78 [2];
  int aiStack_70 [4];
  int local_60;
  undefined4 local_5c;
  CEdgeList *local_58;
  float local_54;
  COcclusionSystem *local_50;
  int local_4c;
  COcclusionSystem *local_48;
  float local_44;
  undefined4 *local_40;
  float local_34 [5];
  int local_20;
  
  local_50 = this;
  local_58 = param_1;
  local_5c = _param_5;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  iVar4 = param_3 * 0x10 + 0x10;
  iVar2 = iVar4 * -2;
  local_40 = (undefined4 *)((int)&local_60 - iVar4);
  local_4c = (int)&local_60 + iVar2;
  local_60 = param_3 * 0xc;
  iVar4 = -((param_3 * 0xc + 0xfU & 0xfffffff0) + 0x10);
  local_54 = (float)((int)&local_60 + iVar4 + iVar2);
  if (0 < param_3) {
    local_44 = 0.0;
    local_48 = this + 8;
    iVar8 = 0;
    fVar9 = local_54;
    do {
      *(float *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = fVar9;
      *(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 8) = param_2[iVar8];
      *(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_48;
      *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd61e;
      Vector3DMultiplyPositionProjective
                (*(VMatrix **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                 *(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 8),
                 *(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
      fVar10 = local_44;
      if (local_44 <= *(float *)((int)fVar9 + 8)) {
        fVar10 = *(float *)((int)fVar9 + 8);
      }
      local_40[iVar8] = fVar9;
      iVar8 = iVar8 + 1;
      *(float *)((int)fVar9 + 8) = fVar10;
      fVar9 = (float)((int)fVar9 + 0xc);
    } while (iVar8 != param_3);
  }
  iVar8 = local_4c;
  pfVar1 = local_34 + 2;
  local_34[2] = 0.0;
  *(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
  local_34[4] = -1.0;
  local_34[3] = -1.0;
  *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = iVar8;
  s_nTempVertCount = 0;
  *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_3;
  *(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_40;
  *(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_50;
  *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd684;
  iVar8 = ClipPolygonToAxisAlignedPlane
                    (*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                     *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
                     *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
                     *(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
                     *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
  if (2 < iVar8) {
    *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = iVar8;
    puVar7 = local_40;
    iVar8 = local_4c;
    *(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
    local_34[3] = 1.0;
    *(int *)((int)aiStack_80 + iVar4 + iVar2 + 8) = iVar8;
    pCVar3 = local_50;
    *(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = puVar7;
    *(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = pCVar3;
    *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd6d0;
    iVar8 = ClipPolygonToAxisAlignedPlane
                      (*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                       *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
                       *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
                       *(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
                       *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
    if (2 < iVar8) {
      *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = iVar8;
      puVar7 = local_40;
      iVar8 = local_4c;
      *(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
      local_34[2] = 1.4013e-45;
      *(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 8) = puVar7;
      pCVar3 = local_50;
      *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = iVar8;
      *(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = pCVar3;
      *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd6fd;
      iVar8 = ClipPolygonToAxisAlignedPlane
                        (*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                         *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
                         *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
                         *(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
                         *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
      if (2 < iVar8) {
        *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = iVar8;
        puVar7 = local_40;
        iVar8 = local_4c;
        *(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
        local_34[3] = -1.0;
        *(int *)((int)aiStack_80 + iVar4 + iVar2 + 8) = iVar8;
        pCVar3 = local_50;
        *(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = puVar7;
        *(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = pCVar3;
        *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd72a;
        iVar8 = ClipPolygonToAxisAlignedPlane
                          (*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                           *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
                           *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
                           *(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
                           *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
        if (2 < iVar8) {
          fVar12 = 0.0;
          local_44 = 0.0;
          iVar5 = 1;
          fVar9 = *(float *)*local_40;
          fVar10 = ((float *)*local_40)[1];
          do {
            fVar11 = (fVar9 - *(float *)local_40[iVar5 + 1]) *
                     (((float *)local_40[iVar5])[1] - fVar10) +
                     (((float *)local_40[iVar5 + 1])[1] - fVar10) *
                     (*(float *)local_40[iVar5] - fVar9);
            if (fVar11 < 0.0) {
              fVar12 = fVar12 - fVar11;
            }
            iVar5 = iVar5 + 1;
          } while (iVar5 != iVar8 + -1);
          *(float *)(param_4 * 0x28 + *(int *)(local_58 + 0xa4) + 0x24) = fVar12;
          if ((char)local_5c != '\0') {
            *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_3;
            *(float *)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_54;
            *(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_50;
            *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd85b;
            StitchClippedVertices
                      (*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                       *(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 8),
                       *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
          }
          local_40 = (undefined4 *)(param_3 + -1);
          local_44 = (float)((int)local_54 + -0xc + local_60);
          local_34[1] = local_44;
          if (0 < param_3 + -1) {
            puVar7 = (undefined4 *)0x0;
            fVar9 = local_54;
            do {
              *(float **)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_34;
              uVar6 = (uint)puVar7 & 1;
              puVar7 = (undefined4 *)((int)puVar7 + 1);
              local_34[uVar6] = fVar9;
              fVar9 = (float)((int)fVar9 + 0xc);
              *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_4;
              *(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_58;
              *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd815;
              CEdgeList::AddEdge(*(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                                 *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
                                 *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
            } while (puVar7 != local_40);
          }
          puVar7 = local_40;
          *(float **)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_34;
          local_34[(uint)puVar7 & 1] = local_44;
          *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_4;
          *(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_58;
          *(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd83d;
          CEdgeList::AddEdge(*(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4),
                             *(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
                             *(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
        }
      }
    }
  }
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  *(undefined **)((int)aiStack_80 + iVar4 + iVar2) = &UNK_001cd865;
  __stack_chk_fail();
}

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)