CCoreDispInfo::SurfToBaseFacePlane
0x000c3450 · 741 bytes · __thiscall
_ZN13CCoreDispInfo19SurfToBaseFacePlaneERK6VectorRS0_
Decompiled
undefined (3 params)
/* CCoreDispInfo::SurfToBaseFacePlane(Vector const&, Vector&) */
undefined4 __thiscall
CCoreDispInfo::SurfToBaseFacePlane(CCoreDispInfo *this,Vector *param_1,Vector *param_2)
{
float fVar1;
uint uVar2;
uint uVar3;
CoreDispBBox_t *pCVar4;
int iVar5;
undefined4 uVar6;
int iVar7;
int *piVar8;
Vector *pVVar9;
Vector *pVVar10;
int *piVar11;
int iVar12;
CoreDispBBox_t *pCVar13;
float local_88;
float local_84;
float local_80;
int local_7c [6];
Vector local_64 [12];
Vector local_58 [12];
Vector local_4c [12];
float local_40;
float local_3c;
float local_38;
float local_34;
float local_30;
float local_2c;
float local_28;
float local_24;
float local_20;
Vector local_1c [12];
iVar12 = 1 << ((byte)*(undefined4 *)(this + 0xc) & 0x1f);
uVar2 = iVar12 * iVar12;
uVar3 = 0xffffffff;
if (uVar2 < 0x5500001) {
uVar3 = uVar2 * 0x18;
}
pCVar4 = operator_new__(uVar3);
CreateBoundingBoxes(this,pCVar4,uVar2);
if (0 < (int)uVar2) {
uVar3 = 0;
pCVar13 = pCVar4;
do {
if ((((pCVar13 != (CoreDispBBox_t *)0x0) &&
(fVar1 = *(float *)param_1, *(float *)pCVar13 <= fVar1)) &&
(fVar1 < *(float *)(pCVar13 + 0xc) || fVar1 == *(float *)(pCVar13 + 0xc))) &&
(((fVar1 = *(float *)(param_1 + 4), *(float *)(pCVar13 + 4) <= fVar1 &&
(fVar1 < *(float *)(pCVar13 + 0x10) || fVar1 == *(float *)(pCVar13 + 0x10))) &&
((fVar1 = *(float *)(param_1 + 8), *(float *)(pCVar13 + 8) <= fVar1 &&
(fVar1 < *(float *)(pCVar13 + 0x14) || fVar1 == *(float *)(pCVar13 + 0x14))))))) {
GetTriangleIndicesForDispBBox
(this,(int)uVar3 / (1 << ((byte)*(undefined4 *)(this + 0xc) & 0x1f)) + uVar3,
local_7c);
piVar11 = local_7c;
iVar12 = 0;
do {
iVar7 = *(int *)(this + 0x1b8);
piVar8 = piVar11;
pVVar10 = local_64;
do {
iVar5 = *piVar8;
pVVar9 = pVVar10 + 0xc;
piVar8 = piVar8 + 1;
iVar5 = iVar5 * 0x90 + iVar7;
*(undefined4 *)pVVar10 = *(undefined4 *)(iVar5 + 0x28);
*(undefined4 *)(pVVar10 + 4) = *(undefined4 *)(iVar5 + 0x2c);
*(undefined4 *)(pVVar10 + 8) = *(undefined4 *)(iVar5 + 0x30);
pVVar10 = pVVar9;
} while (pVVar9 != (Vector *)&local_40);
uVar6 = CalcBarycentricCooefs
(local_64,local_58,local_4c,param_1,&local_88,&local_84,&local_80);
if ((char)uVar6 != '\0') {
piVar11 = local_7c + iVar12 * 3;
iVar12 = *(int *)(this + 0x1b8);
do {
iVar7 = *piVar11;
pVVar10 = pVVar9 + 0xc;
piVar11 = piVar11 + 1;
iVar7 = iVar7 * 0x90 + iVar12;
*(undefined4 *)pVVar9 = *(undefined4 *)(iVar7 + 0x34);
*(undefined4 *)(pVVar9 + 4) = *(undefined4 *)(iVar7 + 0x38);
*(undefined4 *)(pVVar9 + 8) = *(undefined4 *)(iVar7 + 0x3c);
pVVar9 = pVVar10;
} while (pVVar10 != local_1c);
*(float *)(param_2 + 4) =
local_30 * local_84 + local_24 * local_80 + local_3c * local_88;
*(float *)(param_2 + 8) =
local_2c * local_84 + local_20 * local_80 + local_38 * local_88;
*(float *)param_2 = local_84 * local_34 + local_80 * local_28 + local_88 * local_40;
if (pCVar4 == (CoreDispBBox_t *)0x0) {
return uVar6;
}
operator_delete__(pCVar4);
return uVar6;
}
iVar12 = iVar12 + 1;
piVar11 = piVar11 + 3;
} while (iVar12 != 2);
}
uVar3 = uVar3 + 1;
pCVar13 = pCVar13 + 0x18;
} while (uVar3 != uVar2);
}
if (pCVar4 != (CoreDispBBox_t *)0x0) {
operator_delete__(pCVar4);
}
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.