L L4D2node

ClipPolyToPlane

0x000a8c70 · 811 bytes · __cdecl

_Z15ClipPolyToPlaneP6VectoriS0_RKS_ff

Decompiled

undefined (6 params)

/* ClipPolyToPlane(Vector*, int, Vector*, Vector const&, float, float) */

int ClipPolyToPlane(Vector *param_1,int param_2,Vector *param_3,Vector *param_4,float param_5,
                   float param_6)

{
  undefined4 *puVar1;
  undefined4 *puVar2;
  float fVar3;
  float fVar4;
  float fVar5;
  undefined4 uVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  Vector *pVVar10;
  Vector *pVVar11;
  int iVar12;
  int iVar13;
  int iVar14;
  int in_GS_OFFSET;
  float fVar15;
  float fVar16;
  Vector *apVStack_60 [7];
  float local_44;
  undefined4 *local_40;
  int local_38 [3];
  float local_2c [3];
  int local_20;
  
  local_38[2] = 0;
  local_38[1] = 0;
  local_38[0] = 0;
  apVStack_60[4] = param_1;
  apVStack_60[6] = param_4;
  apVStack_60[5] = param_3;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  iVar9 = param_2 * 0x10 + 0x10;
  iVar8 = -iVar9;
  iVar9 = iVar9 * -2;
  puVar1 = (undefined4 *)((int)apVStack_60 + iVar8 + 0x10);
  puVar2 = (undefined4 *)((int)apVStack_60 + iVar9 + 0x10);
  local_2c[0] = vec3_origin;
  local_2c[1] = (float)DAT_000d7fcc;
  local_2c[2] = (float)DAT_000d7fd0;
  if (param_2 < 1) {
    iVar13 = 0;
  }
  else {
    fVar3 = *(float *)param_4;
    fVar16 = -param_5;
    fVar4 = *(float *)(param_4 + 4);
    fVar5 = *(float *)(param_4 + 8);
    iVar13 = 0;
    pVVar10 = param_1;
    do {
      while( true ) {
        fVar15 = ((*(float *)pVVar10 * fVar3 + *(float *)(pVVar10 + 4) * fVar4) - param_5) +
                 *(float *)(pVVar10 + 8) * fVar5;
        puVar1[iVar13] = fVar15;
        if (fVar15 <= param_6) break;
        puVar2[iVar13] = 0;
        iVar14 = 0;
LAB_000a8d31:
        local_38[iVar14] = local_38[iVar14] + 1;
        iVar13 = iVar13 + 1;
        pVVar10 = pVVar10 + 0xc;
        if (iVar13 == param_2) goto LAB_000a8d94;
      }
      if (-param_6 <= fVar15) {
        puVar2[iVar13] = 2;
        iVar14 = 2;
        goto LAB_000a8d31;
      }
      puVar2[iVar13] = 1;
      iVar13 = iVar13 + 1;
      local_38[1] = local_38[1] + 1;
      pVVar10 = pVVar10 + 0xc;
    } while (iVar13 != param_2);
LAB_000a8d94:
    uVar6 = *puVar2;
    puVar1[param_2] = *puVar1;
    puVar2[param_2] = uVar6;
    iVar13 = 0;
    local_44 = fVar16;
    if (local_38[0] != 0) {
      if (local_38[1] == 0) {
        pVVar10 = param_1;
        do {
          pVVar11 = pVVar10 + 0xc;
          *(undefined4 *)param_3 = *(undefined4 *)pVVar10;
          *(undefined4 *)(param_3 + 4) = *(undefined4 *)(pVVar10 + 4);
          *(undefined4 *)(param_3 + 8) = *(undefined4 *)(pVVar10 + 8);
          iVar13 = param_2;
          pVVar10 = pVVar11;
          param_3 = param_3 + 0xc;
        } while (pVVar11 != param_1 + param_2 * 0xc);
      }
      else {
        iVar14 = 0;
        fVar3 = 1.4013e-45;
        pVVar10 = param_1;
        do {
          local_44 = fVar3;
          iVar7 = *(int *)((int)apVStack_60 + (int)local_44 * 4 + iVar9 + 0xc);
          if (iVar7 == 2) {
            iVar13 = iVar14 + 1;
            pVVar11 = param_3 + iVar14 * 0xc;
            *(undefined4 *)pVVar11 = *(undefined4 *)pVVar10;
            *(undefined4 *)(pVVar11 + 4) = *(undefined4 *)(pVVar10 + 4);
            *(undefined4 *)(pVVar11 + 8) = *(undefined4 *)(pVVar10 + 8);
          }
          else {
            iVar12 = iVar14;
            if (iVar7 == 0) {
              iVar12 = iVar14 + 1;
              pVVar11 = param_3 + iVar14 * 0xc;
              *(undefined4 *)pVVar11 = *(undefined4 *)pVVar10;
              *(undefined4 *)(pVVar11 + 4) = *(undefined4 *)(pVVar10 + 4);
              *(undefined4 *)(pVVar11 + 8) = *(undefined4 *)(pVVar10 + 8);
            }
            iVar13 = iVar12;
            if ((puVar2[(int)local_44] != 2) && (iVar7 != puVar2[(int)local_44])) {
              apVStack_60[3] = param_1 + ((int)local_44 % param_2) * 0xc;
              fVar3 = *(float *)((int)apVStack_60 + (int)local_44 * 4 + iVar8 + 0xc);
              fVar4 = (float)puVar1[(int)local_44];
              iVar13 = 0;
              do {
                if (*(float *)(param_4 + iVar13 * 4) == 1.0) {
                  local_2c[iVar13] = param_5;
                }
                else if (*(float *)(param_4 + iVar13 * 4) == -1.0) {
                  local_2c[iVar13] = fVar16;
                }
                else {
                  local_2c[iVar13] =
                       (*(float *)(apVStack_60[3] + iVar13 * 4) - *(float *)(pVVar10 + iVar13 * 4))
                       * (fVar3 / (fVar3 - fVar4)) + *(float *)(pVVar10 + iVar13 * 4);
                }
                iVar13 = iVar13 + 1;
              } while (iVar13 != 3);
              iVar13 = iVar12 + 1;
              pVVar11 = param_3 + iVar12 * 0xc;
              *(float *)pVVar11 = local_2c[0];
              *(float *)(pVVar11 + 4) = local_2c[1];
              *(float *)(pVVar11 + 8) = local_2c[2];
            }
          }
          pVVar10 = pVVar10 + 0xc;
          iVar14 = iVar13;
          fVar3 = (float)((int)local_44 + 1);
          apVStack_60[2] = (Vector *)puVar1;
          local_40 = puVar2;
        } while ((int)local_44 < param_2);
      }
    }
  }
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    *(code **)((int)apVStack_60 + iVar9) = ClipPolyToPlane_Precise;
    __stack_chk_fail();
  }
  return iVar13;
}

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)