DoQuatInterpBone
0x00b8dad0 · 1049 bytes · __cdecl
_Z16DoQuatInterpBoneP13mstudiobone_tiR13CBoneAccessor
Decompiled
undefined (3 params)
/* DoQuatInterpBone(mstudiobone_t*, int, CBoneAccessor&) */
void DoQuatInterpBone(mstudiobone_t *param_1,int param_2,CBoneAccessor *param_3)
{
float *pfVar1;
int iVar2;
int iVar3;
mstudiobone_t *pmVar4;
int iVar5;
longdouble lVar6;
float fVar7;
float local_160;
float local_158;
float local_154;
float local_150;
Quaternion local_14c [16];
float local_13c;
float local_138;
float local_134;
float local_130;
matrix3x4_t local_12c [48];
matrix3x4_t local_fc [48];
matrix3x4_t local_cc [48];
float afStack_9c [35];
if (((*(int *)(param_1 + param_2 * 0xd8 + 0xa8) == 0) ||
(pmVar4 = param_1 + *(int *)(param_1 + param_2 * 0xd8 + 0xa8) + param_2 * 0xd8,
pmVar4 == (mstudiobone_t *)0x0)) || (*(int *)(param_1 + *(int *)pmVar4 * 0xd8 + 4) == -1)) {
LAB_00b8de46:
ConcatTransforms_Aligned
((matrix3x4_t *)
(*(int *)(param_1 + param_2 * 0xd8 + 4) * 0x30 + *(int *)(param_3 + 4)),local_12c,
(matrix3x4_t *)(param_2 * 0x30 + *(int *)(param_3 + 4)));
return;
}
MatrixInvert((matrix3x4_t *)
(*(int *)(param_1 + *(int *)pmVar4 * 0xd8 + 4) * 0x30 + *(int *)(param_3 + 4)),
local_fc);
ConcatTransforms_Aligned
(local_fc,(matrix3x4_t *)(*(int *)pmVar4 * 0x30 + *(int *)(param_3 + 4)),local_cc);
MatrixAngles(local_cc,local_14c,(Vector *)&local_158);
if (*(int *)(pmVar4 + 4) < 1) {
iVar3 = *(int *)(pmVar4 + 8);
}
else {
local_160 = 0.0;
iVar3 = *(int *)(pmVar4 + 8);
iVar2 = 0;
do {
lVar6 = (longdouble)
QuaternionDotProduct((Quaternion *)(pmVar4 + iVar3 + iVar2 * 0x30 + 4),local_14c);
fVar7 = ABS((float)lVar6);
if (fVar7 <= -1.0) {
fVar7 = -1.0;
}
if (1.0 <= fVar7) {
fVar7 = 1.0;
}
lVar6 = (longdouble)__acos_finite((double)fVar7);
iVar3 = *(int *)(pmVar4 + 8);
iVar5 = *(int *)(pmVar4 + 4);
fVar7 = 1.0 - (*(float *)(pmVar4 + iVar2 * 0x30 + iVar3) +
*(float *)(pmVar4 + iVar2 * 0x30 + iVar3)) * (float)lVar6;
if (fVar7 <= 0.0) {
fVar7 = 0.0;
}
afStack_9c[iVar2] = fVar7;
iVar2 = iVar2 + 1;
local_160 = fVar7 + local_160;
} while (iVar2 < iVar5);
if (0.001 < local_160) {
iVar3 = 0;
local_13c = 0.0;
local_138 = 0.0;
local_134 = 0.0;
local_130 = 0.0;
local_158 = 0.0;
local_154 = 0.0;
local_150 = 0.0;
if (0 < iVar5) {
iVar2 = 0;
do {
while (pfVar1 = afStack_9c + iVar3, *pfVar1 == 0.0) {
iVar3 = iVar3 + 1;
iVar2 = iVar2 + 0x30;
if (*(int *)(pmVar4 + 4) <= iVar3) goto LAB_00b8de1c;
}
iVar3 = iVar3 + 1;
fVar7 = *pfVar1 * (1.0 / local_160);
iVar5 = *(int *)(pmVar4 + 8) + iVar2;
iVar2 = iVar2 + 0x30;
QuaternionAlign((Quaternion *)(pmVar4 + iVar5 + 0x20),(Quaternion *)&local_13c,
(Quaternion *)&local_13c);
local_13c = *(float *)(pmVar4 + iVar5 + 0x20) * fVar7 + local_13c;
local_138 = *(float *)(pmVar4 + iVar5 + 0x24) * fVar7 + local_138;
local_134 = *(float *)(pmVar4 + iVar5 + 0x28) * fVar7 + local_134;
local_130 = *(float *)(pmVar4 + iVar5 + 0x2c) * fVar7 + local_130;
local_158 = *(float *)(pmVar4 + iVar5 + 0x14) * fVar7 + local_158;
local_154 = *(float *)(pmVar4 + iVar5 + 0x18) * fVar7 + local_154;
local_150 = fVar7 * *(float *)(pmVar4 + iVar5 + 0x1c) + local_150;
} while (iVar3 < *(int *)(pmVar4 + 4));
}
LAB_00b8de1c:
QuaternionMatrix((Quaternion *)&local_13c,(Vector *)&local_158,local_12c);
goto LAB_00b8de46;
}
}
QuaternionAngles((Quaternion *)(pmVar4 + iVar3 + 0x20),(RadianEuler *)&local_13c);
AngleMatrix((RadianEuler *)&local_13c,(Vector *)(pmVar4 + iVar3 + 0x14),local_12c);
ConcatTransforms((matrix3x4_t *)
(*(int *)(param_1 + param_2 * 0xd8 + 4) * 0x30 + *(int *)(param_3 + 4)),local_12c
,(matrix3x4_t *)(param_2 * 0x30 + *(int *)(param_3 + 4)));
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.