L L4D2node

CDispInfo::TestAddDecalTri

0x00132630 · 997 bytes · __thiscall

_ZN9CDispInfo15TestAddDecalTriEitP10CDispDecal

Decompiled

undefined (4 params)

/* CDispInfo::TestAddDecalTri(int, unsigned short, CDispDecal*) */

void __thiscall
CDispInfo::TestAddDecalTri(CDispInfo *this,int param_1,ushort param_2,CDispDecal *param_3)

{
  float fVar1;
  float fVar2;
  float fVar3;
  float fVar4;
  int iVar5;
  decal_t *pdVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  float *pfVar10;
  CDecalVert *pCVar11;
  undefined4 *puVar12;
  undefined4 *puVar13;
  int iVar14;
  int iVar15;
  undefined4 *puVar16;
  float *pfVar17;
  float *pfVar18;
  uint uVar19;
  undefined4 *puVar20;
  float fVar21;
  float fVar22;
  float fVar23;
  float fVar24;
  float fVar25;
  float fVar26;
  int local_a0;
  ushort local_8e [3];
  float local_88;
  float local_84;
  float local_80;
  CDecalVert local_7c [4];
  undefined4 local_78 [26];
  
  iVar5 = *(int *)(this + 0xe4);
  pdVar6 = *(decal_t **)(param_3 + 0x14);
  iVar7 = *(int *)(this + 0xd8);
  iVar14 = (param_1 + 1) * iVar5;
  local_8e[0] = *(short *)(iVar7 + param_1 * 2 * iVar5) - *(short *)(this + 0x2c);
  iVar8 = *(int *)(this + 0x88);
  uVar19 = (uint)local_8e[0];
  local_8e[1] = *(short *)(iVar7 + iVar14 * 2) - *(short *)(this + 0x2c);
  local_8e[2] = *(short *)(iVar7 + (iVar5 + iVar14) * 2) - *(short *)(this + 0x2c);
  pfVar18 = (float *)(*(int *)(this + 0x34) * uVar19 + iVar8);
  pfVar17 = (float *)((uint)local_8e[1] * *(int *)(this + 0x34) + iVar8);
  pfVar10 = (float *)((uint)local_8e[2] * *(int *)(this + 0x34) + iVar8);
  fVar21 = *pfVar17 - *pfVar18;
  fVar24 = *pfVar10 - *pfVar18;
  fVar23 = pfVar17[1] - pfVar18[1];
  fVar22 = pfVar10[1] - pfVar18[1];
  fVar26 = pfVar10[2] - pfVar18[2];
  fVar25 = pfVar17[2] - pfVar18[2];
  local_88 = fVar22 * fVar25 - fVar26 * fVar23;
  local_84 = fVar26 * fVar21 - fVar25 * fVar24;
  local_80 = fVar23 * fVar24 - fVar21 * fVar22;
  VectorNormalize((Vector *)&local_88);
  if ((*(float *)(pdVar6 + 0x18) - pfVar18[1]) * local_84 +
      (*(float *)(pdVar6 + 0x14) - *pfVar18) * local_88 +
      (*(float *)(pdVar6 + 0x1c) - pfVar18[2]) * local_80 < *(float *)(param_3 + 0x44)) {
    iVar5 = *(int *)(this + 0x34);
    iVar15 = 0;
    iVar7 = *(int *)(this + 0x88);
    iVar8 = *(int *)(this + 0xa4);
    iVar14 = *(int *)(this + 0x50);
    fVar21 = *(float *)(param_3 + 0x28);
    fVar22 = *(float *)(param_3 + 0x20);
    fVar23 = *(float *)(param_3 + 0x2c);
    fVar24 = *(float *)(param_3 + 0x24);
    fVar25 = *(float *)(param_3 + 0x30);
    iVar9 = *(int *)(param_3 + 0x14);
    fVar26 = *(float *)(param_3 + 0x34);
    pCVar11 = local_7c;
    while( true ) {
      iVar15 = iVar15 + 1;
      pfVar10 = (float *)(iVar5 * uVar19 + iVar7);
      pfVar17 = (float *)(uVar19 * iVar14 + iVar8);
      fVar1 = *pfVar10;
      *(float *)pCVar11 = fVar1;
      fVar2 = pfVar10[1];
      *(float *)(pCVar11 + 4) = fVar2;
      fVar3 = pfVar10[2];
      *(float *)(pCVar11 + 8) = fVar3;
      fVar4 = *pfVar17;
      *(float *)(pCVar11 + 0x1c) = pfVar17[1];
      *(float *)(pCVar11 + 0x18) = fVar4;
      fVar4 = *(float *)(iVar9 + 0x2c);
      *(float *)(pCVar11 + 0x14) =
           (fVar23 * fVar1 - *(float *)(iVar9 + 0x30)) + 0.5 + fVar25 * fVar2 + fVar26 * fVar3;
      *(float *)(pCVar11 + 0x10) = (fVar1 * fVar22 - fVar4) + 0.5 + fVar2 * fVar24 + fVar3 * fVar21;
      if (iVar15 == 3) break;
      uVar19 = (uint)local_8e[iVar15];
      pCVar11 = pCVar11 + 0x20;
    }
    puVar12 = (undefined4 *)
              R_DoDecalSHClip(local_7c,(CDecalVert *)0x0,pdVar6,3,(Vector *)&vec3_origin);
    uVar19 = (uint)*(ushort *)(pdVar6 + 0x4e);
    if (2 < uVar19) {
      if (6 < uVar19) {
        uVar19 = 6;
      }
      puVar13 = (undefined4 *)AllocateDispDecalFragment(this,param_2,uVar19);
      local_a0 = 0;
      puVar16 = puVar12 + 4;
      do {
        iVar5 = local_a0 + 1;
        local_a0 = local_a0 * 0x20;
        puVar20 = (undefined4 *)(puVar13[1] + local_a0);
        *puVar20 = *puVar12;
        puVar20[1] = puVar12[1];
        puVar20[2] = puVar12[2];
        iVar7 = puVar13[1];
        *(undefined4 *)(iVar7 + local_a0 + 0x10) = *puVar16;
        *(undefined4 *)(iVar7 + local_a0 + 0x14) = puVar16[1];
        iVar7 = puVar13[1];
        *(undefined4 *)(local_a0 + iVar7 + 0x18) = puVar12[6];
        *(undefined4 *)(local_a0 + iVar7 + 0x1c) = puVar12[7];
        puVar16 = puVar16 + 8;
        puVar12 = puVar12 + 8;
        local_a0 = iVar5;
      } while (iVar5 < (int)uVar19);
      *puVar13 = pdVar6;
      *(char *)(puVar13 + 2) = (char)uVar19;
      *(short *)(param_3 + 0xe) = *(short *)(param_3 + 0xe) + (short)uVar19;
      *(ushort *)(param_3 + 0x10) = *(short *)(param_3 + 0x10) + -2 + (ushort)*(byte *)(puVar13 + 2)
      ;
    }
  }
  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)