WorldSpaceSlerp
0x00b90840 · 1904 bytes · __cdecl
_Z15WorldSpaceSlerpPK10CStudioHdrP10QuaternionP6VectorR16mstudioseqdesc_tiPKS2_PKS4_fi
Decompiled
undefined (9 params)
/* WorldSpaceSlerp(CStudioHdr const*, Quaternion*, Vector*, mstudioseqdesc_t&, int, Quaternion
const*, Vector const*, float, int) */
void WorldSpaceSlerp(CStudioHdr *param_1,Quaternion *param_2,Vector *param_3,
mstudioseqdesc_t *param_4,int param_5,Quaternion *param_6,Vector *param_7,
float param_8,int param_9)
{
float fVar1;
float fVar2;
int iVar3;
int iVar4;
char cVar5;
matrix3x4_t *pmVar6;
matrix3x4_t *pmVar7;
int iVar8;
matrix3x4_t *pmVar9;
matrix3x4_t *pmVar10;
Vector *pVVar11;
int iVar12;
Vector *pVVar13;
float fVar14;
int local_154;
int local_14c;
int local_144;
Quaternion *local_140;
Vector local_130 [12];
Vector local_124 [12];
Vector local_118 [12];
undefined4 local_10c;
undefined4 local_108;
undefined4 local_104;
undefined4 local_100;
undefined4 local_fc;
undefined4 local_f8;
undefined4 local_f4;
undefined4 local_f0;
undefined4 local_ec;
undefined4 local_e8;
undefined4 local_e4;
undefined4 local_e0;
Quaternion local_dc [16];
Quaternion local_cc [16];
Quaternion local_bc [16];
matrix3x4_t local_ac [48];
matrix3x4_t local_7c [48];
RadianEuler local_4c [60];
SetIdentityMatrix(local_ac);
do {
pmVar6 = g_MatrixPool;
if (g_MatrixPool == (matrix3x4_t *)0x0) {
pmVar6 = (matrix3x4_t *)memalign(0x10,0x1800);
if (((uint)pmVar6 & 0xf) != 0) {
raise(5);
}
break;
}
cVar5 = ThreadInterlockedAssignIf64
(&g_MatrixPool,*(undefined4 *)g_MatrixPool,DAT_01047874 + -1,g_MatrixPool,
DAT_01047874);
} while (cVar5 == '\0');
local_10c = 0;
local_108 = 0;
local_104 = 0;
local_100 = 0;
do {
pmVar7 = g_MatrixPool;
if (g_MatrixPool == (matrix3x4_t *)0x0) {
pmVar7 = (matrix3x4_t *)memalign(0x10,0x1800);
if (((uint)pmVar7 & 0xf) != 0) {
raise(5);
}
break;
}
cVar5 = ThreadInterlockedAssignIf64
(&g_MatrixPool,*(undefined4 *)g_MatrixPool,DAT_01047874 + -1,g_MatrixPool,
DAT_01047874);
} while (cVar5 == '\0');
local_fc = 0;
local_f8 = 0;
local_f4 = 0;
local_f0 = 0;
do {
pmVar10 = g_MatrixPool;
g_MatrixPool = pmVar10;
if (pmVar10 == (matrix3x4_t *)0x0) {
pmVar10 = (matrix3x4_t *)memalign(0x10,0x1800);
if (((uint)pmVar10 & 0xf) != 0) {
raise(5);
}
break;
}
cVar5 = ThreadInterlockedAssignIf64
(&g_MatrixPool,*(undefined4 *)pmVar10,DAT_01047874 + -1,pmVar10,DAT_01047874);
} while (cVar5 == '\0');
local_ec = 0;
local_e8 = 0;
local_e4 = 0;
local_e0 = 0;
iVar8 = *(int *)(param_1 + 4);
if (iVar8 == 0) {
local_154 = 0;
}
else {
local_154 = *(int *)(param_5 * 0x10 + *(int *)(iVar8 + 8) + 8) * 0x90 + *(int *)(iVar8 + 0x58);
}
iVar8 = *(int *)param_1;
local_144 = *(int *)(iVar8 + 0xa0) + iVar8;
if (0 < *(int *)(iVar8 + 0x9c)) {
local_14c = 0;
local_140 = param_2;
iVar12 = 0;
pVVar11 = param_3;
pVVar13 = param_7;
do {
if ((param_9 & *(uint *)(*(int *)(param_1 + 0x2c) + iVar12 * 4)) != 0) {
iVar3 = *(int *)(local_144 + 4);
if (local_154 == 0) {
fVar14 = param_8 * *(float *)(param_4 + iVar12 * 4 + *(int *)(param_4 + 0x9c));
if (iVar3 != -1) {
fVar1 = *(float *)(param_4 + *(int *)(param_4 + 0x9c) + iVar3 * 4);
LAB_00b90bcb:
if ((fVar14 == 1.0) && (param_8 * fVar1 == 1.0)) {
iVar8 = iVar12 * 0x10;
*(float *)pVVar11 = *(float *)pVVar13;
*(float *)(pVVar11 + 4) = *(float *)(pVVar13 + 4);
*(float *)(pVVar11 + 8) = *(float *)(pVVar13 + 8);
*(undefined4 *)local_140 = *(undefined4 *)(param_6 + iVar8);
*(undefined4 *)(local_140 + 4) = *(undefined4 *)(param_6 + iVar8 + 4);
*(undefined4 *)(local_140 + 8) = *(undefined4 *)(param_6 + iVar8 + 8);
*(undefined4 *)(local_140 + 0xc) = *(undefined4 *)(param_6 + iVar8 + 0xc);
iVar8 = *(int *)param_1;
goto LAB_00b90b03;
}
}
}
else {
iVar4 = *(int *)(*(int *)(local_154 + 4) + iVar12 * 4);
if (iVar4 < 0) goto LAB_00b90b03;
fVar14 = param_8 * *(float *)(param_4 + *(int *)(param_4 + 0x9c) + iVar4 * 4);
if (iVar3 != -1) {
fVar1 = *(float *)(param_4 +
*(int *)(param_4 + 0x9c) +
*(int *)(*(int *)(local_154 + 4) + iVar3 * 4) * 4);
goto LAB_00b90bcb;
}
}
if (0.0 < fVar14) {
BuildBoneChain(param_1,local_ac,param_3,param_2,iVar12,pmVar7,(CBoneBitList *)&local_fc);
BuildBoneChain(param_1,local_ac,param_7,param_6,iVar12,pmVar6,(CBoneBitList *)&local_10c);
MatrixAngles(pmVar7 + local_14c,local_cc,local_124);
MatrixAngles(pmVar6 + local_14c,local_dc,local_130);
QuaternionSlerp(local_cc,local_dc,fVar14,local_bc);
pmVar9 = pmVar10 + local_14c;
QuaternionAngles(local_bc,local_4c);
AngleMatrix(local_4c,local_124,pmVar9);
if (iVar3 == -1) {
MatrixAngles(pmVar9,local_140,local_118);
iVar8 = *(int *)param_1;
}
else {
MatrixInvert(pmVar10 + iVar3 * 0x30,local_7c);
ConcatTransforms_Aligned(local_7c,pmVar9,(matrix3x4_t *)local_4c);
MatrixAngles((matrix3x4_t *)local_4c,local_140,local_118);
fVar1 = *(float *)(pVVar13 + 8);
fVar2 = *(float *)pVVar13;
*(float *)(pVVar11 + 4) =
(*(float *)(pVVar13 + 4) - *(float *)(pVVar11 + 4)) * fVar14 +
*(float *)(pVVar11 + 4);
*(float *)(pVVar11 + 8) =
(fVar1 - *(float *)(pVVar11 + 8)) * fVar14 + *(float *)(pVVar11 + 8);
*(float *)pVVar11 = (fVar2 - *(float *)pVVar11) * fVar14 + *(float *)pVVar11;
iVar8 = *(int *)param_1;
}
}
}
LAB_00b90b03:
iVar12 = iVar12 + 1;
pVVar13 = pVVar13 + 0xc;
pVVar11 = pVVar11 + 0xc;
local_140 = local_140 + 0x10;
local_144 = local_144 + 0xd8;
local_14c = local_14c + 0x30;
} while (iVar12 < *(int *)(iVar8 + 0x9c));
}
do {
iVar8 = DAT_01047874;
pmVar9 = g_MatrixPool;
iVar12 = DAT_01047874 + 0x10001;
*(matrix3x4_t **)pmVar6 = g_MatrixPool;
cVar5 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar6,iVar12,pmVar9,iVar8);
} while (cVar5 == '\0');
do {
iVar8 = DAT_01047874;
pmVar6 = g_MatrixPool;
iVar12 = DAT_01047874 + 0x10001;
*(matrix3x4_t **)pmVar7 = g_MatrixPool;
cVar5 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar7,iVar12,pmVar6,iVar8);
} while (cVar5 == '\0');
do {
iVar8 = DAT_01047874;
pmVar6 = g_MatrixPool;
iVar12 = DAT_01047874 + 0x10001;
*(matrix3x4_t **)pmVar10 = g_MatrixPool;
cVar5 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar10,iVar12,pmVar6,iVar8);
} while (cVar5 == '\0');
return;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.