CalcLocalHierarchyAnimation
0x00b98f50 · 1294 bytes · __regparm3
_ZL27CalcLocalHierarchyAnimationPK10CStudioHdrP11matrix3x4_tR12CBoneBitListP6VectorP10QuaternionPK13mstudiobone_tP23mstudiolocalhierarchy_tiififi.isra.1
Decompiled
undefined (13 params)
/* CalcLocalHierarchyAnimation(CStudioHdr const*, matrix3x4_t*, CBoneBitList&, Vector*, Quaternion*,
mstudiobone_t const*, mstudiolocalhierarchy_t*, int, int, float, int, float, int) [clone .isra.1]
*/
void __regparm3
CalcLocalHierarchyAnimation
(CStudioHdr *param_1,matrix3x4_t *param_2,CBoneBitList *param_3,Vector *param_4,
Quaternion *param_5,mstudiobone_t *param_6,mstudiolocalhierarchy_t *param_7,int param_8,
int param_9,float param_10,int param_11,float param_12,int param_13)
{
Vector *pVVar1;
float fVar2;
float fVar3;
float fVar4;
int iVar5;
matrix3x4_t *pmVar6;
float in_XMM0_Da;
float fVar7;
float in_XMM1_Da;
float local_f4;
Vector local_e4 [12];
float local_d8;
float local_d4;
float local_d0;
Quaternion local_cc [16];
Quaternion local_bc [16];
matrix3x4_t local_ac [48];
matrix3x4_t local_7c [48];
RadianEuler local_4c [60];
if ((CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform == '\0') &&
(iVar5 = __cxa_guard_acquire(&CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform), iVar5 != 0)) {
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._0_4_ = 0x3f800000;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._4_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._8_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._12_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._16_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._20_4_ = 0x3f800000;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._24_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._28_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._32_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._36_4_ = 0;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._40_4_ = 0x3f800000;
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform._44_4_ = 0;
__cxa_guard_release(&CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform);
}
fVar7 = *(float *)(param_7 + 0x10);
fVar2 = *(float *)(param_7 + 0xc);
if (fVar7 - fVar2 < 1.0) {
fVar3 = *(float *)(param_7 + 0x14);
fVar4 = *(float *)(param_7 + 8);
if (fVar3 <= 1.0) {
LAB_00b991b8:
if (in_XMM0_Da < fVar4) {
return;
}
}
else if (in_XMM0_Da < fVar4) {
in_XMM0_Da = in_XMM0_Da + 1.0;
goto LAB_00b991b8;
}
if (fVar3 <= in_XMM0_Da) {
return;
}
if ((fVar2 <= in_XMM0_Da) || (fVar2 == fVar4)) {
if ((in_XMM0_Da <= fVar7) || (fVar7 == fVar3)) goto LAB_00b98f98;
fVar7 = (fVar3 - in_XMM0_Da) / (fVar3 - fVar7);
}
else {
fVar7 = (in_XMM0_Da - fVar4) / (fVar2 - fVar4);
}
local_f4 = fVar7 * fVar7 * 3.0 - (fVar7 + fVar7) * fVar7 * fVar7;
}
else {
LAB_00b98f98:
local_f4 = 1.0;
}
CalcDecompressedAnimation
((mstudiocompressedikerror_t *)(param_7 + *(int *)(param_7 + 0x1c)),
(int)param_10 - *(int *)(param_7 + 0x18),in_XMM1_Da,local_e4,local_cc);
BuildBoneChain(param_1,(matrix3x4_t *)
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform,param_4,param_5,param_8,param_2,param_3);
BuildBoneChain(param_1,(matrix3x4_t *)
CalcLocalHierarchyAnimation(CStudioHdr_const*,matrix3x4_t*,CBoneBitList&,Vector*,Quaternion*,mstudiobone_t_const*,mstudiolocalhierarchy_t*,int,int,float,int,float,int)
::rootXform,param_4,param_5,param_9,param_2,param_3);
QuaternionAngles(local_cc,local_4c);
AngleMatrix(local_4c,local_e4,local_ac);
pmVar6 = param_2 + param_8 * 0x30;
ConcatTransforms(param_2 + param_9 * 0x30,local_ac,pmVar6);
if (*(int *)(param_6 + param_8 * 0xd8 + 4) == -1) {
if (local_f4 != 1.0) {
MatrixAngles(pmVar6,local_bc,(Vector *)&local_d8);
QuaternionSlerp(param_5 + param_8 * 0x10,local_bc,local_f4,param_5 + param_8 * 0x10);
pVVar1 = param_4 + param_8 * 0xc;
*(float *)(pVVar1 + 4) = (*(float *)(pVVar1 + 4) - local_d4) * local_f4 + local_d4;
*(float *)(pVVar1 + 8) = (*(float *)(pVVar1 + 8) - local_d0) * local_f4 + local_d0;
*(float *)pVVar1 = (*(float *)pVVar1 - local_d8) * local_f4 + local_d8;
return;
}
MatrixAngles(pmVar6,param_5 + param_8 * 0x10,param_4 + param_8 * 0xc);
return;
}
MatrixInvert(param_2 + *(int *)(param_6 + param_8 * 0xd8 + 4) * 0x30,local_7c);
ConcatTransforms(local_7c,pmVar6,(matrix3x4_t *)local_4c);
if (local_f4 == 1.0) {
MatrixAngles((matrix3x4_t *)local_4c,param_5 + param_8 * 0x10,param_4 + param_8 * 0xc);
return;
}
MatrixAngles((matrix3x4_t *)local_4c,local_bc,(Vector *)&local_d8);
QuaternionSlerp(param_5 + param_8 * 0x10,local_bc,local_f4,param_5 + param_8 * 0x10);
pVVar1 = param_4 + param_8 * 0xc;
*(float *)(pVVar1 + 4) = (*(float *)(pVVar1 + 4) - local_d4) * local_f4 + local_d4;
*(float *)(pVVar1 + 8) = (*(float *)(pVVar1 + 8) - local_d0) * local_f4 + local_d0;
*(float *)pVVar1 = (*(float *)pVVar1 - local_d8) * local_f4 + local_d8;
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.