BlendCorners
0x000d24f0 · 1282 bytes · __regparm3
_ZL12BlendCornersPP13CCoreDispInfoi
Decompiled
undefined (2 params)
/* BlendCorners(CCoreDispInfo**, int) */
void __regparm3 BlendCorners(CCoreDispInfo **param_1,int param_2)
{
CCoreDispInfo CVar1;
short sVar2;
short sVar3;
CCoreDispInfo *pCVar4;
int iVar5;
CPowerInfo *pCVar6;
short *psVar7;
int iVar8;
int iVar9;
CCoreDispInfo *pCVar10;
int iVar11;
int iVar12;
CUtlMemory<int,int> *local_874;
int local_870;
int local_864;
float local_848;
float local_844;
float local_840;
float local_83c;
float local_838;
float local_834;
void *local_830;
int local_82c;
int local_828;
int local_824;
void *local_820;
uint local_81c [515];
local_830 = (void *)0x0;
local_82c = 0;
local_828 = 0;
local_820 = (void *)0x0;
if (0 < param_2) {
local_870 = 0;
do {
iVar12 = 0;
pCVar4 = param_1[local_870];
iVar9 = 0;
pCVar10 = pCVar4 + 0x160;
do {
CVar1 = pCVar10[8];
if (CVar1 != (CCoreDispInfo)0x0) {
iVar5 = 0;
do {
if (iVar9 < 0x200) {
local_81c[iVar9] = (uint)*(ushort *)(pCVar10 + iVar5);
iVar9 = iVar9 + 1;
}
iVar5 = iVar5 + 2;
} while (iVar5 != (uint)(byte)CVar1 * 2);
}
iVar12 = iVar12 + 1;
pCVar10 = pCVar10 + 10;
} while (iVar12 != 4);
iVar12 = 4;
pCVar10 = pCVar4 + 0x130;
do {
if (*(ushort *)pCVar10 == 0xffff) {
LAB_000d25fb:
if ((*(ushort *)(pCVar10 + 6) != 0xffff) && (iVar9 < 0x200)) {
local_81c[iVar9] = (uint)*(ushort *)(pCVar10 + 6);
iVar9 = iVar9 + 1;
}
}
else if (iVar9 < 0x200) {
local_81c[iVar9] = (uint)*(ushort *)pCVar10;
iVar9 = iVar9 + 1;
goto LAB_000d25fb;
}
pCVar10 = pCVar10 + 0xc;
iVar12 = iVar12 + -1;
} while (iVar12 != 0);
iVar12 = 0;
local_824 = 0;
if ((local_82c < iVar9) && (-1 < local_828)) {
local_82c = iVar9;
if (local_830 == (void *)0x0) {
local_830 = malloc(iVar9 << 2);
}
else {
local_830 = realloc(local_830,iVar9 << 2);
iVar12 = local_824;
}
}
local_820 = local_830;
if (iVar9 != 0) {
CUtlVector<int,CUtlMemory<int,int>>::GrowVector
((CUtlVector<int,CUtlMemory<int,int>> *)&local_830,iVar9);
iVar5 = (local_824 - iVar12) - iVar9;
if (0 < iVar5) {
_V_memmove((void *)((int)local_830 + (iVar12 + iVar9) * 4),
(void *)((int)local_830 + iVar12 * 4),iVar5 * 4);
}
}
local_864 = 0;
do {
/* try { // try from 000d269b to 000d298f has its CatchHandler @ 000d29f6 */
pCVar6 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar4)(pCVar4);
psVar7 = (short *)CPowerInfo::GetCornerPointIndex(pCVar6,local_864);
sVar2 = *psVar7;
sVar3 = psVar7[1];
iVar12 = (*(code *)**(undefined4 **)pCVar4)(pCVar4);
iVar12 = (int)sVar3 * *(int *)(iVar12 + 0x24) + (int)sVar2;
iVar11 = 0;
iVar5 = iVar12 * 0x90 + *(int *)(pCVar4 + 0x1b8);
local_848 = *(float *)(iVar5 + 0x40);
local_83c = *(float *)(iVar5 + 0x4c);
local_838 = *(float *)(iVar5 + 0x50);
local_844 = *(float *)(iVar5 + 0x44);
local_834 = *(float *)(iVar5 + 0x54);
local_840 = *(float *)(iVar5 + 0x48);
if (iVar9 != 0) {
do {
while( true ) {
pCVar10 = param_1[local_81c[iVar11]];
iVar8 = FindNeighborCornerVert(pCVar10,(Vector *)(iVar5 + 0x28));
if (iVar8 == -1) break;
pCVar6 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar10)(pCVar10);
psVar7 = (short *)CPowerInfo::GetCornerPointIndex(pCVar6,iVar8);
sVar2 = *psVar7;
sVar3 = psVar7[1];
iVar8 = (*(code *)**(undefined4 **)pCVar10)(pCVar10);
iVar8 = (int)sVar2 + (int)sVar3 * *(int *)(iVar8 + 0x24);
*(int *)((int)local_830 + iVar11 * 4) = iVar8;
iVar11 = iVar11 + 1;
iVar8 = iVar8 * 0x90 + *(int *)(pCVar10 + 0x1b8);
local_848 = local_848 + *(float *)(iVar8 + 0x40);
local_844 = local_844 + *(float *)(iVar8 + 0x44);
local_840 = local_840 + *(float *)(iVar8 + 0x48);
local_83c = local_83c + *(float *)(iVar8 + 0x4c);
local_838 = local_838 + *(float *)(iVar8 + 0x50);
local_834 = local_834 + *(float *)(iVar8 + 0x54);
if (iVar11 == iVar9) goto LAB_000d286b;
}
*(undefined4 *)((int)local_830 + iVar11 * 4) = 0xffffffff;
iVar11 = iVar11 + 1;
} while (iVar11 != iVar9);
}
LAB_000d286b:
VectorNormalize((Vector *)&local_848);
VectorNormalize((Vector *)&local_83c);
UpdateTangentSpace(pCVar4,iVar12,(Vector *)&local_848,(Vector *)&local_83c);
if (iVar9 != 0) {
iVar12 = 0;
do {
iVar5 = *(int *)((int)local_830 + iVar12 * 4);
if (iVar5 != -1) {
UpdateTangentSpace(param_1[local_81c[iVar12]],iVar5,(Vector *)&local_848,
(Vector *)&local_83c);
}
iVar12 = iVar12 + 1;
} while (iVar12 != iVar9);
}
local_864 = local_864 + 1;
} while (local_864 != 4);
local_870 = local_870 + 1;
} while (local_870 != param_2);
}
local_874 = (CUtlMemory<int,int> *)&local_830;
local_824 = 0;
CUtlMemory<int,int>::Purge(local_874);
local_820 = local_830;
CUtlMemory<int,int>::Purge(local_874);
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.