COcclusionSystem::AddPolygonToEdgeList
0x001cd570 · 742 bytes · __thiscall
_ZN16COcclusionSystem20AddPolygonToEdgeListER9CEdgeListPP6Vectoriib
Decompiled
undefined (6 params)
/* COcclusionSystem::AddPolygonToEdgeList(CEdgeList&, Vector**, int, int, bool) */
void __thiscall
COcclusionSystem::AddPolygonToEdgeList
(COcclusionSystem *this,CEdgeList *param_1,Vector **param_2,int param_3,int param_4,
bool param_5)
{
float *pfVar1;
int iVar2;
COcclusionSystem *pCVar3;
int iVar4;
int iVar5;
uint uVar6;
undefined4 *puVar7;
int iVar8;
float fVar9;
int in_GS_OFFSET;
float fVar10;
float fVar11;
float fVar12;
undefined3 in_stack_00000019;
int aiStack_80 [2];
float afStack_78 [2];
int aiStack_70 [4];
int local_60;
undefined4 local_5c;
CEdgeList *local_58;
float local_54;
COcclusionSystem *local_50;
int local_4c;
COcclusionSystem *local_48;
float local_44;
undefined4 *local_40;
float local_34 [5];
int local_20;
local_50 = this;
local_58 = param_1;
local_5c = _param_5;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
iVar4 = param_3 * 0x10 + 0x10;
iVar2 = iVar4 * -2;
local_40 = (undefined4 *)((int)&local_60 - iVar4);
local_4c = (int)&local_60 + iVar2;
local_60 = param_3 * 0xc;
iVar4 = -((param_3 * 0xc + 0xfU & 0xfffffff0) + 0x10);
local_54 = (float)((int)&local_60 + iVar4 + iVar2);
if (0 < param_3) {
local_44 = 0.0;
local_48 = this + 8;
iVar8 = 0;
fVar9 = local_54;
do {
*(float *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = fVar9;
*(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 8) = param_2[iVar8];
*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_48;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd61e;
Vector3DMultiplyPositionProjective
(*(VMatrix **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
fVar10 = local_44;
if (local_44 <= *(float *)((int)fVar9 + 8)) {
fVar10 = *(float *)((int)fVar9 + 8);
}
local_40[iVar8] = fVar9;
iVar8 = iVar8 + 1;
*(float *)((int)fVar9 + 8) = fVar10;
fVar9 = (float)((int)fVar9 + 0xc);
} while (iVar8 != param_3);
}
iVar8 = local_4c;
pfVar1 = local_34 + 2;
local_34[2] = 0.0;
*(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
local_34[4] = -1.0;
local_34[3] = -1.0;
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = iVar8;
s_nTempVertCount = 0;
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_3;
*(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_40;
*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_50;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd684;
iVar8 = ClipPolygonToAxisAlignedPlane
(*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
*(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
if (2 < iVar8) {
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = iVar8;
puVar7 = local_40;
iVar8 = local_4c;
*(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
local_34[3] = 1.0;
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 8) = iVar8;
pCVar3 = local_50;
*(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = puVar7;
*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = pCVar3;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd6d0;
iVar8 = ClipPolygonToAxisAlignedPlane
(*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
*(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
if (2 < iVar8) {
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = iVar8;
puVar7 = local_40;
iVar8 = local_4c;
*(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
local_34[2] = 1.4013e-45;
*(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 8) = puVar7;
pCVar3 = local_50;
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = iVar8;
*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = pCVar3;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd6fd;
iVar8 = ClipPolygonToAxisAlignedPlane
(*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
*(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
if (2 < iVar8) {
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = iVar8;
puVar7 = local_40;
iVar8 = local_4c;
*(float **)((int)aiStack_80 + iVar4 + iVar2 + 0x10) = pfVar1;
local_34[3] = -1.0;
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 8) = iVar8;
pCVar3 = local_50;
*(undefined4 **)((int)aiStack_80 + iVar4 + iVar2 + 0x14) = puVar7;
*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = pCVar3;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd72a;
iVar8 = ClipPolygonToAxisAlignedPlane
(*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc),
*(AxisAlignedPlane_t **)((int)aiStack_80 + iVar4 + iVar2 + 0x10),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 0x14));
if (2 < iVar8) {
fVar12 = 0.0;
local_44 = 0.0;
iVar5 = 1;
fVar9 = *(float *)*local_40;
fVar10 = ((float *)*local_40)[1];
do {
fVar11 = (fVar9 - *(float *)local_40[iVar5 + 1]) *
(((float *)local_40[iVar5])[1] - fVar10) +
(((float *)local_40[iVar5 + 1])[1] - fVar10) *
(*(float *)local_40[iVar5] - fVar9);
if (fVar11 < 0.0) {
fVar12 = fVar12 - fVar11;
}
iVar5 = iVar5 + 1;
} while (iVar5 != iVar8 + -1);
*(float *)(param_4 * 0x28 + *(int *)(local_58 + 0xa4) + 0x24) = fVar12;
if ((char)local_5c != '\0') {
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_3;
*(float *)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_54;
*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_50;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd85b;
StitchClippedVertices
(*(COcclusionSystem **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector **)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
}
local_40 = (undefined4 *)(param_3 + -1);
local_44 = (float)((int)local_54 + -0xc + local_60);
local_34[1] = local_44;
if (0 < param_3 + -1) {
puVar7 = (undefined4 *)0x0;
fVar9 = local_54;
do {
*(float **)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_34;
uVar6 = (uint)puVar7 & 1;
puVar7 = (undefined4 *)((int)puVar7 + 1);
local_34[uVar6] = fVar9;
fVar9 = (float)((int)fVar9 + 0xc);
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_4;
*(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_58;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd815;
CEdgeList::AddEdge(*(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
} while (puVar7 != local_40);
}
puVar7 = local_40;
*(float **)((int)aiStack_80 + iVar4 + iVar2 + 8) = local_34;
local_34[(uint)puVar7 & 1] = local_44;
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc) = param_4;
*(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4) = local_58;
*(undefined4 *)((int)aiStack_80 + iVar4 + iVar2) = 0x1cd83d;
CEdgeList::AddEdge(*(CEdgeList **)((int)aiStack_80 + iVar4 + iVar2 + 4),
*(Vector ***)((int)aiStack_80 + iVar4 + iVar2 + 8),
*(int *)((int)aiStack_80 + iVar4 + iVar2 + 0xc));
}
}
}
}
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
*(undefined **)((int)aiStack_80 + iVar4 + iVar2) = &UNK_001cd865;
__stack_chk_fail();
}
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.