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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.