L L4D2node

CDispCollTree::AABBTree_TreeTrisRayBarycentricTest

0x000cb5f0 · 1169 bytes · __thiscall

_ZN13CDispCollTree35AABBTree_TreeTrisRayBarycentricTestERK5Ray_tRK6VectoriR15RayDispOutput_tPP12CDispCollTri

Decompiled

undefined (6 params)

/* CDispCollTree::AABBTree_TreeTrisRayBarycentricTest(Ray_t const&, Vector const&, int,
   RayDispOutput_t&, CDispCollTri**) */

void __thiscall
CDispCollTree::AABBTree_TreeTrisRayBarycentricTest
          (CDispCollTree *this,Ray_t *param_1,Vector *param_2,int param_3,RayDispOutput_t *param_4,
          CDispCollTri **param_5)

{
  short *psVar1;
  CDispCollTri *pCVar2;
  CDispCollTri *pCVar3;
  float fVar4;
  float fVar5;
  float fVar6;
  float fVar7;
  float fVar8;
  float fVar9;
  char cVar10;
  int iVar11;
  int iVar12;
  float *pfVar13;
  uint uVar14;
  int iVar15;
  int iVar16;
  float fVar17;
  undefined1 auVar18 [16];
  float fVar19;
  float fVar20;
  float fVar21;
  float fVar22;
  float fVar23;
  float fVar24;
  undefined1 auVar25 [16];
  float fVar26;
  float fVar27;
  float fVar28;
  float fVar29;
  undefined1 auVar30 [16];
  undefined1 auVar31 [16];
  undefined1 auVar32 [16];
  undefined1 auVar33 [16];
  undefined1 auVar34 [16];
  undefined1 auVar35 [16];
  undefined1 auVar36 [16];
  undefined1 auVar37 [16];
  float fVar38;
  float fVar39;
  float fVar40;
  float fVar41;
  float local_628;
  float local_624;
  float local_620 [37];
  int local_58c [351];
  
  iVar12 = 0;
  fVar4 = *(float *)param_2;
  fVar5 = *(float *)(param_2 + 4);
  fVar19 = *(float *)(param_1 + 0x30) + 0.03125;
  fVar6 = *(float *)(param_2 + 8);
  fVar7 = *(float *)param_1;
  fVar8 = *(float *)(param_1 + 4);
  fVar20 = *(float *)(param_1 + 0x34) + 0.03125;
  fVar9 = *(float *)(param_1 + 8);
  fVar17 = *(float *)(param_1 + 0x38) + 0.03125;
  iVar16 = 0;
  local_58c[0] = param_3;
  iVar15 = *(int *)(this + 0x98);
  while( true ) {
    if (iVar15 <= param_3) {
      if (iVar16 <= iVar12) {
        while( true ) {
          psVar1 = (short *)(*(int *)(this + 0xa0) + (param_3 - iVar15) * 4);
          pCVar2 = (CDispCollTri *)(*(int *)(this + 0x80) + psVar1[1] * 0x18);
          pCVar3 = (CDispCollTri *)(*(int *)(this + 0x80) + *psVar1 * 0x18);
          iVar15 = *(int *)(this + 0x70);
          cVar10 = ComputeIntersectionBarycentricCoordinates
                             (param_1,(Vector *)(iVar15 + (*(ushort *)pCVar3 & 0x1ff) * 0xc),
                              (Vector *)(iVar15 + (*(ushort *)(pCVar3 + 4) & 0x1ff) * 0xc),
                              (Vector *)(iVar15 + (*(ushort *)(pCVar3 + 2) & 0x1ff) * 0xc),
                              &local_628,&local_624,local_620);
          if ((((cVar10 != '\0') && (0.0 <= local_628)) && (0.0 <= local_624)) &&
             (((local_624 + local_628 <= 1.0 && (0.0 < local_620[0])) &&
              (local_620[0] < *(float *)(param_4 + 0x10))))) {
            *param_5 = pCVar3;
            *(float *)(param_4 + 8) = local_628;
            *(float *)(param_4 + 0xc) = local_624;
            *(float *)(param_4 + 0x10) = local_620[0];
          }
          iVar15 = *(int *)(this + 0x70);
          cVar10 = ComputeIntersectionBarycentricCoordinates
                             (param_1,(Vector *)(iVar15 + (*(ushort *)pCVar2 & 0x1ff) * 0xc),
                              (Vector *)(iVar15 + (*(ushort *)(pCVar2 + 4) & 0x1ff) * 0xc),
                              (Vector *)(iVar15 + (*(ushort *)(pCVar2 + 2) & 0x1ff) * 0xc),
                              &local_628,&local_624,local_620);
          if (((cVar10 != '\0') && (0.0 <= local_628)) &&
             ((0.0 <= local_624 &&
              (((local_624 + local_628 <= 1.0 && (0.0 < local_620[0])) &&
               (local_620[0] < *(float *)(param_4 + 0x10))))))) {
            *param_5 = pCVar2;
            *(float *)(param_4 + 8) = local_628;
            *(float *)(param_4 + 0xc) = local_624;
            *(float *)(param_4 + 0x10) = local_620[0];
          }
          iVar16 = iVar16 + 1;
          if (iVar12 < iVar16) break;
          param_3 = local_58c[iVar16];
          iVar15 = *(int *)(this + 0x98);
        }
      }
                    /* WARNING: Read-only address (ram,0x002cf7a0) is written */
                    /* WARNING: Read-only address (ram,0x002cf7b0) is written */
      return;
    }
    iVar16 = iVar16 + 1;
    pfVar13 = (float *)(param_3 * 0x60 + *(int *)(this + 0x90));
    fVar26 = ((pfVar13[4] - fVar8) - fVar20) * fVar5;
    fVar27 = ((pfVar13[5] - fVar8) - fVar20) * fVar5;
    fVar28 = ((pfVar13[6] - fVar8) - fVar20) * fVar5;
    fVar29 = ((pfVar13[7] - fVar8) - fVar20) * fVar5;
    fVar38 = ((*pfVar13 - fVar7) - fVar19) * fVar4;
    fVar39 = ((pfVar13[1] - fVar7) - fVar19) * fVar4;
    fVar40 = ((pfVar13[2] - fVar7) - fVar19) * fVar4;
    fVar41 = ((pfVar13[3] - fVar7) - fVar19) * fVar4;
    auVar33._0_4_ = ((pfVar13[0x10] - fVar8) + fVar20) * fVar5;
    auVar33._4_4_ = ((pfVar13[0x11] - fVar8) + fVar20) * fVar5;
    auVar33._8_4_ = ((pfVar13[0x12] - fVar8) + fVar20) * fVar5;
    auVar33._12_4_ = ((pfVar13[0x13] - fVar8) + fVar20) * fVar5;
    auVar37._0_4_ = ((pfVar13[0xc] - fVar7) + fVar19) * fVar4;
    auVar37._4_4_ = ((pfVar13[0xd] - fVar7) + fVar19) * fVar4;
    auVar37._8_4_ = ((pfVar13[0xe] - fVar7) + fVar19) * fVar4;
    auVar37._12_4_ = ((pfVar13[0xf] - fVar7) + fVar19) * fVar4;
    fVar21 = ((pfVar13[8] - fVar9) - fVar17) * fVar6;
    fVar22 = ((pfVar13[9] - fVar9) - fVar17) * fVar6;
    fVar23 = ((pfVar13[10] - fVar9) - fVar17) * fVar6;
    fVar24 = ((pfVar13[0xb] - fVar9) - fVar17) * fVar6;
    auVar34._4_4_ = fVar27;
    auVar34._0_4_ = fVar26;
    auVar34._8_4_ = fVar28;
    auVar34._12_4_ = fVar29;
    auVar18._0_4_ = ((pfVar13[0x14] - fVar9) + fVar17) * fVar6;
    auVar18._4_4_ = ((pfVar13[0x15] - fVar9) + fVar17) * fVar6;
    auVar18._8_4_ = ((pfVar13[0x16] - fVar9) + fVar17) * fVar6;
    auVar18._12_4_ = ((pfVar13[0x17] - fVar9) + fVar17) * fVar6;
    auVar31._4_4_ = fVar39;
    auVar31._0_4_ = fVar38;
    auVar31._8_4_ = fVar40;
    auVar31._12_4_ = fVar41;
    auVar35 = maxps(auVar34,auVar33);
    auVar32 = maxps(auVar31,auVar37);
    auVar25._4_4_ = fVar27;
    auVar25._0_4_ = fVar26;
    auVar25._8_4_ = fVar28;
    auVar25._12_4_ = fVar29;
    auVar25 = minps(auVar33,auVar25);
    auVar30._4_4_ = fVar39;
    auVar30._0_4_ = fVar38;
    auVar30._8_4_ = fVar40;
    auVar30._12_4_ = fVar41;
    auVar30 = minps(auVar37,auVar30);
    auVar36._4_4_ = fVar22;
    auVar36._0_4_ = fVar21;
    auVar36._8_4_ = fVar23;
    auVar36._12_4_ = fVar24;
    auVar37 = maxps(auVar36,auVar18);
    auVar33 = minps(auVar32,auVar35);
    auVar32._4_4_ = fVar22;
    auVar32._0_4_ = fVar21;
    auVar32._8_4_ = fVar23;
    auVar32._12_4_ = fVar24;
    auVar32 = minps(auVar18,auVar32);
    auVar25 = maxps(auVar30,auVar25);
    auVar30 = minps(auVar33,auVar37);
    auVar32 = maxps(auVar25,auVar32);
    auVar25 = minps(auVar30,Four_Ones);
    auVar32 = maxps(auVar32,Four_Zeros);
    auVar35._4_4_ = -(uint)(auVar32._4_4_ <= auVar25._4_4_);
    auVar35._0_4_ = -(uint)(auVar32._0_4_ <= auVar25._0_4_);
    auVar35._8_4_ = -(uint)(auVar32._8_4_ <= auVar25._8_4_);
    auVar35._12_4_ = -(uint)(auVar32._12_4_ <= auVar25._12_4_);
    uVar14 = movmskps(pfVar13,auVar35);
    if (uVar14 != 0) {
      iVar11 = param_3 * 4;
      if ((uVar14 & 1) != 0) {
        iVar12 = iVar12 + 1;
        local_58c[iVar12] = iVar11 + 1;
      }
      if ((uVar14 & 2) != 0) {
        iVar12 = iVar12 + 1;
        local_58c[iVar12] = iVar11 + 2;
      }
      if ((uVar14 & 4) != 0) {
        iVar12 = iVar12 + 1;
        local_58c[iVar12] = iVar11 + 3;
      }
      if ((uVar14 & 8) != 0) {
        iVar12 = iVar12 + 1;
        local_58c[iVar12] = iVar11 + 4;
      }
    }
    if (iVar12 < iVar16) break;
    param_3 = local_58c[iVar16];
  }
  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)