L L4D2node

IntersectRayWithOBB

0x000c7050 · 3025 bytes · __cdecl

_Z19IntersectRayWithOBBRK5Ray_tRK11matrix3x4_tRK6VectorS7_fP10CBaseTrace

Decompiled

undefined (6 params)

/* WARNING: Type propagation algorithm not settling */
/* IntersectRayWithOBB(Ray_t const&, matrix3x4_t const&, Vector const&, Vector const&, float,
   CBaseTrace*) */

CBaseTrace
IntersectRayWithOBB(Ray_t *param_1,matrix3x4_t *param_2,Vector *param_3,Vector *param_4,
                   float param_5,CBaseTrace *param_6)

{
  float fVar1;
  float fVar2;
  float fVar3;
  float fVar4;
  char cVar5;
  matrix3x4_t *pmVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  uint uVar12;
  float *pfVar13;
  float *pfVar14;
  int iVar15;
  matrix3x4_t *pmVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  float fVar21;
  float fVar22;
  float fVar23;
  float fVar24;
  float fVar25;
  float fVar26;
  float fVar27;
  matrix3x4_t *local_1f4;
  float *local_1dc;
  float *local_1d8;
  CBaseTrace local_1d1;
  float local_198;
  float local_194;
  float local_190;
  float local_18c;
  float local_188;
  float local_184;
  float local_180;
  float local_17c;
  float local_178;
  Vector local_174 [12];
  float local_168;
  float local_164;
  float local_160;
  float local_15c;
  float local_158;
  float local_154 [2];
  undefined1 local_14c;
  float local_148 [29];
  uint uStack_d4;
  float local_d0 [2];
  uint local_c8 [8];
  float local_a8;
  float local_a4 [37];
  
  if (param_1[0x44] == (Ray_t)0x0) {
    fVar21 = *(float *)(param_1 + 0x20) + *(float *)param_1;
    fVar18 = *(float *)(param_1 + 0x24) + *(float *)(param_1 + 4);
    fVar17 = *(float *)(param_1 + 0x28) + *(float *)(param_1 + 8);
    *(float *)(param_6 + 0xc) = fVar21;
    *(float *)(param_6 + 0x10) = fVar18;
    *(float *)(param_6 + 0x14) = fVar17;
    *(float *)param_6 = fVar21;
    *(float *)(param_6 + 4) = fVar18;
    *(float *)(param_6 + 8) = fVar17;
    *(float *)(param_6 + 0xc) = fVar21 + *(float *)(param_1 + 0x10);
    *(float *)(param_6 + 0x10) = fVar18 + *(float *)(param_1 + 0x14);
    fVar18 = *(float *)(param_1 + 0x18);
    param_6[0x37] = (CBaseTrace)0x0;
    param_6[0x36] = (CBaseTrace)0x0;
    *(undefined4 *)(param_6 + 0x2c) = 0x3f800000;
    *(float *)(param_6 + 0x14) = fVar17 + fVar18;
    *(undefined4 *)(param_6 + 0x30) = 0;
    fVar21 = (*(float *)param_4 - *(float *)param_3) * 0.5;
    local_198 = (*(float *)param_4 + *(float *)param_3) * 0.5 + *(float *)(param_2 + 0xc);
    fVar18 = (*(float *)(param_4 + 4) - *(float *)(param_3 + 4)) * 0.5;
    local_194 = (*(float *)(param_4 + 4) + *(float *)(param_3 + 4)) * 0.5 +
                *(float *)(param_2 + 0x1c);
    fVar17 = (*(float *)(param_4 + 8) - *(float *)(param_3 + 8)) * 0.5;
    local_190 = (*(float *)(param_4 + 8) + *(float *)(param_3 + 8)) * 0.5 +
                *(float *)(param_2 + 0x2c);
    cVar5 = IsRayIntersectingSphere
                      ((Vector *)param_1,(Vector *)(param_1 + 0x10),(Vector *)&local_198,
                       SQRT(*(float *)(param_1 + 0x38) * *(float *)(param_1 + 0x38) +
                            *(float *)(param_1 + 0x34) * *(float *)(param_1 + 0x34) +
                            *(float *)(param_1 + 0x30) * *(float *)(param_1 + 0x30)) +
                       SQRT(fVar18 * fVar18 + fVar21 * fVar21 + fVar17 * fVar17),param_5);
    local_1d1 = (CBaseTrace)0x0;
    if (cVar5 != '\0') {
      VectorITransform((float *)param_1,param_2,&local_18c);
      VectorIRotate((float *)(param_1 + 0x10),param_2,&local_180);
      fVar18 = *(float *)(param_1 + 0x30);
      fVar17 = *(float *)(param_1 + 0x34);
      local_1d8 = &local_a8;
      local_1dc = local_a4;
      fVar21 = *(float *)(param_1 + 0x38);
      fVar27 = *(float *)param_4;
      fVar20 = *(float *)param_3;
      fVar26 = *(float *)(param_4 + 4);
      fVar24 = *(float *)(param_3 + 4);
      fVar1 = *(float *)(param_4 + 8);
      pfVar13 = local_d0;
      fVar2 = *(float *)(param_3 + 8);
      iVar8 = 0;
      pmVar6 = param_2;
      pfVar14 = local_148;
      local_1f4 = param_2 + 0x10;
      while( true ) {
        *pfVar13 = 0.0;
        pfVar13[1] = 0.0;
        pfVar13[2] = 0.0;
        local_d0[iVar8] = 1.0;
        fVar23 = *(float *)(pmVar6 + 8);
        fVar19 = ABS(fVar17 * *(float *)(param_2 + 0x10 + iVar8)) +
                 ABS(fVar18 * *(float *)(param_2 + iVar8)) +
                 ABS(fVar21 * *(float *)(param_2 + iVar8 + 0x20));
        fVar3 = *(float *)(param_4 + iVar8);
        *pfVar14 = *(float *)(param_3 + iVar8) - fVar19;
        fVar22 = *(float *)(pmVar6 + 4);
        pfVar14[1] = fVar19 + fVar3;
        fVar3 = *(float *)pmVar6;
        pfVar13[9] = fVar3;
        *local_1d8 = fVar22;
        *local_1dc = fVar23;
        uVar10 = (uint)(0.0 < fVar3);
        pfVar14[uVar10 + 6] = fVar27 * fVar3;
        pfVar14[-uVar10 + 7] = fVar20 * fVar3;
        uVar11 = (uint)(0.0 < fVar22);
        fVar19 = pfVar14[uVar11 + 6];
        pfVar13[0x12] = 0.0;
        pfVar14[uVar11 + 6] = fVar19 + fVar26 * fVar22;
        pfVar14[-uVar11 + 7] = fVar24 * fVar22 + pfVar14[-uVar11 + 7];
        uVar12 = (uint)(0.0 < fVar23);
        pfVar14[uVar12 + 6] = pfVar14[uVar12 + 6] + fVar1 * fVar23;
        fVar19 = *(float *)(param_1 + iVar8 + 0x30);
        pfVar14[-uVar12 + 7] = pfVar14[-uVar12 + 7] + fVar2 * fVar23;
        iVar15 = *(int *)((int)&s_ExtIndices + iVar8 * 2);
        pfVar14[6] = pfVar14[6] - fVar19;
        pfVar14[7] = fVar19 + pfVar14[7];
        fVar19 = *(float *)(param_1 + iVar15 * 4 + 0x30);
        fVar25 = -fVar23;
        iVar15 = *(int *)((int)&DAT_002a285c + iVar8 * 2);
        pfVar13[0x13] = fVar25;
        fVar4 = *(float *)(param_1 + iVar15 * 4 + 0x30);
        pmVar6 = param_2 + *(int *)((int)&s_MatIndices + iVar8 * 2) * 0x10;
        pmVar16 = param_2 + *(int *)((int)&DAT_002a2844 + iVar8 * 2) * 0x10;
        pfVar13[0x14] = fVar22;
        pfVar13[0x1b] = fVar23;
        pfVar13[0x1c] = 0.0;
        pfVar14[(0.0 < fVar25) + 0xc] = fVar26 * fVar25;
        pfVar14[0xd - (uint)(0.0 < fVar25)] = fVar25 * fVar24;
        pfVar14[uVar11 + 0xc] = fVar1 * fVar22 + pfVar14[uVar11 + 0xc];
        pfVar14[-uVar11 + 0xd] = fVar2 * fVar22 + pfVar14[-uVar11 + 0xd];
        fVar25 = ABS(*(float *)pmVar16) * fVar4 + ABS(*(float *)pmVar6) * fVar19;
        pfVar14[0xc] = pfVar14[0xc] - fVar25;
        pfVar14[0xd] = fVar25 + pfVar14[0xd];
        fVar25 = -fVar3;
        pfVar13[0x1d] = fVar25;
        pfVar14[uVar12 + 0x12] = fVar27 * fVar23;
        pfVar14[-uVar12 + 0x13] = fVar23 * fVar20;
        pfVar14[(0.0 < fVar25) + 0x12] = fVar1 * fVar25 + pfVar14[(0.0 < fVar25) + 0x12];
        fVar22 = -fVar22;
        pfVar13[0x24] = fVar22;
        pfVar13[0x25] = fVar3;
        pfVar13[0x26] = 0.0;
        pfVar14[0x13 - (uint)(0.0 < fVar25)] = fVar25 * fVar2 + pfVar14[0x13 - (uint)(0.0 < fVar25)]
        ;
        iVar8 = iVar8 + 4;
        pfVar13 = pfVar13 + 3;
        fVar23 = ABS(*(float *)(pmVar16 + 4)) * fVar4 + ABS(*(float *)(pmVar6 + 4)) * fVar19;
        pfVar14[0x12] = pfVar14[0x12] - fVar23;
        pfVar14[0x13] = fVar23 + pfVar14[0x13];
        pfVar14[(0.0 < fVar22) + 0x18] = fVar27 * fVar22;
        pfVar14[0x19 - (uint)(0.0 < fVar22)] = fVar22 * fVar20;
        pfVar14[uVar10 + 0x18] = fVar26 * fVar3 + pfVar14[uVar10 + 0x18];
        pfVar14[-uVar10 + 0x19] = fVar3 * fVar24 + pfVar14[-uVar10 + 0x19];
        fVar23 = fVar4 * ABS(*(float *)(pmVar16 + 8)) + fVar19 * ABS(*(float *)(pmVar6 + 8));
        pfVar14[0x18] = pfVar14[0x18] - fVar23;
        pfVar14[0x19] = fVar23 + pfVar14[0x19];
        local_1d8 = local_1d8 + 3;
        local_1dc = local_1dc + 3;
        if (iVar8 == 0xc) break;
        pmVar6 = local_1f4;
        pfVar14 = pfVar14 + 2;
        local_1f4 = local_1f4 + 0x10;
      }
      pfVar13 = local_d0;
      iVar7 = 0;
      iVar8 = -1;
      fVar17 = -1.0;
      param_6[0x37] = (CBaseTrace)0x1;
      fVar18 = 1.0;
      iVar15 = -1;
LAB_000c7898:
      iVar9 = 0;
      fVar20 = local_188 * pfVar13[1] + local_18c * *pfVar13 + local_184 * pfVar13[2];
      fVar26 = pfVar13[1] * (local_188 + local_17c) + *pfVar13 * (local_18c + local_180) +
               pfVar13[2] * (local_184 + local_178);
      fVar27 = local_148[iVar7 * 2] - fVar20;
      fVar21 = local_148[iVar7 * 2] - fVar26;
      fVar20 = fVar20 - local_148[iVar7 * 2 + 1];
      fVar26 = fVar26 - local_148[iVar7 * 2 + 1];
      if (fVar27 <= 0.0) goto LAB_000c799f;
LAB_000c793e:
      if (fVar21 <= 0.0) {
        param_6[0x37] = (CBaseTrace)0x0;
        do {
          fVar24 = 1.0 / (fVar27 - fVar21);
          if (fVar27 <= fVar21) {
            fVar24 = (fVar27 + param_5) * fVar24;
            if (fVar24 <= fVar18) {
              fVar18 = fVar24;
            }
          }
          else {
            fVar27 = fVar27 - param_5;
            if (fVar27 <= 0.0) {
              fVar27 = 0.0;
            }
            fVar27 = fVar27 * fVar24;
            if (fVar17 < fVar27) {
              iVar8 = iVar7;
              iVar15 = iVar9;
              fVar17 = fVar27;
            }
          }
          do {
            if (iVar9 == 1) {
              iVar7 = iVar7 + 1;
              pfVar13 = pfVar13 + 3;
              if (iVar7 == 0xf) {
                if (fVar17 < fVar18 && 0.0 <= fVar17) {
                  *(float *)(param_6 + 0x2c) = fVar17;
                  *(float *)(param_6 + 0xc) =
                       *(float *)(param_1 + 0x10) * fVar17 + *(float *)param_6;
                  *(float *)(param_6 + 0x10) =
                       *(float *)(param_1 + 0x14) * fVar17 + *(float *)(param_6 + 4);
                  local_154[1] = local_148[iVar8 * 2 + iVar15];
                  fVar21 = *(float *)(param_1 + 0x18);
                  *(undefined4 *)(param_6 + 0x30) = 1;
                  local_15c = local_d0[iVar8 * 3];
                  local_158 = local_d0[iVar8 * 3 + 1];
                  local_154[0] = (float)local_c8[iVar8 * 3];
                  *(float *)(param_6 + 0x14) = fVar17 * fVar21 + *(float *)(param_6 + 8);
                  if (iVar15 == 0) {
                    local_15c = -local_15c;
                    local_158 = -local_158;
                    local_154[0] = (float)((uint)local_154[0] ^ 0x80000000);
                    local_154[1] = -local_154[1];
                  }
                  local_14c = 3;
                  MatrixGetColumn(param_2,3,local_174);
                  VectorIRotate((float *)local_174,param_2,&local_168);
                  VectorIRotate(&local_15c,param_2,(float *)(param_6 + 0x18));
                  fVar21 = *(float *)(param_6 + 0x18);
                  fVar27 = *(float *)(param_6 + 0x1c);
                  fVar20 = *(float *)(param_6 + 0x20);
                  *(float *)(param_6 + 0x24) =
                       (fVar27 * fVar27 + fVar21 * fVar21 + fVar20 * fVar20) * local_154[1] -
                       (fVar20 * local_160 + fVar27 * local_164 + fVar21 * local_168);
                  return (CBaseTrace)(fVar17 < fVar18 && 0.0 <= fVar17);
                }
                if (param_6[0x37] == (CBaseTrace)0x0) {
                  return (CBaseTrace)0x0;
                }
                *(undefined4 *)(param_6 + 0x2c) = 0;
                *(undefined4 *)(param_6 + 0x30) = 1;
                *(undefined4 *)(param_6 + 0x18) = 0x3f800000;
                *(undefined4 *)(param_6 + 0x10) = *(undefined4 *)(param_6 + 4);
                *(undefined4 *)(param_6 + 0x1c) = 0;
                *(undefined4 *)(param_6 + 0x20) = 0;
                *(undefined4 *)(param_6 + 0xc) = *(undefined4 *)param_6;
                *(undefined4 *)(param_6 + 0x14) = *(undefined4 *)(param_6 + 8);
                param_6[0x36] = (CBaseTrace)(1.0 <= fVar18 || fVar18 <= 0.0);
                *(undefined4 *)(param_6 + 0x24) = *(undefined4 *)param_6;
                param_6[0x28] = (CBaseTrace)0x0;
                return param_6[0x37];
              }
              goto LAB_000c7898;
            }
            iVar9 = 1;
            fVar21 = fVar26;
            fVar27 = fVar20;
            if (0.0 < fVar20) goto LAB_000c793e;
LAB_000c799f:
          } while (fVar21 <= 0.0);
        } while( true );
      }
    }
  }
  else {
    local_1d1 = (CBaseTrace)
                IntersectRayWithOBB((Vector *)param_1,(Vector *)(param_1 + 0x10),param_2,param_3,
                                    param_4,param_5,param_6);
  }
  return local_1d1;
}

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)