CalcAnimation
0x00b9a4a0 · 2767 bytes · __cdecl
_Z13CalcAnimationPK10CStudioHdrP6VectorP10QuaternionR16mstudioseqdesc_tiifi
Decompiled
undefined (8 params)
/* CalcAnimation(CStudioHdr const*, Vector*, Quaternion*, mstudioseqdesc_t&, int, int, float, int)
*/
void CalcAnimation(CStudioHdr *param_1,Vector *param_2,Quaternion *param_3,mstudioseqdesc_t *param_4
,int param_5,int param_6,float param_7,int param_8)
{
int *piVar1;
byte bVar2;
mstudio_rle_anim_t mVar3;
matrix3x4_t *pmVar4;
char cVar5;
mstudioanimdesc_t *this;
int iVar6;
float fVar7;
int *piVar8;
uchar *puVar9;
matrix3x4_t *pmVar10;
mstudiolocalhierarchy_t *pmVar11;
mstudiobone_t *pmVar12;
uint uVar13;
int iVar14;
mstudiolinearbone_t *pmVar15;
int iVar16;
uint uVar17;
mstudiobone_t *pmVar18;
mstudio_rle_anim_t *pmVar19;
mstudiobone_t *pmVar20;
Vector *pVVar21;
Quaternion *pQVar22;
float fVar23;
Vector *in_stack_ffffff38;
Quaternion *in_stack_ffffff3c;
mstudio_rle_anim_t *in_stack_ffffff40;
mstudiolinearbone_t *in_stack_ffffff44;
int in_stack_ffffff48;
mstudiobone_t *local_94;
byte local_88;
mstudiolinearbone_t *local_7c;
Vector *local_78;
mstudio_rle_anim_t *local_74;
mstudioseqdesc_t *local_70;
float local_60;
float local_5c;
uchar *local_58;
undefined4 local_54;
undefined4 local_50;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_40;
undefined4 local_3c;
undefined4 local_38;
undefined4 local_34;
undefined4 local_30;
undefined4 local_2c;
undefined4 local_28;
undefined4 local_24;
undefined4 local_20;
*(int *)(param_1 + 0x60) = *(int *)(param_1 + 0x60) + 1;
if (*(virtualmodel_t **)(param_1 + 4) != (virtualmodel_t *)0x0) {
CalcVirtualAnimation
(*(virtualmodel_t **)(param_1 + 4),param_1,param_2,param_3,param_4,param_5,param_6,
(float)param_8,(int)in_stack_ffffff38);
return;
}
this = (mstudioanimdesc_t *)CStudioHdr::pAnimdesc(param_1,param_6);
local_7c = (mstudiolinearbone_t *)0x0;
iVar6 = *(int *)param_1;
pmVar20 = (mstudiobone_t *)(*(int *)(iVar6 + 0xa0) + iVar6);
if (*(int *)(iVar6 + 400) != 0) {
iVar6 = iVar6 + *(int *)(iVar6 + 400);
iVar14 = *(int *)(iVar6 + 0x10);
local_7c = (mstudiolinearbone_t *)(iVar6 + iVar14);
if (iVar14 == 0) {
local_7c = (mstudiolinearbone_t *)0x0;
}
}
local_58 = (uchar *)0x0;
fVar23 = (float)(*(int *)(this + 0x10) + -1) * param_7;
fVar7 = (float)(int)fVar23;
fVar23 = fVar23 - (float)(int)fVar7;
local_5c = 0.0;
local_94 = pmVar20;
local_60 = fVar7;
if (((byte)this[0xc] & 0x40) == 0) {
local_74 = (mstudio_rle_anim_t *)mstudioanimdesc_t::pAnim(this,(int *)&local_60,&local_5c);
uVar13 = *(uint *)(this + 0xc);
local_70 = param_4 + *(int *)(param_4 + 0x9c);
local_88 = (byte)(uVar13 >> 2) & 1;
if (local_74 != (mstudio_rle_anim_t *)0x0) {
iVar6 = *(int *)param_1;
if (0 < *(int *)(iVar6 + 0x9c)) {
local_78 = param_2;
uVar17 = 0;
pQVar22 = param_3;
do {
if ((local_74 == (mstudio_rle_anim_t *)0x0) || ((byte)*local_74 != uVar17)) {
if ((0.0 < *(float *)(local_70 + uVar17 * 4)) &&
((param_8 & *(uint *)(*(int *)(param_1 + 0x2c) + uVar17 * 4)) != 0)) {
if ((uVar13 >> 2 & 1) == 0) {
*(undefined4 *)pQVar22 = *(undefined4 *)(local_94 + 0x2c);
*(undefined4 *)(pQVar22 + 4) = *(undefined4 *)(local_94 + 0x30);
*(undefined4 *)(pQVar22 + 8) = *(undefined4 *)(local_94 + 0x34);
*(undefined4 *)(pQVar22 + 0xc) = *(undefined4 *)(local_94 + 0x38);
*(undefined4 *)local_78 = *(undefined4 *)(local_94 + 0x20);
*(undefined4 *)(local_78 + 4) =
*(undefined4 *)(pmVar20 + (int)(local_94 + (0x24 - (int)pmVar20)));
*(undefined4 *)(local_78 + 8) =
*(undefined4 *)(pmVar20 + (int)(local_94 + (0x28 - (int)pmVar20)));
}
else {
*(undefined4 *)pQVar22 = 0;
*(undefined4 *)(pQVar22 + 4) = 0;
*(undefined4 *)(pQVar22 + 8) = 0;
*(undefined4 *)(pQVar22 + 0xc) = 0x3f800000;
*(undefined4 *)local_78 = 0;
*(undefined4 *)(local_78 + 4) = 0;
*(undefined4 *)(local_78 + 8) = 0;
}
*(int *)(param_1 + 0x5c) = *(int *)(param_1 + 0x5c) + 1;
iVar6 = *(int *)param_1;
}
}
else {
if ((0.0 < *(float *)(local_70 + uVar17 * 4)) &&
((param_8 & *(uint *)(*(int *)(param_1 + 0x2c) + uVar17 * 4)) != 0)) {
iVar6 = uVar17 * 0x10;
in_stack_ffffff44 = (mstudiolinearbone_t *)(param_3 + iVar6);
in_stack_ffffff40 = local_74;
if (local_7c == (mstudiolinearbone_t *)0x0) {
in_stack_ffffff3c = (Quaternion *)(local_94 + 0x90);
CalcBoneQuaternion((int)local_60,fVar23,(Quaternion *)(local_94 + 0x2c),
(RadianEuler *)(local_94 + 0x3c),(Vector *)(local_94 + 0x54),
*(int *)(local_94 + 0xa0),in_stack_ffffff3c,local_74,
(Quaternion *)in_stack_ffffff44);
in_stack_ffffff38 = param_2 + uVar17 * 0xc;
CalcBonePosition((int)local_60,fVar23,(Vector *)(local_94 + 0x20),
(Vector *)(local_94 + 0x48),local_74,in_stack_ffffff38);
}
else {
pmVar15 = local_7c + *(int *)(local_7c + 0x24) + iVar6;
local_2c = *(undefined4 *)pmVar15;
local_28 = *(undefined4 *)(pmVar15 + 4);
local_24 = *(undefined4 *)(pmVar15 + 8);
local_20 = *(undefined4 *)(pmVar15 + 0xc);
iVar14 = uVar17 * 0xc;
pmVar15 = local_7c + *(int *)(local_7c + 0x20) + iVar14;
local_48 = *(undefined4 *)pmVar15;
local_44 = *(undefined4 *)(pmVar15 + 4);
local_40 = *(undefined4 *)(pmVar15 + 8);
pmVar15 = local_7c + *(int *)(local_7c + 0x14) + iVar14;
local_54 = *(undefined4 *)pmVar15;
local_50 = *(undefined4 *)(pmVar15 + 4);
local_4c = *(undefined4 *)(pmVar15 + 8);
pmVar15 = local_7c + *(int *)(local_7c + 0x10) + iVar6;
local_3c = *(undefined4 *)pmVar15;
local_38 = *(undefined4 *)(pmVar15 + 4);
local_34 = *(undefined4 *)(pmVar15 + 8);
local_30 = *(undefined4 *)(pmVar15 + 0xc);
in_stack_ffffff3c = (Quaternion *)&local_2c;
CalcBoneQuaternion((int)local_60,fVar23,(Quaternion *)&local_3c,
(RadianEuler *)&local_54,(Vector *)&local_48,
*(int *)(local_7c + *(int *)(local_7c + 4) + uVar17 * 4),
in_stack_ffffff3c,local_74,(Quaternion *)in_stack_ffffff44);
pmVar15 = local_7c + *(int *)(local_7c + 0x1c) + (uint)(byte)*local_74 * 0xc;
local_2c = *(undefined4 *)pmVar15;
local_28 = *(undefined4 *)(pmVar15 + 4);
local_24 = *(undefined4 *)(pmVar15 + 8);
pmVar15 = local_7c + *(int *)(local_7c + 0xc) + (uint)(byte)*local_74 * 0xc;
local_3c = *(undefined4 *)pmVar15;
local_38 = *(undefined4 *)(pmVar15 + 4);
local_34 = *(undefined4 *)(pmVar15 + 8);
in_stack_ffffff38 = param_2 + iVar14;
CalcBonePosition((int)local_60,fVar23,(Vector *)&local_3c,(Vector *)&local_2c,
local_74,in_stack_ffffff38);
}
*(int *)(param_1 + 0x58) = *(int *)(param_1 + 0x58) + 1;
*(int *)(param_1 + 0x5c) = *(int *)(param_1 + 0x5c) + 1;
iVar6 = *(int *)param_1;
}
if (*(short *)(local_74 + 2) == 0) {
local_74 = (mstudio_rle_anim_t *)0x0;
}
else {
local_74 = local_74 + *(short *)(local_74 + 2);
}
}
uVar17 = uVar17 + 1;
local_94 = local_94 + 0xd8;
pQVar22 = pQVar22 + 0x10;
local_78 = local_78 + 0xc;
} while ((int)uVar17 < *(int *)(iVar6 + 0x9c));
}
LAB_00b9aa40:
if (0.0 < local_5c) {
CalcZeroframeData(param_1,(studiohdr_t *)(iVar6 + 0x9c),(virtualgroup_t *)0x0,
(mstudiobone_t *)(iVar6 + *(int *)(iVar6 + 0xa0)),this,(float)param_2,
(Vector *)param_3,(Quaternion *)param_8,(int)in_stack_ffffff38,
(float)in_stack_ffffff3c);
}
if (*(int *)(this + 0x48) == 0) {
return;
}
do {
pmVar10 = g_MatrixPool;
if (g_MatrixPool == (matrix3x4_t *)0x0) {
pmVar10 = (matrix3x4_t *)memalign(0x10,0x1800);
if (((uint)pmVar10 & 0xf) != 0) {
raise(5);
}
break;
}
cVar5 = ThreadInterlockedAssignIf64
(&g_MatrixPool,*(undefined4 *)g_MatrixPool,DAT_01047874 + -1,g_MatrixPool,
DAT_01047874);
} while (cVar5 == '\0');
local_2c = 0;
iVar6 = 0;
local_28 = 0;
local_24 = 0;
local_20 = 0;
if (0 < *(int *)(this + 0x48)) {
do {
pmVar11 = (mstudiolocalhierarchy_t *)mstudioanimdesc_t::pHierarchy(this,iVar6);
if (pmVar11 == (mstudiolocalhierarchy_t *)0x0) break;
if (((*(uint *)(*(int *)(param_1 + 0x2c) + *(int *)pmVar11 * 4) & param_8) != 0) &&
((*(uint *)(*(int *)(param_1 + 0x2c) + *(int *)(pmVar11 + 4) * 4) & param_8) != 0)) {
CalcLocalHierarchyAnimation
(param_1,pmVar10,(CBoneBitList *)&local_2c,param_2,param_3,local_94,pmVar11,
*(int *)pmVar11,*(int *)(pmVar11 + 4),fVar7,(int)in_stack_ffffff40,
(float)in_stack_ffffff44,in_stack_ffffff48);
}
iVar6 = iVar6 + 1;
} while (iVar6 < *(int *)(this + 0x48));
}
do {
iVar6 = DAT_01047874;
pmVar4 = g_MatrixPool;
iVar14 = DAT_01047874 + 0x10001;
*(matrix3x4_t **)pmVar10 = g_MatrixPool;
cVar5 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar10,iVar14,pmVar4,iVar6);
} while (cVar5 == '\0');
return;
}
}
else {
piVar8 = (int *)mstudioanimdesc_t::pAnim(this,(int *)&local_60,&local_5c);
if (piVar8 == (int *)0x0) {
local_70 = param_4 + *(int *)(param_4 + 0x9c);
local_88 = (byte)(*(uint *)(this + 0xc) >> 2) & 1;
}
else {
piVar1 = piVar8 + 6;
iVar14 = piVar8[2];
local_58 = (uchar *)(*piVar8 + (int)piVar8);
local_70 = param_4 + *(int *)(param_4 + 0x9c);
uVar13 = *(uint *)(this + 0xc) >> 2;
puVar9 = (uchar *)((int)piVar8 + (int)local_60 * iVar14 + piVar8[1]);
local_88 = (byte)uVar13 & 1;
if ((puVar9 != (uchar *)0x0) && (local_58 != (uchar *)0x0)) {
iVar6 = *(int *)param_1;
if (fVar23 <= 0.0) {
local_74 = (mstudio_rle_anim_t *)param_2;
pmVar19 = (mstudio_rle_anim_t *)0x0;
pQVar22 = param_3;
if (0 < *(int *)(iVar6 + 0x9c)) {
do {
if ((*(float *)(local_70 + (int)pmVar19 * 4) <= 0.0) ||
((param_8 & *(uint *)(*(int *)(param_1 + 0x2c) + (int)pmVar19 * 4)) == 0)) {
mVar3 = *(mstudio_rle_anim_t *)((int)piVar1 + (int)pmVar19);
if ((((byte)mVar3 & 8) == 0) && (-1 < (char)mVar3)) {
if ((((byte)mVar3 & 2) != 0) || (((byte)mVar3 & 0x40) != 0)) {
local_58 = local_58 + 6;
}
}
else {
puVar9 = puVar9 + 6;
}
if (((byte)mVar3 & 4) == 0) {
if (((byte)mVar3 & 1) == 0) {
if (((byte)mVar3 & 0x10) == 0) {
if (((byte)mVar3 & 0x20) != 0) {
local_58 = local_58 + 0xc;
}
}
else {
puVar9 = puVar9 + 0xc;
}
}
else {
local_58 = local_58 + 6;
}
}
else {
puVar9 = puVar9 + 6;
}
}
else {
in_stack_ffffff38 = (Vector *)(uVar13 & 1);
in_stack_ffffff3c = (Quaternion *)local_7c;
in_stack_ffffff40 = pmVar19;
puVar9 = (uchar *)ExtractSingleFrame((uchar)*(mstudio_rle_anim_t *)
((int)piVar1 + (int)pmVar19),puVar9,
&local_58,pQVar22,(Vector *)local_74,
SUB41((Vector *)(uVar13 & 1),0),local_7c,
(int)pmVar19);
iVar6 = *(int *)param_1;
}
local_74 = local_74 + 0xc;
pmVar19 = pmVar19 + 1;
pQVar22 = pQVar22 + 0x10;
} while ((int)pmVar19 < *(int *)(iVar6 + 0x9c));
}
}
else if (0 < *(int *)(iVar6 + 0x9c)) {
iVar16 = 0;
local_74 = (mstudio_rle_anim_t *)param_3;
pVVar21 = param_2;
do {
if ((*(float *)(local_70 + iVar16 * 4) <= 0.0) ||
((param_8 & *(uint *)(*(int *)(param_1 + 0x2c) + iVar16 * 4)) == 0)) {
bVar2 = *(byte *)((int)piVar1 + iVar16);
if (((bVar2 & 8) == 0) && (-1 < (char)bVar2)) {
if (((bVar2 & 2) != 0) || ((bVar2 & 0x40) != 0)) {
local_58 = local_58 + 6;
}
}
else {
puVar9 = puVar9 + 6;
}
if ((bVar2 & 4) == 0) {
if ((bVar2 & 1) == 0) {
if ((bVar2 & 0x10) == 0) {
if ((bVar2 & 0x20) != 0) {
local_58 = local_58 + 0xc;
}
}
else {
puVar9 = puVar9 + 0xc;
}
}
else {
local_58 = local_58 + 6;
}
}
else {
puVar9 = puVar9 + 6;
}
}
else {
in_stack_ffffff38 = (Vector *)local_74;
in_stack_ffffff3c = (Quaternion *)pVVar21;
in_stack_ffffff40 = (mstudio_rle_anim_t *)(uVar13 & 1);
in_stack_ffffff44 = local_7c;
in_stack_ffffff48 = iVar16;
puVar9 = (uchar *)ExtractTwoFrames(*(uchar *)((int)piVar1 + iVar16),fVar23,puVar9,
&local_58,iVar14,(Quaternion *)local_74,pVVar21,
SUB41((mstudio_rle_anim_t *)(uVar13 & 1),0),
local_7c,iVar16);
iVar6 = *(int *)param_1;
}
local_74 = local_74 + 0x10;
iVar16 = iVar16 + 1;
pVVar21 = pVVar21 + 0xc;
} while (iVar16 < *(int *)(iVar6 + 0x9c));
}
goto LAB_00b9aa40;
}
}
}
local_74 = *(mstudio_rle_anim_t **)param_1;
if (0 < *(int *)((int)local_74 + 0x9c)) {
pmVar12 = pmVar20 + 0x20;
iVar6 = 0;
pQVar22 = param_3;
pmVar18 = pmVar12;
pVVar21 = param_2;
do {
if ((0.0 < *(float *)(local_70 + iVar6 * 4)) &&
((param_8 & *(uint *)(*(int *)(param_1 + 0x2c) + iVar6 * 4)) != 0)) {
if (local_88 == 0) {
*(undefined4 *)pQVar22 = *(undefined4 *)(pmVar20 + (int)(pmVar18 + (0x2c - (int)pmVar12)))
;
*(undefined4 *)(pQVar22 + 4) =
*(undefined4 *)(pmVar20 + (int)(pmVar18 + (0x30 - (int)pmVar12)));
*(undefined4 *)(pQVar22 + 8) =
*(undefined4 *)(pmVar20 + (int)(pmVar18 + (0x34 - (int)pmVar12)));
*(undefined4 *)(pQVar22 + 0xc) =
*(undefined4 *)(pmVar20 + (int)(pmVar18 + (0x38 - (int)pmVar12)));
*(undefined4 *)pVVar21 = *(undefined4 *)pmVar18;
*(undefined4 *)(pVVar21 + 4) = *(undefined4 *)(pmVar18 + 4);
*(undefined4 *)(pVVar21 + 8) = *(undefined4 *)(pmVar18 + 8);
local_74 = *(mstudio_rle_anim_t **)param_1;
}
else {
*(undefined4 *)pQVar22 = 0;
*(undefined4 *)(pQVar22 + 4) = 0;
*(undefined4 *)(pQVar22 + 8) = 0;
*(undefined4 *)(pQVar22 + 0xc) = 0x3f800000;
*(undefined4 *)pVVar21 = 0;
*(undefined4 *)(pVVar21 + 4) = 0;
*(undefined4 *)(pVVar21 + 8) = 0;
local_74 = *(mstudio_rle_anim_t **)param_1;
}
}
iVar6 = iVar6 + 1;
pQVar22 = pQVar22 + 0x10;
pmVar18 = pmVar18 + 0xd8;
pVVar21 = pVVar21 + 0xc;
} while (iVar6 < *(int *)((int)local_74 + 0x9c));
}
CalcZeroframeData(param_1,(studiohdr_t *)((int)local_74 + 0x9c),(virtualgroup_t *)0x0,
(mstudiobone_t *)((int)local_74 + *(int *)((int)local_74 + 0xa0)),this,
(float)param_2,(Vector *)param_3,(Quaternion *)param_8,(int)in_stack_ffffff38,
(float)in_stack_ffffff3c);
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.