SmoothDispSurfNormals
0x000d2a30 · 2217 bytes · __cdecl
_Z21SmoothDispSurfNormalsPP13CCoreDispInfoi
Decompiled
undefined (2 params)
/* SmoothDispSurfNormals(CCoreDispInfo**, int) */
void SmoothDispSurfNormals(CCoreDispInfo **param_1,int param_2)
{
CCoreDispInfo **ppCVar1;
int iVar2;
CCoreDispInfo *pCVar3;
CCoreDispInfo *pCVar4;
char cVar5;
ushort *puVar6;
int iVar7;
int iVar8;
int iVar9;
CPowerInfo *pCVar10;
float *pfVar11;
int iVar12;
Vector *pVVar13;
int iVar14;
int iVar15;
int iVar16;
float fVar17;
float fVar18;
CCoreDispInfo *pCVar19;
int local_ac;
int local_a8;
ushort *local_a4;
int local_a0;
int local_70;
int local_60 [2];
undefined4 local_58;
CVertIndex local_54 [4];
undefined4 local_50;
undefined4 local_4c;
float local_48;
float local_44;
float local_40;
float local_3c;
float local_38;
undefined4 local_34;
float local_30;
short local_2c;
short local_2a;
int local_24;
undefined4 local_20;
if (0 < param_2) {
iVar16 = 0;
do {
ppCVar1 = param_1 + iVar16;
iVar16 = iVar16 + 1;
CCoreDispInfo::SetDispUtilsHelperInfo(*ppCVar1,param_1,param_2);
} while (iVar16 != param_2);
local_70 = 0;
do {
iVar16 = 0;
pCVar3 = param_1[local_70];
if (pCVar3 != (CCoreDispInfo *)0x0) {
do {
puVar6 = (ushort *)(**(code **)(*(int *)pCVar3 + 4))(pCVar3,iVar16);
if (((puVar6 != (ushort *)0x0) && (*puVar6 != 0xffff)) && (puVar6[3] != 0xffff)) {
pCVar19 = pCVar3;
iVar7 = iVar16;
CDispUtilsHelper::GetEdgeMidPoint((int)local_60);
iVar2 = local_60[0];
iVar7 = (*(code *)**(undefined4 **)pCVar3)(pCVar3,pCVar19,iVar7);
iVar2 = (iVar2 >> 0x10) * *(int *)(iVar7 + 0x24) + (int)(short)iVar2;
iVar7 = iVar2 * 0x90;
pCVar19 = param_1[*puVar6];
pCVar4 = param_1[puVar6[3]];
pVVar13 = (Vector *)(iVar7 + *(int *)(pCVar3 + 0x1b8) + 0x28);
iVar8 = FindNeighborCornerVert(pCVar19,pVVar13);
iVar9 = FindNeighborCornerVert(pCVar4,pVVar13);
if ((iVar8 != -1) && (iVar9 != -1)) {
pCVar10 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar19)(pCVar19);
pfVar11 = (float *)CPowerInfo::GetCornerPointIndex(pCVar10,iVar8);
local_50 = *pfVar11;
pCVar10 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar4)(pCVar4);
pfVar11 = (float *)CPowerInfo::GetCornerPointIndex(pCVar10,iVar9);
local_4c = *pfVar11;
iVar8 = *(int *)(pCVar3 + 0x1b8);
local_44 = *(float *)(iVar8 + 0x40 + iVar7);
local_40 = *(float *)(iVar8 + 0x44 + iVar7);
iVar9 = (int)local_50._2_2_;
local_3c = *(float *)(iVar8 + 0x48 + iVar7);
iVar8 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
iVar14 = (int)local_4c._2_2_;
iVar8 = ((int)(short)local_50 + iVar9 * *(int *)(iVar8 + 0x24)) * 0x90 +
*(int *)(pCVar19 + 0x1b8);
local_44 = local_44 + *(float *)(iVar8 + 0x40);
local_40 = local_40 + *(float *)(iVar8 + 0x44);
local_3c = local_3c + *(float *)(iVar8 + 0x48);
iVar8 = (*(code *)**(undefined4 **)pCVar4)(pCVar4);
iVar8 = ((int)(short)local_4c + iVar14 * *(int *)(iVar8 + 0x24)) * 0x90 +
*(int *)(pCVar4 + 0x1b8);
local_44 = local_44 + *(float *)(iVar8 + 0x40);
local_40 = local_40 + *(float *)(iVar8 + 0x44);
local_3c = local_3c + *(float *)(iVar8 + 0x48);
VectorNormalize((Vector *)&local_44);
iVar8 = *(int *)(pCVar3 + 0x1b8);
local_38 = *(float *)(iVar8 + 0x4c + iVar7);
local_34 = *(float *)(iVar8 + 0x50 + iVar7);
local_30 = *(float *)(iVar8 + 0x54 + iVar7);
iVar8 = (int)local_50._2_2_;
iVar7 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
iVar9 = (int)local_4c._2_2_;
iVar7 = ((int)(short)local_50 + iVar8 * *(int *)(iVar7 + 0x24)) * 0x90 +
*(int *)(pCVar19 + 0x1b8);
local_38 = local_38 + *(float *)(iVar7 + 0x4c);
local_34 = local_34 + *(float *)(iVar7 + 0x50);
local_30 = local_30 + *(float *)(iVar7 + 0x54);
iVar7 = (*(code *)**(undefined4 **)pCVar4)(pCVar4);
iVar7 = ((int)(short)local_4c + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
*(int *)(pCVar4 + 0x1b8);
local_38 = local_38 + *(float *)(iVar7 + 0x4c);
local_34 = local_34 + *(float *)(iVar7 + 0x50);
local_30 = local_30 + *(float *)(iVar7 + 0x54);
VectorNormalize((Vector *)&local_38);
UpdateTangentSpace(pCVar3,iVar2,(Vector *)&local_44,(Vector *)&local_38);
UpdateTangentSpace(pCVar19,(CVertIndex *)&local_50,(Vector *)&local_44,
(Vector *)&local_38);
UpdateTangentSpace(pCVar4,(CVertIndex *)&local_4c,(Vector *)&local_44,
(Vector *)&local_38);
}
}
iVar16 = iVar16 + 1;
} while (iVar16 != 4);
}
local_70 = local_70 + 1;
} while (local_70 != param_2);
BlendCorners(param_1,param_2);
local_ac = 0;
do {
local_a8 = 0;
pCVar3 = param_1[local_ac];
if (pCVar3 != (CCoreDispInfo *)0x0) {
do {
local_a4 = (ushort *)(**(code **)(*(int *)pCVar3 + 4))(pCVar3,local_a8);
local_a0 = 0;
if (local_a4 != (ushort *)0x0) {
do {
if ((*local_a4 != 0xffff) &&
(pCVar19 = param_1[*local_a4], pCVar19 != (CCoreDispInfo *)0x0)) {
local_30 = (float)((uint)local_30 & 0xffff0000);
iVar16 = (&g_EdgeDims)[local_a8];
local_34 = (float)((uint)local_34 & 0xffff0000);
local_38 = 0.0;
local_24 = 0;
local_20 = 0;
CDispSubEdgeIterator::Start
((CDispSubEdgeIterator *)&local_38,(CDispUtilsHelper *)pCVar3,local_a8,
local_a0,true);
CDispSubEdgeIterator::Next((CDispSubEdgeIterator *)&local_38);
local_58 = local_34;
iVar2 = (short)iVar16 * 2;
iVar16 = (uint)(iVar16 == 0) * 2;
cVar5 = CDispSubEdgeIterator::Next((CDispSubEdgeIterator *)&local_38);
while (cVar5 != '\0') {
if ((int)*(short *)((int)&local_30 + (short)local_20 * 2) +
(int)*(short *)((int)&local_34 + (short)local_20 * 2) < local_24) {
iVar8 = (int)local_2a;
iVar7 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
iVar8 = ((int)local_2c + iVar8 * *(int *)(iVar7 + 0x24)) * 0x90 +
*(int *)(pCVar19 + 0x1b8);
iVar9 = (int)local_34._2_2_;
iVar7 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
iVar7 = ((int)(short)local_34 + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
*(int *)(pCVar3 + 0x1b8);
local_50 = *(float *)(iVar8 + 0x40) + *(float *)(iVar7 + 0x40);
local_4c = *(float *)(iVar8 + 0x44) + *(float *)(iVar7 + 0x44);
iVar9 = (int)local_2a;
local_48 = *(float *)(iVar8 + 0x48) + *(float *)(iVar7 + 0x48);
iVar7 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
iVar8 = ((int)local_2c + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
*(int *)(pCVar19 + 0x1b8);
iVar9 = (int)local_34._2_2_;
iVar7 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
iVar7 = ((int)(short)local_34 + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
*(int *)(pCVar3 + 0x1b8);
local_44 = *(float *)(iVar8 + 0x4c) + *(float *)(iVar7 + 0x4c);
local_40 = *(float *)(iVar8 + 0x50) + *(float *)(iVar7 + 0x50);
local_3c = *(float *)(iVar8 + 0x54) + *(float *)(iVar7 + 0x54);
VectorNormalize((Vector *)&local_50);
VectorNormalize((Vector *)&local_44);
UpdateTangentSpace(pCVar3,(CVertIndex *)&local_34,(Vector *)&local_50,
(Vector *)&local_44);
UpdateTangentSpace(pCVar19,(CVertIndex *)&local_2c,(Vector *)&local_50,
(Vector *)&local_44);
}
iVar8 = (int)*(short *)((int)&local_34 + iVar16);
iVar7 = *(short *)(local_54 + iVar16 + -4) + 1;
if (iVar7 < iVar8) {
fVar18 = (float)(int)*(short *)(local_54 + iVar16 + -4);
iVar9 = (int)local_58._2_2_;
iVar14 = (int)(short)local_58;
do {
if (fVar18 == (float)iVar8) {
fVar17 = (float)(-(uint)(fVar18 <= (float)iVar7) & 0x3f800000);
}
else {
fVar17 = ((float)iVar7 - fVar18) * (1.0 / ((float)iVar8 - fVar18));
}
iVar15 = (int)local_34._2_2_;
iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
iVar15 = (iVar15 * *(int *)(iVar12 + 0x24) + (int)(short)local_34) * 0x90 +
*(int *)(pCVar3 + 0x1b8);
iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
iVar12 = (iVar14 + iVar9 * *(int *)(iVar12 + 0x24)) * 0x90 +
*(int *)(pCVar3 + 0x1b8);
local_50 = (*(float *)(iVar15 + 0x40) - *(float *)(iVar12 + 0x40)) * fVar17 +
*(float *)(iVar12 + 0x40);
local_4c = (*(float *)(iVar15 + 0x44) - *(float *)(iVar12 + 0x44)) * fVar17 +
*(float *)(iVar12 + 0x44);
local_48 = (*(float *)(iVar15 + 0x48) - *(float *)(iVar12 + 0x48)) * fVar17 +
*(float *)(iVar12 + 0x48);
VectorNormalize((Vector *)&local_50);
iVar15 = (int)local_34._2_2_;
iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
iVar15 = (iVar15 * *(int *)(iVar12 + 0x24) + (int)(short)local_34) * 0x90 +
*(int *)(pCVar3 + 0x1b8);
iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
iVar12 = (iVar14 + iVar9 * *(int *)(iVar12 + 0x24)) * 0x90 +
*(int *)(pCVar3 + 0x1b8);
local_44 = (*(float *)(iVar15 + 0x4c) - *(float *)(iVar12 + 0x4c)) * fVar17 +
*(float *)(iVar12 + 0x4c);
local_40 = (*(float *)(iVar15 + 0x50) - *(float *)(iVar12 + 0x50)) * fVar17 +
*(float *)(iVar12 + 0x50);
local_3c = (*(float *)(iVar15 + 0x54) - *(float *)(iVar12 + 0x54)) * fVar17 +
*(float *)(iVar12 + 0x54);
VectorNormalize((Vector *)&local_44);
*(undefined2 *)(local_54 + iVar2) = *(undefined2 *)((int)&local_34 + iVar2);
*(short *)(local_54 + iVar16) = (short)iVar7;
iVar7 = iVar7 + 1;
UpdateTangentSpace(pCVar3,local_54,(Vector *)&local_50,(Vector *)&local_44);
} while (iVar7 < iVar8);
}
local_58 = local_34;
cVar5 = CDispSubEdgeIterator::Next((CDispSubEdgeIterator *)&local_38);
}
}
local_a0 = local_a0 + 1;
local_a4 = local_a4 + 3;
} while (local_a0 != 2);
}
local_a8 = local_a8 + 1;
} while (local_a8 != 4);
}
local_ac = local_ac + 1;
} while (local_ac != param_2);
return;
}
BlendCorners(param_1,param_2);
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.