RayHasFullyContainedIntersectionWithQuad
0x000ca640 · 2287 bytes · __cdecl
_Z40RayHasFullyContainedIntersectionWithQuadRK5Ray_tRK6VectorfS4_S4_fS4_f
Decompiled
undefined (8 params)
/* WARNING: Removing unreachable block (ram,0x000caac0) */
/* WARNING: Removing unreachable block (ram,0x000caaf3) */
/* WARNING: Removing unreachable block (ram,0x000caafd) */
/* WARNING: Removing unreachable block (ram,0x000cab3b) */
/* WARNING: Removing unreachable block (ram,0x000cacd0) */
/* WARNING: Removing unreachable block (ram,0x000cab51) */
/* WARNING: Removing unreachable block (ram,0x000cab5b) */
/* WARNING: Removing unreachable block (ram,0x000caae8) */
/* RayHasFullyContainedIntersectionWithQuad(Ray_t const&, Vector const&, float, Vector const&,
Vector const&, float, Vector const&, float) */
undefined4
RayHasFullyContainedIntersectionWithQuad
(Ray_t *param_1,Vector *param_2,float param_3,Vector *param_4,Vector *param_5,
float param_6,Vector *param_7,float param_8)
{
int iVar1;
bool bVar2;
float *pfVar3;
float *pfVar4;
int iVar5;
uint uVar6;
int iVar7;
uint uVar8;
float fVar9;
float fVar10;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
int local_308;
uint local_2e4;
float local_2d4 [16];
int local_294 [8];
int aiStack_274 [8];
float local_254 [48];
float local_194 [97];
if (param_1[0x44] == (Ray_t)0x0) {
pfVar4 = local_254;
uVar6 = 0;
local_254[0] = *(float *)param_1 - *(float *)(param_1 + 0x30);
local_254[3] = local_254[0];
local_254[1] = *(float *)(param_1 + 4) - *(float *)(param_1 + 0x34);
local_254[6] = local_254[0];
local_254[7] = *(float *)(param_1 + 0x34) + *(float *)(param_1 + 4);
local_254[9] = local_254[0];
local_254[2] = *(float *)(param_1 + 8) - *(float *)(param_1 + 0x38);
local_254[5] = *(float *)(param_1 + 0x38) + *(float *)(param_1 + 8);
local_254[0xc] = *(float *)param_1 + *(float *)(param_1 + 0x30);
local_254[10] = local_254[7];
local_254[8] = local_254[5];
local_254[0x11] = local_254[5];
local_254[0x13] = local_254[7];
local_254[0x14] = local_254[5];
local_254[0x16] = local_254[7];
local_254[4] = local_254[1];
local_254[0xb] = local_254[2];
local_254[0xd] = local_254[1];
local_254[0xe] = local_254[2];
local_254[0xf] = local_254[0xc];
local_254[0x10] = local_254[1];
local_254[0x12] = local_254[0xc];
local_254[0x15] = local_254[0xc];
local_254[0x17] = local_254[2];
local_2e4 = 0;
fVar9 = *(float *)param_2;
fVar12 = *(float *)(param_2 + 4);
fVar11 = *(float *)(param_2 + 8);
iVar5 = 0;
do {
while (fVar10 = ((*pfVar4 * fVar9 + pfVar4[1] * fVar12) - param_3) + pfVar4[2] * fVar11,
local_2d4[iVar5] = fVar10, fVar10 <= 0.0) {
local_294[iVar5] = 2;
iVar5 = iVar5 + 1;
uVar6 = uVar6 | 2;
pfVar4 = pfVar4 + 3;
if (iVar5 == 8) goto LAB_000ca8ee;
}
local_294[iVar5] = 1;
iVar5 = iVar5 + 1;
uVar6 = uVar6 | 1;
pfVar4 = pfVar4 + 3;
} while (iVar5 != 8);
LAB_000ca8ee:
if (param_1[0x45] != (Ray_t)0x0) {
fVar13 = *(float *)(param_1 + 0x14);
fVar10 = *(float *)(param_1 + 0x10);
fVar14 = *(float *)(param_1 + 0x18);
pfVar4 = local_254;
do {
pfVar3 = pfVar4 + 3;
pfVar4[0x19] = pfVar4[1] + fVar13;
pfVar4[0x1a] = pfVar4[2] + fVar14;
pfVar4[0x18] = *pfVar4 + fVar10;
pfVar4 = pfVar3;
} while (pfVar3 != local_254 + 0x18);
pfVar4 = local_254;
iVar5 = 0;
do {
while (fVar10 = ((pfVar4[0x18] * fVar9 + pfVar4[0x19] * fVar12) - param_3) +
pfVar4[0x1a] * fVar11, local_2d4[iVar5 + 8] = fVar10, fVar10 <= 0.0) {
aiStack_274[iVar5] = 2;
iVar5 = iVar5 + 1;
local_2e4 = local_2e4 | 2;
pfVar4 = pfVar4 + 3;
if (iVar5 == 8) goto LAB_000caa27;
}
aiStack_274[iVar5] = 1;
iVar5 = iVar5 + 1;
local_2e4 = local_2e4 | 1;
pfVar4 = pfVar4 + 3;
} while (iVar5 != 8);
LAB_000caa27:
uVar6 = local_2e4 | uVar6;
}
if (uVar6 != 3) {
return 0;
}
local_308 = 0;
bVar2 = false;
while (!bVar2) {
bVar2 = true;
}
if (param_1[0x45] != (Ray_t)0x0) {
iVar7 = 0;
iVar5 = local_308;
do {
iVar1 = local_294[iVar7];
local_308 = iVar5;
if (iVar1 != aiStack_274[iVar7]) {
uVar6 = (uint)(iVar1 == 1);
uVar8 = (uint)(iVar1 != 1);
fVar9 = local_254[iVar7 * 3 + uVar6 * 0x18 + 2];
fVar14 = 1.0 / (local_2d4[iVar7 + uVar8 * 8] - local_2d4[iVar7 + uVar6 * 8]);
local_308 = iVar5 + 1;
fVar13 = local_2d4[iVar7 + uVar8 * 8] * fVar14;
fVar14 = -local_2d4[iVar7 + uVar6 * 8] * fVar14;
fVar12 = local_254[iVar7 * 3 + uVar6 * 0x18];
fVar11 = local_254[uVar8 * 0x18 + iVar7 * 3 + 2];
fVar10 = local_254[uVar8 * 0x18 + iVar7 * 3];
local_194[iVar5 * 3 + 1] =
local_254[uVar8 * 0x18 + iVar7 * 3 + 1] * fVar14 +
local_254[iVar7 * 3 + uVar6 * 0x18 + 1] * fVar13;
local_194[iVar5 * 3 + 2] = fVar11 * fVar14 + fVar9 * fVar13;
local_194[iVar5 * 3] = fVar14 * fVar10 + fVar13 * fVar12;
}
iVar7 = iVar7 + 1;
iVar5 = local_308;
} while (iVar7 != 8);
}
if (local_308 == 0) {
return 1;
}
}
else {
if (param_1[0x45] == (Ray_t)0x0) {
if (1e-06 <= ABS((*(float *)(param_2 + 4) * *(float *)(param_1 + 4) +
*(float *)param_2 * *(float *)param_1 +
*(float *)(param_2 + 8) * *(float *)(param_1 + 8)) - param_3)) {
return 0;
}
local_194[0] = *(float *)param_1;
local_194[1] = *(float *)(param_1 + 4);
local_194[2] = *(float *)(param_1 + 8);
}
else {
local_254[0] = *(float *)param_1;
local_254[1] = *(float *)(param_1 + 4);
local_254[2] = *(float *)(param_1 + 8);
local_254[3] = *(float *)(param_1 + 0x10) + local_254[0];
local_254[4] = *(float *)(param_1 + 0x14) + local_254[1];
local_254[5] = *(float *)(param_1 + 0x18) + local_254[2];
fVar9 = (local_254[0] * *(float *)param_2 + local_254[1] * *(float *)(param_2 + 4) +
local_254[2] * *(float *)(param_2 + 8)) - param_3;
fVar12 = ((*(float *)(param_1 + 0x14) + local_254[1]) * *(float *)(param_2 + 4) +
(*(float *)(param_1 + 0x10) + local_254[0]) * *(float *)param_2 +
(*(float *)(param_1 + 0x18) + local_254[2]) * *(float *)(param_2 + 8)) - param_3;
if (fVar9 <= 0.0) {
if (fVar12 < 0.0) {
return 0;
}
iVar7 = 0;
iVar5 = 1;
fVar11 = fVar12;
}
else {
if (0.0 < fVar12) {
return 0;
}
iVar7 = 1;
iVar5 = 0;
fVar11 = fVar9;
fVar9 = fVar12;
}
fVar12 = 1.0 / (fVar11 - fVar9);
fVar9 = fVar9 * fVar12;
fVar12 = fVar12 * fVar11;
local_194[1] = local_254[iVar7 * 3 + 1] * fVar12 - local_254[iVar5 * 3 + 1] * fVar9;
local_194[2] = local_254[iVar7 * 3 + 2] * fVar12 - local_254[iVar5 * 3 + 2] * fVar9;
local_194[0] = fVar12 * local_254[iVar7 * 3] - fVar9 * local_254[iVar5 * 3];
}
local_308 = 1;
}
iVar5 = 0;
pfVar4 = local_194;
while( true ) {
if (param_6 < ABS(*(float *)(param_5 + 4) * (pfVar4[1] - *(float *)(param_4 + 4)) +
*(float *)param_5 * (*pfVar4 - *(float *)param_4) +
*(float *)(param_5 + 8) * (pfVar4[2] - *(float *)(param_4 + 8)))) {
return 0;
}
if (param_8 < ABS((pfVar4[1] - *(float *)(param_4 + 4)) * *(float *)(param_7 + 4) +
(*pfVar4 - *(float *)param_4) * *(float *)param_7 +
(pfVar4[2] - *(float *)(param_4 + 8)) * *(float *)(param_7 + 8))) break;
iVar5 = iVar5 + 1;
pfVar4 = pfVar4 + 3;
if (local_308 == iVar5) {
return 1;
}
}
return 0;
}
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.