ClipPolyToPlane
0x00279e40 · 811 bytes · __cdecl
_Z15ClipPolyToPlaneP6VectoriS0_RKS_ff
Decompiled
undefined (6 params)
/* ClipPolyToPlane(Vector*, int, Vector*, Vector const&, float, float) */
int ClipPolyToPlane(Vector *param_1,int param_2,Vector *param_3,Vector *param_4,float param_5,
float param_6)
{
undefined4 *puVar1;
undefined4 *puVar2;
float fVar3;
float fVar4;
float fVar5;
undefined4 uVar6;
int iVar7;
int iVar8;
int iVar9;
Vector *pVVar10;
Vector *pVVar11;
int iVar12;
int iVar13;
int iVar14;
int in_GS_OFFSET;
float fVar15;
float fVar16;
Vector *apVStack_60 [7];
float local_44;
undefined4 *local_40;
int local_38 [3];
float local_2c [3];
int local_20;
local_38[2] = 0;
local_38[1] = 0;
local_38[0] = 0;
apVStack_60[4] = param_1;
apVStack_60[6] = param_4;
apVStack_60[5] = param_3;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
iVar9 = param_2 * 0x10 + 0x10;
iVar8 = -iVar9;
iVar9 = iVar9 * -2;
puVar1 = (undefined4 *)((int)apVStack_60 + iVar8 + 0x10);
puVar2 = (undefined4 *)((int)apVStack_60 + iVar9 + 0x10);
local_2c[0] = vec3_origin;
local_2c[1] = (float)DAT_004024cc;
local_2c[2] = (float)DAT_004024d0;
if (param_2 < 1) {
iVar13 = 0;
}
else {
fVar3 = *(float *)param_4;
fVar16 = -param_5;
fVar4 = *(float *)(param_4 + 4);
fVar5 = *(float *)(param_4 + 8);
iVar13 = 0;
pVVar10 = param_1;
do {
while( true ) {
fVar15 = ((*(float *)pVVar10 * fVar3 + *(float *)(pVVar10 + 4) * fVar4) - param_5) +
*(float *)(pVVar10 + 8) * fVar5;
puVar1[iVar13] = fVar15;
if (fVar15 <= param_6) break;
puVar2[iVar13] = 0;
iVar14 = 0;
LAB_00279f01:
local_38[iVar14] = local_38[iVar14] + 1;
iVar13 = iVar13 + 1;
pVVar10 = pVVar10 + 0xc;
if (iVar13 == param_2) goto LAB_00279f64;
}
if (-param_6 <= fVar15) {
puVar2[iVar13] = 2;
iVar14 = 2;
goto LAB_00279f01;
}
puVar2[iVar13] = 1;
iVar13 = iVar13 + 1;
local_38[1] = local_38[1] + 1;
pVVar10 = pVVar10 + 0xc;
} while (iVar13 != param_2);
LAB_00279f64:
uVar6 = *puVar2;
puVar1[param_2] = *puVar1;
puVar2[param_2] = uVar6;
iVar13 = 0;
local_44 = fVar16;
if (local_38[0] != 0) {
if (local_38[1] == 0) {
pVVar10 = param_1;
do {
pVVar11 = pVVar10 + 0xc;
*(undefined4 *)param_3 = *(undefined4 *)pVVar10;
*(undefined4 *)(param_3 + 4) = *(undefined4 *)(pVVar10 + 4);
*(undefined4 *)(param_3 + 8) = *(undefined4 *)(pVVar10 + 8);
iVar13 = param_2;
pVVar10 = pVVar11;
param_3 = param_3 + 0xc;
} while (pVVar11 != param_1 + param_2 * 0xc);
}
else {
iVar14 = 0;
fVar3 = 1.4013e-45;
pVVar10 = param_1;
do {
local_44 = fVar3;
iVar7 = *(int *)((int)apVStack_60 + (int)local_44 * 4 + iVar9 + 0xc);
if (iVar7 == 2) {
iVar13 = iVar14 + 1;
pVVar11 = param_3 + iVar14 * 0xc;
*(undefined4 *)pVVar11 = *(undefined4 *)pVVar10;
*(undefined4 *)(pVVar11 + 4) = *(undefined4 *)(pVVar10 + 4);
*(undefined4 *)(pVVar11 + 8) = *(undefined4 *)(pVVar10 + 8);
}
else {
iVar12 = iVar14;
if (iVar7 == 0) {
iVar12 = iVar14 + 1;
pVVar11 = param_3 + iVar14 * 0xc;
*(undefined4 *)pVVar11 = *(undefined4 *)pVVar10;
*(undefined4 *)(pVVar11 + 4) = *(undefined4 *)(pVVar10 + 4);
*(undefined4 *)(pVVar11 + 8) = *(undefined4 *)(pVVar10 + 8);
}
iVar13 = iVar12;
if ((puVar2[(int)local_44] != 2) && (iVar7 != puVar2[(int)local_44])) {
apVStack_60[3] = param_1 + ((int)local_44 % param_2) * 0xc;
fVar3 = *(float *)((int)apVStack_60 + (int)local_44 * 4 + iVar8 + 0xc);
fVar4 = (float)puVar1[(int)local_44];
iVar13 = 0;
do {
if (*(float *)(param_4 + iVar13 * 4) == 1.0) {
local_2c[iVar13] = param_5;
}
else if (*(float *)(param_4 + iVar13 * 4) == -1.0) {
local_2c[iVar13] = fVar16;
}
else {
local_2c[iVar13] =
(*(float *)(apVStack_60[3] + iVar13 * 4) - *(float *)(pVVar10 + iVar13 * 4))
* (fVar3 / (fVar3 - fVar4)) + *(float *)(pVVar10 + iVar13 * 4);
}
iVar13 = iVar13 + 1;
} while (iVar13 != 3);
iVar13 = iVar12 + 1;
pVVar11 = param_3 + iVar12 * 0xc;
*(float *)pVVar11 = local_2c[0];
*(float *)(pVVar11 + 4) = local_2c[1];
*(float *)(pVVar11 + 8) = local_2c[2];
}
}
pVVar10 = pVVar10 + 0xc;
iVar14 = iVar13;
fVar3 = (float)((int)local_44 + 1);
apVStack_60[2] = (Vector *)puVar1;
local_40 = puVar2;
} while ((int)local_44 < param_2);
}
}
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(code **)((int)apVStack_60 + iVar9) = ClipPolyToPlane_Precise;
__stack_chk_fail();
}
return iVar13;
}
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.