L L4D2node

R_DoDecalSHClip

0x0012edb0 · 3011 bytes · __cdecl

_Z15R_DoDecalSHClipP10CDecalVertS0_P7decal_tiRK6Vector

Decompiled

undefined (5 params)

/* R_DoDecalSHClip(CDecalVert*, CDecalVert*, decal_t*, int, Vector const&) */

CDecalVert *
R_DoDecalSHClip(CDecalVert *param_1,CDecalVert *param_2,decal_t *param_3,int param_4,Vector *param_5
               )

{
  float fVar1;
  float fVar2;
  float fVar3;
  CDecalVert *pCVar4;
  char cVar5;
  CDecalVert *pCVar6;
  float *pfVar7;
  CDecalVert *pCVar8;
  CDecalVert *pCVar9;
  float *pfVar10;
  float *pfVar11;
  CDecalVert *pCVar12;
  int iVar13;
  float *pfVar14;
  CDecalVert *pCVar15;
  int iVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  int local_34;
  float local_2c;
  float local_28;
  float local_24;
  float local_20;
  
  pCVar12 = (CDecalVert *)&g_DecalClipVerts;
  if (param_2 != (CDecalVert *)0x0) {
    pCVar12 = param_2;
  }
  iVar13 = (param_4 + 0x7ffffff) * 0x20;
  if (0 < param_4) {
    local_34 = 0;
    pfVar14 = (float *)&g_DecalClipVerts2;
    pCVar8 = param_1 + 0x10;
    pCVar15 = param_1 + 0x18;
    pCVar4 = param_1;
    pCVar9 = param_1 + iVar13;
    while( true ) {
      pCVar6 = pCVar4;
      fVar17 = *(float *)(pCVar6 + 0x14);
      if (1.0 <= fVar17) {
        if (*(float *)(pCVar9 + 0x14) < 1.0) {
          local_34 = local_34 + 1;
          fVar17 = (1.0 - fVar17) / (*(float *)(pCVar9 + 0x14) - fVar17);
          *pfVar14 = (*(float *)pCVar9 - *(float *)pCVar6) * fVar17 + *(float *)pCVar6;
          pfVar14[1] = (*(float *)(pCVar9 + 4) - *(float *)(pCVar6 + 4)) * fVar17 +
                       *(float *)(pCVar6 + 4);
          pfVar14[2] = (*(float *)(pCVar9 + 8) - *(float *)(pCVar6 + 8)) * fVar17 +
                       *(float *)(pCVar6 + 8);
          pfVar14[6] = (*(float *)(pCVar9 + 0x18) - *(float *)(pCVar6 + 0x18)) * fVar17 +
                       *(float *)(pCVar6 + 0x18);
          pfVar14[7] = (*(float *)(pCVar9 + 0x1c) - *(float *)(pCVar6 + 0x1c)) * fVar17 +
                       *(float *)(pCVar6 + 0x1c);
          pfVar14[4] = (*(float *)(pCVar9 + 0x10) - *(float *)(pCVar6 + 0x10)) * fVar17 +
                       *(float *)(pCVar6 + 0x10);
          pfVar14[5] = (*(float *)(pCVar9 + 0x14) - *(float *)(pCVar6 + 0x14)) * fVar17 +
                       *(float *)(pCVar6 + 0x14);
          pfVar14 = pfVar14 + 8;
        }
      }
      else {
        fVar19 = *(float *)(pCVar9 + 0x14);
        if (fVar19 < 1.0) {
          local_34 = local_34 + 1;
          *pfVar14 = *(float *)pCVar6;
          pfVar14[1] = *(float *)(pCVar6 + 4);
          pfVar14[2] = *(float *)(pCVar6 + 8);
          pfVar14[3] = *(float *)(pCVar6 + 0xc);
          pfVar14[4] = *(float *)pCVar8;
          pfVar14[5] = *(float *)(pCVar8 + 4);
          pfVar14[6] = *(float *)pCVar15;
          pfVar14[7] = *(float *)(pCVar15 + 4);
          pfVar14 = pfVar14 + 8;
        }
        else {
          fVar17 = (1.0 - fVar19) / (fVar17 - fVar19);
          *pfVar14 = (*(float *)pCVar6 - *(float *)pCVar9) * fVar17 + *(float *)pCVar9;
          pfVar14[1] = (*(float *)(pCVar6 + 4) - *(float *)(pCVar9 + 4)) * fVar17 +
                       *(float *)(pCVar9 + 4);
          pfVar14[2] = (*(float *)(pCVar6 + 8) - *(float *)(pCVar9 + 8)) * fVar17 +
                       *(float *)(pCVar9 + 8);
          pfVar14[6] = (*(float *)(pCVar6 + 0x18) - *(float *)(pCVar9 + 0x18)) * fVar17 +
                       *(float *)(pCVar9 + 0x18);
          pfVar14[7] = (*(float *)(pCVar6 + 0x1c) - *(float *)(pCVar9 + 0x1c)) * fVar17 +
                       *(float *)(pCVar9 + 0x1c);
          pfVar14[4] = (*(float *)(pCVar6 + 0x10) - *(float *)(pCVar9 + 0x10)) * fVar17 +
                       *(float *)(pCVar9 + 0x10);
          pfVar14[5] = (*(float *)(pCVar6 + 0x14) - *(float *)(pCVar9 + 0x14)) * fVar17 +
                       *(float *)(pCVar9 + 0x14);
          pfVar14[8] = *(float *)pCVar6;
          pfVar14[9] = *(float *)(pCVar6 + 4);
          pfVar14[10] = *(float *)(pCVar6 + 8);
          pfVar14[0xb] = *(float *)(pCVar6 + 0xc);
          pfVar14[0xc] = *(float *)pCVar8;
          pfVar14[0xd] = *(float *)(pCVar8 + 4);
          pfVar14[0xe] = *(float *)pCVar15;
          local_34 = local_34 + 2;
          pfVar14[0xf] = *(float *)(pCVar15 + 4);
          pfVar14 = pfVar14 + 0x10;
        }
      }
      if (pCVar6 + 0x20 == param_1 + iVar13 + 0x20) break;
      pCVar8 = pCVar8 + 0x20;
      pCVar15 = pCVar15 + 0x20;
      pCVar4 = pCVar6 + 0x20;
      pCVar9 = pCVar6;
    }
    iVar13 = local_34 + 0x7ffffff;
    if (local_34 != 0) {
      iVar16 = 0;
      pfVar14 = (float *)&g_DecalClipVerts;
      pfVar11 = (float *)&g_DecalClipVerts2;
      pfVar10 = (float *)(&g_DecalClipVerts2 + iVar13 * 8);
      fVar17 = (float)(&DAT_0039ccf0)[iVar13 * 8];
      while( true ) {
        pfVar7 = pfVar11;
        fVar19 = pfVar7[4];
        if (0.0 < fVar19) {
          if (fVar17 <= 0.0) {
            fVar1 = *pfVar10;
            fVar2 = *pfVar7;
            pfVar14[0xc] = fVar19;
            iVar16 = iVar16 + 2;
            fVar18 = fVar17 / (fVar17 - fVar19);
            fVar20 = pfVar10[1];
            *pfVar14 = (fVar2 - fVar1) * fVar18 + fVar1;
            fVar1 = pfVar10[2];
            pfVar14[1] = (pfVar7[1] - fVar20) * fVar18 + fVar20;
            fVar2 = pfVar10[6];
            pfVar14[2] = (pfVar7[2] - fVar1) * fVar18 + fVar1;
            fVar1 = pfVar7[6];
            fVar20 = pfVar10[7];
            fVar3 = pfVar7[7];
            pfVar14[0xf] = fVar3;
            pfVar14[6] = (fVar1 - fVar2) * fVar18 + fVar2;
            fVar1 = pfVar7[5];
            pfVar14[0xd] = fVar1;
            pfVar14[7] = (fVar3 - fVar20) * fVar18 + fVar20;
            fVar2 = pfVar10[5];
            fVar20 = pfVar7[3];
            pfVar14[4] = (fVar19 - fVar17) * fVar18 + fVar17;
            pfVar14[0xb] = fVar20;
            pfVar14[8] = *pfVar7;
            fVar17 = pfVar7[1];
            pfVar14[5] = (fVar1 - fVar2) * fVar18 + fVar2;
            pfVar14[9] = fVar17;
            pfVar14[10] = pfVar7[2];
            pfVar14[0xe] = pfVar7[6];
            pfVar14 = pfVar14 + 0x10;
          }
          else {
            fVar17 = *pfVar7;
            pfVar14[4] = fVar19;
            iVar16 = iVar16 + 1;
            fVar1 = pfVar7[3];
            *pfVar14 = fVar17;
            pfVar14[1] = pfVar7[1];
            fVar17 = pfVar7[2];
            pfVar14[3] = fVar1;
            pfVar14[2] = fVar17;
            pfVar14[5] = pfVar7[5];
            pfVar14[6] = pfVar7[6];
            pfVar14[7] = pfVar7[7];
            pfVar14 = pfVar14 + 8;
          }
        }
        else if (0.0 < fVar17) {
          iVar16 = iVar16 + 1;
          fVar20 = fVar19 / (fVar19 - fVar17);
          fVar1 = pfVar7[1];
          *pfVar14 = (*pfVar10 - *pfVar7) * fVar20 + *pfVar7;
          fVar2 = pfVar10[1];
          pfVar14[4] = (fVar17 - fVar19) * fVar20 + fVar19;
          fVar17 = pfVar7[2];
          pfVar14[1] = (fVar2 - fVar1) * fVar20 + fVar1;
          fVar1 = pfVar7[6];
          pfVar14[2] = (pfVar10[2] - fVar17) * fVar20 + fVar17;
          fVar17 = pfVar7[7];
          pfVar14[6] = (pfVar10[6] - fVar1) * fVar20 + fVar1;
          fVar1 = pfVar7[5];
          pfVar14[7] = (pfVar10[7] - fVar17) * fVar20 + fVar17;
          pfVar14[5] = (pfVar10[5] - fVar1) * fVar20 + fVar1;
          pfVar14 = pfVar14 + 8;
        }
        if (pfVar7 + 8 == (float *)(&DAT_0039cd00 + iVar13 * 8)) break;
        pfVar11 = pfVar7 + 8;
        pfVar10 = pfVar7;
        fVar17 = fVar19;
      }
      iVar13 = iVar16 + 0x7ffffff;
      if (iVar16 != 0) {
        iVar16 = 0;
        pfVar14 = (float *)&g_DecalClipVerts2;
        pfVar11 = (float *)&g_DecalClipVerts;
        pfVar10 = (float *)(&g_DecalClipVerts + iVar13 * 8);
        fVar17 = (float)(&DAT_0039c6f0)[iVar13 * 8];
        while( true ) {
          pfVar7 = pfVar11;
          fVar19 = pfVar7[4];
          if (1.0 <= fVar19) {
            if (fVar17 < 1.0) {
              iVar16 = iVar16 + 1;
              fVar20 = (1.0 - fVar19) / (fVar17 - fVar19);
              fVar1 = pfVar7[1];
              *pfVar14 = (*pfVar10 - *pfVar7) * fVar20 + *pfVar7;
              fVar2 = pfVar10[1];
              pfVar14[4] = (fVar17 - fVar19) * fVar20 + fVar19;
              fVar17 = pfVar7[2];
              pfVar14[1] = (fVar2 - fVar1) * fVar20 + fVar1;
              fVar1 = pfVar7[6];
              pfVar14[2] = (pfVar10[2] - fVar17) * fVar20 + fVar17;
              fVar17 = pfVar7[7];
              pfVar14[6] = (pfVar10[6] - fVar1) * fVar20 + fVar1;
              fVar1 = pfVar7[5];
              pfVar14[7] = (pfVar10[7] - fVar17) * fVar20 + fVar17;
              pfVar14[5] = (pfVar10[5] - fVar1) * fVar20 + fVar1;
              pfVar14 = pfVar14 + 8;
            }
          }
          else if (fVar17 < 1.0) {
            fVar17 = *pfVar7;
            pfVar14[4] = fVar19;
            iVar16 = iVar16 + 1;
            fVar1 = pfVar7[3];
            *pfVar14 = fVar17;
            pfVar14[1] = pfVar7[1];
            fVar17 = pfVar7[2];
            pfVar14[3] = fVar1;
            pfVar14[2] = fVar17;
            pfVar14[5] = pfVar7[5];
            pfVar14[6] = pfVar7[6];
            pfVar14[7] = pfVar7[7];
            pfVar14 = pfVar14 + 8;
          }
          else {
            fVar1 = *pfVar10;
            fVar2 = *pfVar7;
            pfVar14[0xc] = fVar19;
            iVar16 = iVar16 + 2;
            fVar18 = (1.0 - fVar17) / (fVar19 - fVar17);
            fVar20 = pfVar10[1];
            fVar3 = pfVar10[5];
            *pfVar14 = (fVar2 - fVar1) * fVar18 + fVar1;
            fVar1 = pfVar7[1];
            pfVar14[4] = (fVar19 - fVar17) * fVar18 + fVar17;
            fVar17 = pfVar7[5];
            pfVar14[0xd] = fVar17;
            fVar2 = pfVar10[2];
            pfVar14[1] = (fVar1 - fVar20) * fVar18 + fVar20;
            fVar1 = pfVar10[6];
            pfVar14[2] = (pfVar7[2] - fVar2) * fVar18 + fVar2;
            fVar2 = pfVar7[6];
            fVar20 = pfVar7[7];
            pfVar14[0xf] = fVar20;
            pfVar14[6] = (fVar2 - fVar1) * fVar18 + fVar1;
            fVar1 = pfVar7[3];
            pfVar14[7] = (fVar20 - pfVar10[7]) * fVar18 + pfVar10[7];
            pfVar14[0xb] = fVar1;
            pfVar14[8] = *pfVar7;
            fVar1 = pfVar7[1];
            pfVar14[5] = (fVar17 - fVar3) * fVar18 + fVar3;
            pfVar14[9] = fVar1;
            pfVar14[10] = pfVar7[2];
            pfVar14[0xe] = pfVar7[6];
            pfVar14 = pfVar14 + 0x10;
          }
          if (pfVar7 + 8 == (float *)(&DAT_0039c700 + iVar13 * 8)) break;
          pfVar11 = pfVar7 + 8;
          pfVar10 = pfVar7;
          fVar17 = fVar19;
        }
        if (iVar16 != 0) {
          iVar13 = 0;
          pfVar14 = (float *)&g_DecalClipVerts2;
          pfVar11 = (float *)(&g_DecalClipVerts2 + (iVar16 + 0x7ffffff) * 8);
          pCVar8 = pCVar12;
          while( true ) {
            pfVar10 = pfVar14;
            fVar17 = pfVar10[5];
            fVar19 = pfVar11[5];
            if (0.0 < fVar17) {
              if (fVar19 <= 0.0) {
                iVar13 = iVar13 + 2;
                fVar19 = fVar19 / (fVar19 - fVar17);
                *(float *)pCVar8 = (*pfVar10 - *pfVar11) * fVar19 + *pfVar11;
                *(float *)(pCVar8 + 4) = (pfVar10[1] - pfVar11[1]) * fVar19 + pfVar11[1];
                *(float *)(pCVar8 + 8) = (pfVar10[2] - pfVar11[2]) * fVar19 + pfVar11[2];
                *(float *)(pCVar8 + 0x18) = (pfVar10[6] - pfVar11[6]) * fVar19 + pfVar11[6];
                *(float *)(pCVar8 + 0x1c) = (pfVar10[7] - pfVar11[7]) * fVar19 + pfVar11[7];
                *(float *)(pCVar8 + 0x10) = (pfVar10[4] - pfVar11[4]) * fVar19 + pfVar11[4];
                *(float *)(pCVar8 + 0x14) = (pfVar10[5] - pfVar11[5]) * fVar19 + pfVar11[5];
                *(float *)(pCVar8 + 0x20) = *pfVar10;
                *(float *)(pCVar8 + 0x24) = pfVar10[1];
                *(float *)(pCVar8 + 0x28) = pfVar10[2];
                *(float *)(pCVar8 + 0x2c) = pfVar10[3];
                *(float *)(pCVar8 + 0x30) = pfVar10[4];
                *(float *)(pCVar8 + 0x34) = pfVar10[5];
                *(float *)(pCVar8 + 0x38) = pfVar10[6];
                *(float *)(pCVar8 + 0x3c) = pfVar10[7];
                pCVar8 = pCVar8 + 0x40;
              }
              else {
                iVar13 = iVar13 + 1;
                *(float *)pCVar8 = *pfVar10;
                *(float *)(pCVar8 + 4) = pfVar10[1];
                *(float *)(pCVar8 + 8) = pfVar10[2];
                *(float *)(pCVar8 + 0xc) = pfVar10[3];
                *(float *)(pCVar8 + 0x10) = pfVar10[4];
                *(float *)(pCVar8 + 0x14) = pfVar10[5];
                *(float *)(pCVar8 + 0x18) = pfVar10[6];
                *(float *)(pCVar8 + 0x1c) = pfVar10[7];
                pCVar8 = pCVar8 + 0x20;
              }
            }
            else if (0.0 < fVar19) {
              iVar13 = iVar13 + 1;
              fVar17 = fVar17 / (fVar17 - fVar19);
              *(float *)pCVar8 = (*pfVar11 - *pfVar10) * fVar17 + *pfVar10;
              *(float *)(pCVar8 + 4) = (pfVar11[1] - pfVar10[1]) * fVar17 + pfVar10[1];
              *(float *)(pCVar8 + 8) = (pfVar11[2] - pfVar10[2]) * fVar17 + pfVar10[2];
              *(float *)(pCVar8 + 0x18) = (pfVar11[6] - pfVar10[6]) * fVar17 + pfVar10[6];
              *(float *)(pCVar8 + 0x1c) = (pfVar11[7] - pfVar10[7]) * fVar17 + pfVar10[7];
              *(float *)(pCVar8 + 0x10) = (pfVar11[4] - pfVar10[4]) * fVar17 + pfVar10[4];
              *(float *)(pCVar8 + 0x14) = (pfVar11[5] - pfVar10[5]) * fVar17 + pfVar10[5];
              pCVar8 = pCVar8 + 0x20;
            }
            if (pfVar10 + 8 == (float *)(&DAT_0039cd00 + (iVar16 + 0x7ffffff) * 8)) break;
            pfVar14 = pfVar10 + 8;
            pfVar11 = pfVar10;
          }
          *(short *)(param_3 + 0x4e) = (short)iVar13;
          if (iVar13 == 0) {
            return (CDecalVert *)0x0;
          }
          iVar16 = 0;
          pCVar8 = pCVar12;
          do {
            iVar16 = iVar16 + 1;
            *(float *)pCVar8 = *(float *)param_5 * 0.1 + *(float *)pCVar8;
            *(float *)(pCVar8 + 4) = *(float *)(param_5 + 4) * 0.1 + *(float *)(pCVar8 + 4);
            *(float *)(pCVar8 + 8) = *(float *)(param_5 + 8) * 0.1 + *(float *)(pCVar8 + 8);
            pCVar8 = pCVar8 + 0x20;
          } while (iVar16 < iVar13);
          cVar5 = (**(code **)(**(int **)(param_3 + 0xc) + 0x1c))(*(int **)(param_3 + 0xc));
          if (cVar5 != '\0') {
            (**(code **)(**(int **)(param_3 + 0xc) + 0x20))(*(int **)(param_3 + 0xc),&local_2c);
            (**(code **)(**(int **)(param_3 + 0xc) + 0x24))(*(int **)(param_3 + 0xc),&local_24);
            iVar16 = 0;
            pCVar8 = pCVar12;
            do {
              iVar16 = iVar16 + 1;
              *(float *)(pCVar8 + 0x10) = *(float *)(pCVar8 + 0x10) * local_24 + local_2c;
              *(float *)(pCVar8 + 0x14) = *(float *)(pCVar8 + 0x14) * local_20 + local_28;
              pCVar8 = pCVar8 + 0x20;
            } while (iVar16 < iVar13);
          }
          return pCVar12;
        }
      }
    }
  }
  *(undefined2 *)(param_3 + 0x4e) = 0;
  return (CDecalVert *)0x0;
}

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)