L L4D2node

CDispCollTree::AABBTree_IntersectAABB

0x000cc8c0 · 1636 bytes · __thiscall

_ZN13CDispCollTree22AABBTree_IntersectAABBERK6VectorS2_

Decompiled

undefined (3 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CDispCollTree::AABBTree_IntersectAABB(Vector const&, Vector const&) */

undefined4 __thiscall
CDispCollTree::AABBTree_IntersectAABB(CDispCollTree *this,Vector *param_1,Vector *param_2)

{
  short *psVar1;
  ushort *puVar2;
  ushort *puVar3;
  float fVar4;
  float fVar5;
  float fVar6;
  float fVar7;
  float fVar8;
  float fVar9;
  int iVar10;
  char cVar11;
  int iVar12;
  int iVar13;
  undefined4 uVar14;
  undefined1 (*pauVar15) [16];
  uint uVar16;
  int iVar17;
  int iVar18;
  undefined1 auVar19 [16];
  undefined1 auVar20 [16];
  undefined1 auVar21 [16];
  undefined1 auVar22 [16];
  undefined1 auVar23 [16];
  undefined1 auVar24 [16];
  undefined1 auVar25 [16];
  undefined4 local_5bc;
  undefined4 local_5b8;
  float local_5b4;
  float local_5b0;
  float local_5ac;
  float local_5a8;
  float local_5a4;
  float local_5a0;
  undefined4 local_59c;
  undefined4 local_598;
  int local_594;
  undefined4 local_590;
  undefined4 local_58c;
  undefined4 local_588;
  undefined4 local_584;
  byte local_580;
  byte local_57f;
  int local_57c [347];
  
  if ((*(uint *)(this + 0x2c) & 4) != 0) {
    return 0;
  }
  fVar4 = *(float *)param_2;
  local_57c[0] = 0;
  fVar5 = *(float *)(param_1 + 8);
  fVar6 = *(float *)param_1;
  fVar7 = *(float *)(param_2 + 4);
  fVar8 = *(float *)(param_1 + 4);
  fVar9 = *(float *)(param_2 + 8);
  local_5b4 = (fVar4 + fVar6) * 0.5;
  iVar12 = 0;
  iVar10 = *(int *)(this + 0x98);
  local_5b0 = (fVar7 + fVar8) * 0.5;
  local_5ac = (fVar5 + fVar9) * 0.5;
  local_5a8 = fVar4 - local_5b4;
  local_5a4 = fVar7 - local_5b0;
  local_5a0 = fVar9 - local_5ac;
  iVar17 = 0;
  iVar18 = 0;
  while (iVar13 = iVar18 + 1, iVar17 < iVar10) {
    auVar21._4_4_ = fVar5;
    auVar21._0_4_ = fVar5;
    auVar21._8_4_ = fVar5;
    auVar21._12_4_ = fVar5;
    auVar25._4_4_ = fVar4;
    auVar25._0_4_ = fVar4;
    auVar25._8_4_ = fVar4;
    auVar25._12_4_ = fVar4;
    pauVar15 = (undefined1 (*) [16])(iVar17 * 0x60 + *(int *)(this + 0x90));
    auVar24._4_4_ = fVar7;
    auVar24._0_4_ = fVar7;
    auVar24._8_4_ = fVar7;
    auVar24._12_4_ = fVar7;
    auVar23._4_4_ = fVar9;
    auVar23._0_4_ = fVar9;
    auVar23._8_4_ = fVar9;
    auVar23._12_4_ = fVar9;
    auVar21 = maxps(auVar21,pauVar15[2]);
    auVar25 = minps(auVar25,pauVar15[3]);
    auVar24 = minps(auVar24,pauVar15[4]);
    auVar23 = minps(auVar23,pauVar15[5]);
    auVar19._4_4_ = fVar6;
    auVar19._0_4_ = fVar6;
    auVar19._8_4_ = fVar6;
    auVar19._12_4_ = fVar6;
    auVar19 = maxps(*pauVar15,auVar19);
    auVar22._4_4_ = fVar8;
    auVar22._0_4_ = fVar8;
    auVar22._8_4_ = fVar8;
    auVar22._12_4_ = fVar8;
    auVar22 = maxps(pauVar15[1],auVar22);
    auVar20._0_4_ =
         -(uint)((auVar19._0_4_ <= auVar25._0_4_ && auVar22._0_4_ <= auVar24._0_4_) &&
                auVar21._0_4_ <= auVar23._0_4_);
    auVar20._4_4_ =
         -(uint)((auVar19._4_4_ <= auVar25._4_4_ && auVar22._4_4_ <= auVar24._4_4_) &&
                auVar21._4_4_ <= auVar23._4_4_);
    auVar20._8_4_ =
         -(uint)((auVar19._8_4_ <= auVar25._8_4_ && auVar22._8_4_ <= auVar24._8_4_) &&
                auVar21._8_4_ <= auVar23._8_4_);
    auVar20._12_4_ =
         -(uint)((auVar19._12_4_ <= auVar25._12_4_ && auVar22._12_4_ <= auVar24._12_4_) &&
                auVar21._12_4_ <= auVar23._12_4_);
    uVar16 = movmskps(pauVar15,auVar20);
    if (uVar16 != 0) {
      iVar17 = iVar17 * 4;
      if ((uVar16 & 1) != 0) {
        iVar12 = iVar12 + 1;
        local_57c[iVar12] = iVar17 + 1;
      }
      if ((uVar16 & 2) != 0) {
        iVar12 = iVar12 + 1;
        local_57c[iVar12] = iVar17 + 2;
      }
      if ((uVar16 & 4) != 0) {
        iVar12 = iVar12 + 1;
        local_57c[iVar12] = iVar17 + 3;
      }
      if ((uVar16 & 8) != 0) {
        iVar12 = iVar12 + 1;
        local_57c[iVar12] = iVar17 + 4;
      }
    }
    if (iVar12 < iVar13) {
      return 0;
    }
    iVar18 = iVar13;
    iVar17 = local_57c[iVar13];
  }
  local_5bc = 0;
  local_5b8 = 0;
  if (_exit == 0) {
    local_594 = 0;
  }
  else {
    (**(code **)(_exit + 0x50))
              (_exit,&local_5bc,0,0,0,0,"/data/src/engine/../public/dispcoll_common.cpp",0x334,
               &AABBTree_IntersectAABB(Vector_const&,Vector_const&)::tm_fmt,"(%s)%s","Unaccounted",
               "Tris");
    local_594 = _exit;
  }
  iVar10 = _DAT_0040b9d4;
  local_59c = local_5bc;
  local_598 = local_5b8;
                    /* try { // try from 000ccbd9 to 000ccc27 has its CatchHandler @ 000ccf3a */
  if (((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) &&
     (iVar13 = ThreadGetCurrentId(), iVar10 == iVar13)) {
    if ((char *)*_DAT_0040b030 != "Tris") {
      _DAT_0040b030 =
           (int *)CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2a2913,&DAT_00000001,0x2a054b);
    }
    CVProfNode::EnterScope();
    DAT_0040b02c = '\0';
  }
  while( true ) {
    psVar1 = (short *)(*(int *)(this + 0xa0) + (iVar17 - *(int *)(this + 0x98)) * 4);
    puVar2 = (ushort *)(*(int *)(this + 0x80) + *psVar1 * 0x18);
    local_590 = *(undefined4 *)(puVar2 + 4);
    puVar3 = (ushort *)(*(int *)(this + 0x80) + psVar1[1] * 0x18);
    local_58c = *(undefined4 *)(puVar2 + 6);
    local_588 = *(undefined4 *)(puVar2 + 8);
    local_584 = *(undefined4 *)(puVar2 + 10);
    local_57f = (byte)puVar2[3] & 7;
    local_580 = (byte)puVar2[3] >> 3 & 7;
    iVar10 = *(int *)(this + 0x70);
                    /* try { // try from 000ccd1a to 000ccddf has its CatchHandler @ 000ccf52 */
    cVar11 = IsBoxIntersectingTriangle
                       ((Vector *)&local_5b4,(Vector *)&local_5a8,
                        (Vector *)(iVar10 + (*puVar2 & 0x1ff) * 0xc),
                        (Vector *)(iVar10 + (puVar2[2] & 0x1ff) * 0xc),
                        (Vector *)(iVar10 + (puVar2[1] & 0x1ff) * 0xc),(cplane_t *)&local_590,0.0);
    if (cVar11 != '\0') break;
    local_590 = *(undefined4 *)(puVar3 + 4);
    local_58c = *(undefined4 *)(puVar3 + 6);
    local_588 = *(undefined4 *)(puVar3 + 8);
    local_584 = *(undefined4 *)(puVar3 + 10);
    local_57f = (byte)puVar3[3] & 7;
    local_580 = (byte)puVar3[3] >> 3 & 7;
    iVar10 = *(int *)(this + 0x70);
    uVar14 = IsBoxIntersectingTriangle
                       ((Vector *)&local_5b4,(Vector *)&local_5a8,
                        (Vector *)(iVar10 + (*puVar3 & 0x1ff) * 0xc),
                        (Vector *)(iVar10 + (puVar3[2] & 0x1ff) * 0xc),
                        (Vector *)(iVar10 + (puVar3[1] & 0x1ff) * 0xc),(cplane_t *)&local_590,0.0);
    iVar10 = _DAT_0040b9d4;
    if ((char)uVar14 != '\0') break;
    iVar18 = iVar18 + 1;
    if (iVar12 < iVar18) {
      if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
         (iVar17 = ThreadGetCurrentId(), iVar10 == iVar17)) {
        cVar11 = CVProfNode::ExitScope();
        if (cVar11 != '\0') {
          _DAT_0040b030 = (int *)_DAT_0040b030[0x19];
        }
        DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
      }
      if (local_594 != 0) {
        (**(code **)(local_594 + 0x54))(local_594,local_59c,local_598,0,0,0);
        return uVar14;
      }
      return uVar14;
    }
    iVar17 = local_57c[iVar18];
  }
  iVar10 = _DAT_0040b9d4;
  if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
     (iVar17 = ThreadGetCurrentId(), iVar10 == iVar17)) {
    cVar11 = CVProfNode::ExitScope();
    if (cVar11 != '\0') {
      _DAT_0040b030 = (int *)_DAT_0040b030[0x19];
    }
    DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
  }
  if (local_594 != 0) {
    (**(code **)(local_594 + 0x54))(local_594,local_59c,local_598,0,0,0);
  }
  return 1;
}

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)