COverlayMgr::DoClipFragment
0x001d2820 · 1196 bytes · __thiscall
_ZN11COverlayMgr14DoClipFragmentEP18moverlayfragment_tP8cplane_tPS1_S4_
Decompiled
undefined (5 params)
/* COverlayMgr::DoClipFragment(moverlayfragment_t*, cplane_t*, moverlayfragment_t**,
moverlayfragment_t**) */
void __thiscall
COverlayMgr::DoClipFragment
(COverlayMgr *this,moverlayfragment_t *param_1,cplane_t *param_2,
moverlayfragment_t **param_3,moverlayfragment_t **param_4)
{
float fVar1;
float fVar2;
float fVar3;
int iVar4;
int iVar5;
int iVar6;
bool bVar7;
float *pfVar8;
moverlayfragment_t *pmVar9;
moverlayfragment_t *pmVar10;
float *pfVar11;
float *pfVar12;
int iVar13;
moverlayfragment_t *pmVar14;
int iVar15;
float *pfVar16;
float fVar17;
float fVar18;
int local_45c [3];
float local_450;
float local_44c;
float local_448;
undefined4 local_444;
float local_440 [136];
int aiStack_220 [132];
if (param_1 == (moverlayfragment_t *)0x0) {
return;
}
local_45c[2] = 0;
local_45c[1] = 0;
local_45c[0] = 0;
iVar4 = *(int *)(param_1 + 0x1c);
if (0 < iVar4) {
fVar18 = *(float *)(param_2 + 0xc);
fVar1 = *(float *)param_2;
iVar15 = 0;
fVar2 = *(float *)(param_2 + 4);
fVar3 = *(float *)(param_2 + 8);
pfVar8 = *(float **)(param_1 + 0x10);
pfVar11 = pfVar8 + iVar4 * 0xd;
do {
fVar17 = ((*pfVar8 * fVar1 + pfVar8[1] * fVar2) - fVar18) + pfVar8[2] * fVar3;
*(float *)((int)local_440 + iVar15 + 0x24) = fVar17;
if (0.0001 < fVar17) {
*(undefined4 *)((int)aiStack_220 + iVar15 + 4) = 0;
iVar13 = 0;
}
else if (-0.0001 <= fVar17) {
*(undefined4 *)((int)aiStack_220 + iVar15 + 4) = 2;
iVar13 = 2;
}
else {
*(undefined4 *)((int)aiStack_220 + iVar15 + 4) = 1;
iVar13 = 1;
}
local_45c[iVar13] = local_45c[iVar13] + 1;
pfVar8 = pfVar8 + 0xd;
iVar15 = iVar15 + 4;
} while (pfVar8 != pfVar11);
local_440[iVar4 + 9] = local_440[9];
aiStack_220[iVar4 + 1] = aiStack_220[1];
if (local_45c[0] != 0) {
if (local_45c[1] == 0) {
pmVar9 = (moverlayfragment_t *)CopyTempFragment(this,param_1);
*param_3 = pmVar9;
return;
}
pmVar9 = (moverlayfragment_t *)CreateTempFragment(this,0);
pmVar10 = (moverlayfragment_t *)CreateTempFragment(this,0);
if ((pmVar10 == (moverlayfragment_t *)0x0) || (pmVar9 == (moverlayfragment_t *)0x0)) {
DestroyTempFragment(this,pmVar9);
DestroyTempFragment(this,pmVar10);
return;
}
iVar4 = *(int *)(param_1 + 0x1c);
if (0 < iVar4) {
iVar13 = 0;
iVar15 = 1;
do {
iVar5 = aiStack_220[iVar15];
if (iVar5 == 2) {
CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar9 + 0x10),
*(int *)(pmVar9 + 0x1c),(overlayvert_t *)(*(int *)(param_1 + 0x10) + iVar13))
;
CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar10 + 0x10),
*(int *)(pmVar10 + 0x1c),(overlayvert_t *)(*(int *)(param_1 + 0x10) + iVar13)
);
}
else {
if (iVar5 == 1) {
iVar6 = *(int *)(param_1 + 0x10);
pmVar14 = pmVar10;
LAB_001d2c11:
CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar14 + 0x10)
,*(int *)(pmVar14 + 0x1c),(overlayvert_t *)(iVar6 + iVar13));
}
else if (iVar5 == 0) {
iVar6 = *(int *)(param_1 + 0x10);
pmVar14 = pmVar9;
goto LAB_001d2c11;
}
if ((aiStack_220[iVar15 + 1] != 2) && (iVar5 != aiStack_220[iVar15 + 1])) {
local_444 = 0;
local_440[0] = 0.0;
local_440[1] = 0.0;
local_440[2] = 0.0;
local_440[3] = 0.0;
local_440[4] = 0.0;
local_440[5] = 0.0;
local_440[7] = 0.0;
local_440[6] = 0.0;
local_440[8] = -NAN;
fVar18 = local_440[iVar15 + 8] / (local_440[iVar15 + 8] - local_440[iVar15 + 9]);
pfVar8 = (float *)(*(int *)(param_1 + 0x10) + iVar13);
pfVar16 = (float *)(*(int *)(param_1 + 0x10) + (iVar15 % iVar4) * 0x34);
local_44c = (pfVar16[1] - pfVar8[1]) * fVar18 + pfVar8[1];
local_448 = (pfVar16[2] - pfVar8[2]) * fVar18 + pfVar8[2];
local_450 = (*pfVar16 - *pfVar8) * fVar18 + *pfVar8;
pfVar11 = &local_450;
pfVar8 = pfVar8 + 6;
pfVar16 = pfVar16 + 6;
do {
pfVar12 = pfVar11 + 2;
pfVar11[6] = (*pfVar16 - *pfVar8) * fVar18 + *pfVar8;
pfVar11[7] = (pfVar16[1] - pfVar8[1]) * fVar18 + pfVar8[1];
pfVar11 = pfVar12;
pfVar8 = pfVar8 + 2;
pfVar16 = pfVar16 + 2;
} while (pfVar12 != local_440);
CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar9 + 0x10),
*(int *)(pmVar9 + 0x1c),(overlayvert_t *)&local_450);
CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar10 + 0x10)
,*(int *)(pmVar10 + 0x1c),(overlayvert_t *)&local_450);
}
}
iVar13 = iVar13 + 0x34;
bVar7 = iVar15 < iVar4;
iVar15 = iVar15 + 1;
} while (bVar7);
}
*param_3 = pmVar9;
*param_4 = pmVar10;
return;
}
}
pmVar9 = (moverlayfragment_t *)CopyTempFragment(this,param_1);
*param_4 = pmVar9;
return;
}
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.