L L4D2node

ClipPolyToPlane_Precise

0x000a8fb0 · 718 bytes · __cdecl

_Z23ClipPolyToPlane_PrecisePdiS_PKddd

Decompiled

undefined (6 params)

/* ClipPolyToPlane_Precise(double*, int, double*, double const*, double, double) */

int ClipPolyToPlane_Precise
              (double *param_1,int param_2,double *param_3,double *param_4,double param_5,
              double param_6)

{
  undefined8 *puVar1;
  undefined4 *puVar2;
  double dVar3;
  double dVar4;
  double dVar5;
  undefined4 uVar6;
  int iVar7;
  double *pdVar8;
  int iVar9;
  int iVar10;
  int iVar11;
  int iVar12;
  int iVar13;
  double *pdVar14;
  int in_GS_OFFSET;
  double dVar15;
  undefined4 auStack_70 [2];
  undefined8 uStack_68;
  undefined8 *local_60;
  int local_5c;
  double *local_58;
  undefined4 *local_54;
  double *local_50;
  int local_48 [3];
  double local_3c [3];
  int local_20;
  
  local_3c[0] = 0.0;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_3c[1] = 0.0;
  local_3c[2] = 0.0;
  local_48[2] = 0;
  local_48[1] = 0;
  local_48[0] = 0;
  iVar11 = param_2 * 0x20 + 0x10;
  local_58 = param_1;
  iVar9 = -iVar11;
  iVar11 = iVar11 * -2;
  puVar1 = (undefined8 *)((int)&local_60 + iVar9);
  puVar2 = (undefined4 *)((int)&local_60 + iVar11);
  local_50 = param_3;
  if (param_2 < 1) {
    iVar12 = 0;
  }
  else {
    iVar12 = 0;
    dVar3 = *param_4;
    dVar4 = param_4[1];
    dVar5 = param_4[2];
    pdVar8 = param_1;
    do {
      while( true ) {
        dVar15 = ((*pdVar8 * dVar3 + pdVar8[1] * dVar4) - param_5) + pdVar8[2] * dVar5;
        puVar1[iVar12] = dVar15;
        if (dVar15 <= param_6) break;
        puVar2[iVar12] = 0;
        iVar13 = 0;
LAB_000a9061:
        local_48[iVar13] = local_48[iVar13] + 1;
        iVar12 = iVar12 + 1;
        pdVar8 = pdVar8 + 3;
        if (iVar12 == param_2) goto LAB_000a90c6;
      }
      if (-param_6 <= dVar15) {
        puVar2[iVar12] = 2;
        iVar13 = 2;
        goto LAB_000a9061;
      }
      puVar2[iVar12] = 1;
      iVar12 = iVar12 + 1;
      local_48[1] = local_48[1] + 1;
      pdVar8 = pdVar8 + 3;
    } while (iVar12 != param_2);
LAB_000a90c6:
    uVar6 = *puVar2;
    puVar1[param_2] = *puVar1;
    puVar2[param_2] = uVar6;
    iVar12 = 0;
    if (local_48[0] != 0) {
      if (local_48[1] == 0) {
        iVar9 = 0;
        iVar12 = param_2;
        if (0 < param_2 * 3) {
          do {
            param_3[iVar9] = param_1[iVar9];
            iVar9 = iVar9 + 1;
          } while (iVar9 != param_2 * 3);
        }
      }
      else {
        iVar13 = 0;
        pdVar8 = (double *)0x1;
        pdVar14 = param_1;
        do {
          local_50 = pdVar8;
          iVar7 = *(int *)((int)&uStack_68 + (int)local_50 * 4 + iVar11 + 4);
          if (iVar7 == 2) {
            iVar12 = iVar13 + 1;
            param_3[iVar13 * 3] = *pdVar14;
            param_3[iVar13 * 3 + 1] = pdVar14[1];
            param_3[iVar13 * 3 + 2] = pdVar14[2];
          }
          else {
            iVar10 = iVar13;
            if (iVar7 == 0) {
              iVar10 = iVar13 + 1;
              local_5c = iVar13 * 0x18;
              param_3[iVar13 * 3] = *pdVar14;
              param_3[iVar13 * 3 + 1] = pdVar14[1];
              param_3[iVar13 * 3 + 2] = pdVar14[2];
            }
            iVar12 = iVar10;
            if ((puVar2[(int)local_50] != 2) && (iVar7 != puVar2[(int)local_50])) {
              dVar3 = *(double *)((int)&uStack_68 + (int)local_50 * 8 + iVar9);
              dVar4 = (double)puVar1[(int)local_50];
              iVar12 = 0;
              do {
                local_3c[iVar12] =
                     (param_1[((int)local_50 % param_2) * 3 + iVar12] - pdVar14[iVar12]) *
                     (dVar3 / (dVar3 - dVar4)) + pdVar14[iVar12];
                iVar12 = iVar12 + 1;
              } while (iVar12 != 3);
              iVar12 = iVar10 + 1;
              param_3[iVar10 * 3] = local_3c[0];
              param_3[iVar10 * 3 + 1] = local_3c[1];
              param_3[iVar10 * 3 + 2] = local_3c[2];
            }
          }
          pdVar14 = pdVar14 + 3;
          iVar13 = iVar12;
          pdVar8 = (double *)((int)local_50 + 1);
          local_60 = puVar1;
          local_54 = puVar2;
        } while ((int)local_50 < param_2);
      }
    }
  }
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    *(code **)((int)auStack_70 + iVar11) = CeilPow2;
    __stack_chk_fail();
  }
  return iVar12;
}

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)