R_DoDecalSHClip
0x0012edb0 · 3011 bytes · __cdecl
_Z15R_DoDecalSHClipP10CDecalVertS0_P7decal_tiRK6Vector
Decompiled
undefined (5 params)
/* R_DoDecalSHClip(CDecalVert*, CDecalVert*, decal_t*, int, Vector const&) */
CDecalVert *
R_DoDecalSHClip(CDecalVert *param_1,CDecalVert *param_2,decal_t *param_3,int param_4,Vector *param_5
)
{
float fVar1;
float fVar2;
float fVar3;
CDecalVert *pCVar4;
char cVar5;
CDecalVert *pCVar6;
float *pfVar7;
CDecalVert *pCVar8;
CDecalVert *pCVar9;
float *pfVar10;
float *pfVar11;
CDecalVert *pCVar12;
int iVar13;
float *pfVar14;
CDecalVert *pCVar15;
int iVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
int local_34;
float local_2c;
float local_28;
float local_24;
float local_20;
pCVar12 = (CDecalVert *)&g_DecalClipVerts;
if (param_2 != (CDecalVert *)0x0) {
pCVar12 = param_2;
}
iVar13 = (param_4 + 0x7ffffff) * 0x20;
if (0 < param_4) {
local_34 = 0;
pfVar14 = (float *)&g_DecalClipVerts2;
pCVar8 = param_1 + 0x10;
pCVar15 = param_1 + 0x18;
pCVar4 = param_1;
pCVar9 = param_1 + iVar13;
while( true ) {
pCVar6 = pCVar4;
fVar17 = *(float *)(pCVar6 + 0x14);
if (1.0 <= fVar17) {
if (*(float *)(pCVar9 + 0x14) < 1.0) {
local_34 = local_34 + 1;
fVar17 = (1.0 - fVar17) / (*(float *)(pCVar9 + 0x14) - fVar17);
*pfVar14 = (*(float *)pCVar9 - *(float *)pCVar6) * fVar17 + *(float *)pCVar6;
pfVar14[1] = (*(float *)(pCVar9 + 4) - *(float *)(pCVar6 + 4)) * fVar17 +
*(float *)(pCVar6 + 4);
pfVar14[2] = (*(float *)(pCVar9 + 8) - *(float *)(pCVar6 + 8)) * fVar17 +
*(float *)(pCVar6 + 8);
pfVar14[6] = (*(float *)(pCVar9 + 0x18) - *(float *)(pCVar6 + 0x18)) * fVar17 +
*(float *)(pCVar6 + 0x18);
pfVar14[7] = (*(float *)(pCVar9 + 0x1c) - *(float *)(pCVar6 + 0x1c)) * fVar17 +
*(float *)(pCVar6 + 0x1c);
pfVar14[4] = (*(float *)(pCVar9 + 0x10) - *(float *)(pCVar6 + 0x10)) * fVar17 +
*(float *)(pCVar6 + 0x10);
pfVar14[5] = (*(float *)(pCVar9 + 0x14) - *(float *)(pCVar6 + 0x14)) * fVar17 +
*(float *)(pCVar6 + 0x14);
pfVar14 = pfVar14 + 8;
}
}
else {
fVar19 = *(float *)(pCVar9 + 0x14);
if (fVar19 < 1.0) {
local_34 = local_34 + 1;
*pfVar14 = *(float *)pCVar6;
pfVar14[1] = *(float *)(pCVar6 + 4);
pfVar14[2] = *(float *)(pCVar6 + 8);
pfVar14[3] = *(float *)(pCVar6 + 0xc);
pfVar14[4] = *(float *)pCVar8;
pfVar14[5] = *(float *)(pCVar8 + 4);
pfVar14[6] = *(float *)pCVar15;
pfVar14[7] = *(float *)(pCVar15 + 4);
pfVar14 = pfVar14 + 8;
}
else {
fVar17 = (1.0 - fVar19) / (fVar17 - fVar19);
*pfVar14 = (*(float *)pCVar6 - *(float *)pCVar9) * fVar17 + *(float *)pCVar9;
pfVar14[1] = (*(float *)(pCVar6 + 4) - *(float *)(pCVar9 + 4)) * fVar17 +
*(float *)(pCVar9 + 4);
pfVar14[2] = (*(float *)(pCVar6 + 8) - *(float *)(pCVar9 + 8)) * fVar17 +
*(float *)(pCVar9 + 8);
pfVar14[6] = (*(float *)(pCVar6 + 0x18) - *(float *)(pCVar9 + 0x18)) * fVar17 +
*(float *)(pCVar9 + 0x18);
pfVar14[7] = (*(float *)(pCVar6 + 0x1c) - *(float *)(pCVar9 + 0x1c)) * fVar17 +
*(float *)(pCVar9 + 0x1c);
pfVar14[4] = (*(float *)(pCVar6 + 0x10) - *(float *)(pCVar9 + 0x10)) * fVar17 +
*(float *)(pCVar9 + 0x10);
pfVar14[5] = (*(float *)(pCVar6 + 0x14) - *(float *)(pCVar9 + 0x14)) * fVar17 +
*(float *)(pCVar9 + 0x14);
pfVar14[8] = *(float *)pCVar6;
pfVar14[9] = *(float *)(pCVar6 + 4);
pfVar14[10] = *(float *)(pCVar6 + 8);
pfVar14[0xb] = *(float *)(pCVar6 + 0xc);
pfVar14[0xc] = *(float *)pCVar8;
pfVar14[0xd] = *(float *)(pCVar8 + 4);
pfVar14[0xe] = *(float *)pCVar15;
local_34 = local_34 + 2;
pfVar14[0xf] = *(float *)(pCVar15 + 4);
pfVar14 = pfVar14 + 0x10;
}
}
if (pCVar6 + 0x20 == param_1 + iVar13 + 0x20) break;
pCVar8 = pCVar8 + 0x20;
pCVar15 = pCVar15 + 0x20;
pCVar4 = pCVar6 + 0x20;
pCVar9 = pCVar6;
}
iVar13 = local_34 + 0x7ffffff;
if (local_34 != 0) {
iVar16 = 0;
pfVar14 = (float *)&g_DecalClipVerts;
pfVar11 = (float *)&g_DecalClipVerts2;
pfVar10 = (float *)(&g_DecalClipVerts2 + iVar13 * 8);
fVar17 = (float)(&DAT_0039ccf0)[iVar13 * 8];
while( true ) {
pfVar7 = pfVar11;
fVar19 = pfVar7[4];
if (0.0 < fVar19) {
if (fVar17 <= 0.0) {
fVar1 = *pfVar10;
fVar2 = *pfVar7;
pfVar14[0xc] = fVar19;
iVar16 = iVar16 + 2;
fVar18 = fVar17 / (fVar17 - fVar19);
fVar20 = pfVar10[1];
*pfVar14 = (fVar2 - fVar1) * fVar18 + fVar1;
fVar1 = pfVar10[2];
pfVar14[1] = (pfVar7[1] - fVar20) * fVar18 + fVar20;
fVar2 = pfVar10[6];
pfVar14[2] = (pfVar7[2] - fVar1) * fVar18 + fVar1;
fVar1 = pfVar7[6];
fVar20 = pfVar10[7];
fVar3 = pfVar7[7];
pfVar14[0xf] = fVar3;
pfVar14[6] = (fVar1 - fVar2) * fVar18 + fVar2;
fVar1 = pfVar7[5];
pfVar14[0xd] = fVar1;
pfVar14[7] = (fVar3 - fVar20) * fVar18 + fVar20;
fVar2 = pfVar10[5];
fVar20 = pfVar7[3];
pfVar14[4] = (fVar19 - fVar17) * fVar18 + fVar17;
pfVar14[0xb] = fVar20;
pfVar14[8] = *pfVar7;
fVar17 = pfVar7[1];
pfVar14[5] = (fVar1 - fVar2) * fVar18 + fVar2;
pfVar14[9] = fVar17;
pfVar14[10] = pfVar7[2];
pfVar14[0xe] = pfVar7[6];
pfVar14 = pfVar14 + 0x10;
}
else {
fVar17 = *pfVar7;
pfVar14[4] = fVar19;
iVar16 = iVar16 + 1;
fVar1 = pfVar7[3];
*pfVar14 = fVar17;
pfVar14[1] = pfVar7[1];
fVar17 = pfVar7[2];
pfVar14[3] = fVar1;
pfVar14[2] = fVar17;
pfVar14[5] = pfVar7[5];
pfVar14[6] = pfVar7[6];
pfVar14[7] = pfVar7[7];
pfVar14 = pfVar14 + 8;
}
}
else if (0.0 < fVar17) {
iVar16 = iVar16 + 1;
fVar20 = fVar19 / (fVar19 - fVar17);
fVar1 = pfVar7[1];
*pfVar14 = (*pfVar10 - *pfVar7) * fVar20 + *pfVar7;
fVar2 = pfVar10[1];
pfVar14[4] = (fVar17 - fVar19) * fVar20 + fVar19;
fVar17 = pfVar7[2];
pfVar14[1] = (fVar2 - fVar1) * fVar20 + fVar1;
fVar1 = pfVar7[6];
pfVar14[2] = (pfVar10[2] - fVar17) * fVar20 + fVar17;
fVar17 = pfVar7[7];
pfVar14[6] = (pfVar10[6] - fVar1) * fVar20 + fVar1;
fVar1 = pfVar7[5];
pfVar14[7] = (pfVar10[7] - fVar17) * fVar20 + fVar17;
pfVar14[5] = (pfVar10[5] - fVar1) * fVar20 + fVar1;
pfVar14 = pfVar14 + 8;
}
if (pfVar7 + 8 == (float *)(&DAT_0039cd00 + iVar13 * 8)) break;
pfVar11 = pfVar7 + 8;
pfVar10 = pfVar7;
fVar17 = fVar19;
}
iVar13 = iVar16 + 0x7ffffff;
if (iVar16 != 0) {
iVar16 = 0;
pfVar14 = (float *)&g_DecalClipVerts2;
pfVar11 = (float *)&g_DecalClipVerts;
pfVar10 = (float *)(&g_DecalClipVerts + iVar13 * 8);
fVar17 = (float)(&DAT_0039c6f0)[iVar13 * 8];
while( true ) {
pfVar7 = pfVar11;
fVar19 = pfVar7[4];
if (1.0 <= fVar19) {
if (fVar17 < 1.0) {
iVar16 = iVar16 + 1;
fVar20 = (1.0 - fVar19) / (fVar17 - fVar19);
fVar1 = pfVar7[1];
*pfVar14 = (*pfVar10 - *pfVar7) * fVar20 + *pfVar7;
fVar2 = pfVar10[1];
pfVar14[4] = (fVar17 - fVar19) * fVar20 + fVar19;
fVar17 = pfVar7[2];
pfVar14[1] = (fVar2 - fVar1) * fVar20 + fVar1;
fVar1 = pfVar7[6];
pfVar14[2] = (pfVar10[2] - fVar17) * fVar20 + fVar17;
fVar17 = pfVar7[7];
pfVar14[6] = (pfVar10[6] - fVar1) * fVar20 + fVar1;
fVar1 = pfVar7[5];
pfVar14[7] = (pfVar10[7] - fVar17) * fVar20 + fVar17;
pfVar14[5] = (pfVar10[5] - fVar1) * fVar20 + fVar1;
pfVar14 = pfVar14 + 8;
}
}
else if (fVar17 < 1.0) {
fVar17 = *pfVar7;
pfVar14[4] = fVar19;
iVar16 = iVar16 + 1;
fVar1 = pfVar7[3];
*pfVar14 = fVar17;
pfVar14[1] = pfVar7[1];
fVar17 = pfVar7[2];
pfVar14[3] = fVar1;
pfVar14[2] = fVar17;
pfVar14[5] = pfVar7[5];
pfVar14[6] = pfVar7[6];
pfVar14[7] = pfVar7[7];
pfVar14 = pfVar14 + 8;
}
else {
fVar1 = *pfVar10;
fVar2 = *pfVar7;
pfVar14[0xc] = fVar19;
iVar16 = iVar16 + 2;
fVar18 = (1.0 - fVar17) / (fVar19 - fVar17);
fVar20 = pfVar10[1];
fVar3 = pfVar10[5];
*pfVar14 = (fVar2 - fVar1) * fVar18 + fVar1;
fVar1 = pfVar7[1];
pfVar14[4] = (fVar19 - fVar17) * fVar18 + fVar17;
fVar17 = pfVar7[5];
pfVar14[0xd] = fVar17;
fVar2 = pfVar10[2];
pfVar14[1] = (fVar1 - fVar20) * fVar18 + fVar20;
fVar1 = pfVar10[6];
pfVar14[2] = (pfVar7[2] - fVar2) * fVar18 + fVar2;
fVar2 = pfVar7[6];
fVar20 = pfVar7[7];
pfVar14[0xf] = fVar20;
pfVar14[6] = (fVar2 - fVar1) * fVar18 + fVar1;
fVar1 = pfVar7[3];
pfVar14[7] = (fVar20 - pfVar10[7]) * fVar18 + pfVar10[7];
pfVar14[0xb] = fVar1;
pfVar14[8] = *pfVar7;
fVar1 = pfVar7[1];
pfVar14[5] = (fVar17 - fVar3) * fVar18 + fVar3;
pfVar14[9] = fVar1;
pfVar14[10] = pfVar7[2];
pfVar14[0xe] = pfVar7[6];
pfVar14 = pfVar14 + 0x10;
}
if (pfVar7 + 8 == (float *)(&DAT_0039c700 + iVar13 * 8)) break;
pfVar11 = pfVar7 + 8;
pfVar10 = pfVar7;
fVar17 = fVar19;
}
if (iVar16 != 0) {
iVar13 = 0;
pfVar14 = (float *)&g_DecalClipVerts2;
pfVar11 = (float *)(&g_DecalClipVerts2 + (iVar16 + 0x7ffffff) * 8);
pCVar8 = pCVar12;
while( true ) {
pfVar10 = pfVar14;
fVar17 = pfVar10[5];
fVar19 = pfVar11[5];
if (0.0 < fVar17) {
if (fVar19 <= 0.0) {
iVar13 = iVar13 + 2;
fVar19 = fVar19 / (fVar19 - fVar17);
*(float *)pCVar8 = (*pfVar10 - *pfVar11) * fVar19 + *pfVar11;
*(float *)(pCVar8 + 4) = (pfVar10[1] - pfVar11[1]) * fVar19 + pfVar11[1];
*(float *)(pCVar8 + 8) = (pfVar10[2] - pfVar11[2]) * fVar19 + pfVar11[2];
*(float *)(pCVar8 + 0x18) = (pfVar10[6] - pfVar11[6]) * fVar19 + pfVar11[6];
*(float *)(pCVar8 + 0x1c) = (pfVar10[7] - pfVar11[7]) * fVar19 + pfVar11[7];
*(float *)(pCVar8 + 0x10) = (pfVar10[4] - pfVar11[4]) * fVar19 + pfVar11[4];
*(float *)(pCVar8 + 0x14) = (pfVar10[5] - pfVar11[5]) * fVar19 + pfVar11[5];
*(float *)(pCVar8 + 0x20) = *pfVar10;
*(float *)(pCVar8 + 0x24) = pfVar10[1];
*(float *)(pCVar8 + 0x28) = pfVar10[2];
*(float *)(pCVar8 + 0x2c) = pfVar10[3];
*(float *)(pCVar8 + 0x30) = pfVar10[4];
*(float *)(pCVar8 + 0x34) = pfVar10[5];
*(float *)(pCVar8 + 0x38) = pfVar10[6];
*(float *)(pCVar8 + 0x3c) = pfVar10[7];
pCVar8 = pCVar8 + 0x40;
}
else {
iVar13 = iVar13 + 1;
*(float *)pCVar8 = *pfVar10;
*(float *)(pCVar8 + 4) = pfVar10[1];
*(float *)(pCVar8 + 8) = pfVar10[2];
*(float *)(pCVar8 + 0xc) = pfVar10[3];
*(float *)(pCVar8 + 0x10) = pfVar10[4];
*(float *)(pCVar8 + 0x14) = pfVar10[5];
*(float *)(pCVar8 + 0x18) = pfVar10[6];
*(float *)(pCVar8 + 0x1c) = pfVar10[7];
pCVar8 = pCVar8 + 0x20;
}
}
else if (0.0 < fVar19) {
iVar13 = iVar13 + 1;
fVar17 = fVar17 / (fVar17 - fVar19);
*(float *)pCVar8 = (*pfVar11 - *pfVar10) * fVar17 + *pfVar10;
*(float *)(pCVar8 + 4) = (pfVar11[1] - pfVar10[1]) * fVar17 + pfVar10[1];
*(float *)(pCVar8 + 8) = (pfVar11[2] - pfVar10[2]) * fVar17 + pfVar10[2];
*(float *)(pCVar8 + 0x18) = (pfVar11[6] - pfVar10[6]) * fVar17 + pfVar10[6];
*(float *)(pCVar8 + 0x1c) = (pfVar11[7] - pfVar10[7]) * fVar17 + pfVar10[7];
*(float *)(pCVar8 + 0x10) = (pfVar11[4] - pfVar10[4]) * fVar17 + pfVar10[4];
*(float *)(pCVar8 + 0x14) = (pfVar11[5] - pfVar10[5]) * fVar17 + pfVar10[5];
pCVar8 = pCVar8 + 0x20;
}
if (pfVar10 + 8 == (float *)(&DAT_0039cd00 + (iVar16 + 0x7ffffff) * 8)) break;
pfVar14 = pfVar10 + 8;
pfVar11 = pfVar10;
}
*(short *)(param_3 + 0x4e) = (short)iVar13;
if (iVar13 == 0) {
return (CDecalVert *)0x0;
}
iVar16 = 0;
pCVar8 = pCVar12;
do {
iVar16 = iVar16 + 1;
*(float *)pCVar8 = *(float *)param_5 * 0.1 + *(float *)pCVar8;
*(float *)(pCVar8 + 4) = *(float *)(param_5 + 4) * 0.1 + *(float *)(pCVar8 + 4);
*(float *)(pCVar8 + 8) = *(float *)(param_5 + 8) * 0.1 + *(float *)(pCVar8 + 8);
pCVar8 = pCVar8 + 0x20;
} while (iVar16 < iVar13);
cVar5 = (**(code **)(**(int **)(param_3 + 0xc) + 0x1c))(*(int **)(param_3 + 0xc));
if (cVar5 != '\0') {
(**(code **)(**(int **)(param_3 + 0xc) + 0x20))(*(int **)(param_3 + 0xc),&local_2c);
(**(code **)(**(int **)(param_3 + 0xc) + 0x24))(*(int **)(param_3 + 0xc),&local_24);
iVar16 = 0;
pCVar8 = pCVar12;
do {
iVar16 = iVar16 + 1;
*(float *)(pCVar8 + 0x10) = *(float *)(pCVar8 + 0x10) * local_24 + local_2c;
*(float *)(pCVar8 + 0x14) = *(float *)(pCVar8 + 0x14) * local_20 + local_28;
pCVar8 = pCVar8 + 0x20;
} while (iVar16 < iVar13);
}
return pCVar12;
}
}
}
}
*(undefined2 *)(param_3 + 0x4e) = 0;
return (CDecalVert *)0x0;
}
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.