CalcVirtualAnimation
0x00b99480 · 3540 bytes · __regparm3
_ZL20CalcVirtualAnimationP14virtualmodel_tPK10CStudioHdrP6VectorP10QuaternionR16mstudioseqdesc_tiifi
Decompiled
undefined (9 params)
/* CalcVirtualAnimation(virtualmodel_t*, CStudioHdr const*, Vector*, Quaternion*, mstudioseqdesc_t&,
int, int, float, int) */
void __regparm3
CalcVirtualAnimation
(virtualmodel_t *param_1,CStudioHdr *param_2,Vector *param_3,Quaternion *param_4,
mstudioseqdesc_t *param_5,int param_6,int param_7,float param_8,int param_9)
{
Vector *pVVar1;
virtualgroup_t *pvVar2;
byte bVar3;
int iVar4;
int iVar5;
int iVar6;
matrix3x4_t *pmVar7;
char cVar8;
int iVar9;
mstudioanimdesc_t *this;
int iVar10;
float fVar11;
int *piVar12;
int iVar13;
Quaternion *pQVar14;
uint uVar15;
matrix3x4_t *pmVar16;
mstudiolocalhierarchy_t *pmVar17;
int iVar18;
int iVar19;
int iVar20;
mstudiobone_t *pmVar21;
int iVar22;
int *piVar23;
undefined4 *puVar24;
int iVar25;
int iVar26;
bool bVar27;
float in_XMM0_Da;
float fVar28;
Vector *in_stack_fffffd18;
Quaternion *in_stack_fffffd1c;
mstudio_rle_anim_t *in_stack_fffffd20;
Quaternion *in_stack_fffffd24;
int in_stack_fffffd28;
uchar *local_2c4;
mstudio_rle_anim_t *local_2c0;
int local_2ac;
int *local_2a0;
int local_290;
int local_28c;
mstudio_rle_anim_t *local_274;
float local_260;
float local_25c;
uchar *local_258;
undefined4 local_254;
undefined4 local_250;
undefined4 local_24c;
undefined4 local_248;
undefined4 local_244;
undefined4 local_240;
undefined4 local_23c;
undefined4 local_238;
undefined4 local_234;
undefined4 local_230;
undefined4 local_22c;
undefined4 local_228;
undefined4 local_224;
undefined4 local_220;
int local_21c [131];
iVar25 = *(int *)(param_6 * 0x10 + *(int *)(param_1 + 8) + 8) * 0x90 + *(int *)(param_1 + 0x58);
iVar9 = CStudioHdr::iRelativeAnim(param_2,param_6,param_7);
this = (mstudioanimdesc_t *)CStudioHdr::pAnimdesc(param_2,iVar9);
iVar10 = CStudioHdr::pSeqStudioHdr(param_2,param_6);
iVar22 = 0;
if ((*(int *)(iVar10 + 400) != 0) &&
(iVar19 = *(int *)(iVar10 + 400) + iVar10, iVar26 = *(int *)(iVar19 + 0x10), iVar26 != 0)) {
iVar22 = iVar19 + iVar26;
}
iVar26 = *(int *)(iVar10 + 0xa0);
pvVar2 = (virtualgroup_t *)
(*(int *)(*(int *)(param_1 + 0x1c) + iVar9 * 8) * 0x90 + *(int *)(param_1 + 0x58));
iVar9 = CStudioHdr::pAnimStudioHdr(param_2,iVar9);
local_290 = 0;
if (*(int *)(iVar9 + 400) != 0) {
iVar20 = *(int *)(iVar9 + 400) + iVar9;
iVar19 = *(int *)(iVar20 + 0x10);
local_290 = iVar20 + iVar19;
if (iVar19 == 0) {
local_290 = 0;
}
}
local_258 = (uchar *)0x0;
pmVar21 = (mstudiobone_t *)(*(int *)(iVar9 + 0xa0) + iVar9);
fVar28 = (float)(*(int *)(this + 0x10) + -1) * in_XMM0_Da;
fVar11 = (float)(int)fVar28;
fVar28 = fVar28 - (float)(int)fVar11;
local_260 = fVar11;
if (((byte)this[0xc] & 0x40) == 0) {
local_2c0 = (mstudio_rle_anim_t *)mstudioanimdesc_t::pAnim(this,(int *)&local_260,&local_25c);
bVar27 = false;
local_2ac = 0;
local_2c4 = (uchar *)0x0;
local_2a0 = (int *)0x0;
}
else {
piVar12 = (int *)mstudioanimdesc_t::pAnim(this,(int *)&local_260,&local_25c);
if (piVar12 == (int *)0x0) {
bVar27 = false;
local_2ac = 0;
local_2c4 = (uchar *)0x0;
local_2a0 = (int *)0x0;
local_2c0 = (mstudio_rle_anim_t *)0x0;
}
else {
local_2c0 = (mstudio_rle_anim_t *)0x0;
local_2a0 = piVar12 + 6;
local_2ac = piVar12[2];
local_258 = (uchar *)(*piVar12 + (int)piVar12);
local_2c4 = (uchar *)((int)piVar12 + (int)local_260 * local_2ac + piVar12[1]);
bVar27 = local_2c4 != (uchar *)0x0;
}
}
iVar19 = *(int *)(param_5 + 0x9c);
iVar20 = *(int *)param_2;
iVar4 = *(int *)(iVar20 + 0xa0);
iVar18 = *(int *)(iVar20 + 0x9c);
if (iVar18 < 1) {
local_28c = 0;
if ((((byte)this[0xc] & 4) != 0) || (iVar22 == 0)) goto LAB_00b997db;
}
else {
iVar5 = *(int *)(param_2 + 0x2c);
iVar13 = 0;
local_28c = 0;
do {
if ((((*(uint *)(iVar5 + iVar13 * 4) & (uint)param_8) != 0) &&
(iVar6 = *(int *)(*(int *)(iVar25 + 4) + iVar13 * 4), -1 < iVar6)) &&
(0.0 < *(float *)(param_5 + iVar6 * 4 + iVar19))) {
local_21c[local_28c] = iVar13;
local_28c = local_28c + 1;
}
iVar13 = iVar13 + 1;
} while (iVar13 != iVar18);
if (((byte)this[0xc] & 4) != 0) {
if (local_28c != 0) {
piVar12 = local_21c;
piVar23 = piVar12 + local_28c;
do {
iVar22 = *piVar12;
piVar12 = piVar12 + 1;
pQVar14 = param_4 + iVar22 * 0x10;
*(undefined4 *)pQVar14 = 0;
*(undefined4 *)(pQVar14 + 4) = 0;
*(undefined4 *)(pQVar14 + 8) = 0;
*(undefined4 *)(pQVar14 + 0xc) = 0x3f800000;
pVVar1 = param_3 + iVar22 * 0xc;
*(undefined4 *)pVVar1 = 0;
*(undefined4 *)(pVVar1 + 4) = 0;
*(undefined4 *)(pVVar1 + 8) = 0;
} while (piVar12 != piVar23);
}
goto LAB_00b997db;
}
if (iVar22 == 0) {
if (local_28c != 0) {
piVar12 = local_21c;
piVar23 = piVar12 + local_28c;
do {
iVar22 = *piVar12;
piVar12 = piVar12 + 1;
pQVar14 = param_4 + iVar22 * 0x10;
iVar18 = *(int *)(*(int *)(iVar25 + 4) + iVar22 * 4) * 0xd8 + iVar10 + iVar26;
*(undefined4 *)pQVar14 = *(undefined4 *)(iVar18 + 0x2c);
*(undefined4 *)(pQVar14 + 4) = *(undefined4 *)(iVar18 + 0x30);
*(undefined4 *)(pQVar14 + 8) = *(undefined4 *)(iVar18 + 0x34);
*(undefined4 *)(pQVar14 + 0xc) = *(undefined4 *)(iVar18 + 0x38);
pVVar1 = param_3 + iVar22 * 0xc;
*(undefined4 *)pVVar1 = *(undefined4 *)(iVar18 + 0x20);
*(undefined4 *)(pVVar1 + 4) = *(undefined4 *)(iVar18 + 0x24);
*(undefined4 *)(pVVar1 + 8) = *(undefined4 *)(iVar18 + 0x28);
} while (piVar12 != piVar23);
}
goto LAB_00b997db;
}
}
iVar10 = *(int *)(iVar22 + 0x10);
iVar26 = *(int *)(iVar22 + 0xc);
if (local_28c != 0) {
piVar12 = local_21c;
do {
piVar23 = piVar12 + 1;
iVar18 = *piVar12;
iVar5 = *(int *)(*(int *)(iVar25 + 4) + iVar18 * 4);
pQVar14 = param_4 + iVar18 * 0x10;
puVar24 = (undefined4 *)(iVar5 * 0x10 + iVar10 + iVar22);
*(undefined4 *)pQVar14 = *puVar24;
*(undefined4 *)(pQVar14 + 4) = puVar24[1];
*(undefined4 *)(pQVar14 + 8) = puVar24[2];
*(undefined4 *)(pQVar14 + 0xc) = puVar24[3];
puVar24 = (undefined4 *)(iVar26 + iVar22 + iVar5 * 0xc);
pVVar1 = param_3 + iVar18 * 0xc;
*(undefined4 *)pVVar1 = *puVar24;
*(undefined4 *)(pVVar1 + 4) = puVar24[1];
*(undefined4 *)(pVVar1 + 8) = puVar24[2];
piVar12 = piVar23;
} while (piVar23 != local_21c + local_28c);
}
LAB_00b997db:
*(int *)(param_2 + 0x5c) = *(int *)(param_2 + 0x5c) + local_28c;
if ((bVar27) && (local_258 != (uchar *)0x0)) {
if (fVar28 <= 0.0) {
iVar22 = 0;
if (0 < *(int *)(iVar9 + 0x9c)) {
do {
iVar10 = *(int *)(*(int *)(pvVar2 + 0x18) + iVar22 * 4);
if ((iVar10 < 0) ||
(((uint)param_8 & *(uint *)(*(int *)(param_2 + 0x2c) + iVar10 * 4)) == 0)) {
bVar3 = *(byte *)((int)local_2a0 + iVar22);
if (((bVar3 & 8) == 0) && (-1 < (char)bVar3)) {
if (((bVar3 & 2) != 0) || ((bVar3 & 0x40) != 0)) {
local_258 = local_258 + 6;
}
}
else {
local_2c4 = local_2c4 + 6;
}
if ((bVar3 & 4) == 0) {
if ((bVar3 & 1) == 0) {
if ((bVar3 & 0x10) == 0) {
if ((bVar3 & 0x20) != 0) {
local_258 = local_258 + 0xc;
}
}
else {
local_2c4 = local_2c4 + 0xc;
}
}
else {
local_258 = local_258 + 6;
}
}
else {
local_2c4 = local_2c4 + 6;
}
}
else {
in_stack_fffffd20 = (mstudio_rle_anim_t *)0x0;
in_stack_fffffd1c = (Quaternion *)0x0;
in_stack_fffffd18 = (Vector *)0x0;
local_2c4 = (uchar *)ExtractSingleFrame(*(uchar *)((int)local_2a0 + iVar22),local_2c4,
&local_258,param_4 + iVar10 * 0x10,
param_3 + iVar10 * 0xc,false,
(mstudiolinearbone_t *)0x0,0);
}
iVar22 = iVar22 + 1;
} while (iVar22 < *(int *)(iVar9 + 0x9c));
}
}
else if (0 < *(int *)(iVar9 + 0x9c)) {
iVar22 = 0;
do {
iVar10 = *(int *)(*(int *)(pvVar2 + 0x18) + iVar22 * 4);
if ((iVar10 < 0) ||
(((uint)param_8 & *(uint *)(*(int *)(param_2 + 0x2c) + iVar10 * 4)) == 0)) {
bVar3 = *(byte *)((int)local_2a0 + iVar22);
if (((bVar3 & 8) == 0) && (-1 < (char)bVar3)) {
if (((bVar3 & 2) != 0) || ((bVar3 & 0x40) != 0)) {
local_258 = local_258 + 6;
}
}
else {
local_2c4 = local_2c4 + 6;
}
if ((bVar3 & 4) == 0) {
if ((bVar3 & 1) == 0) {
if ((bVar3 & 0x10) == 0) {
if ((bVar3 & 0x20) != 0) {
local_258 = local_258 + 0xc;
}
}
else {
local_2c4 = local_2c4 + 0xc;
}
}
else {
local_258 = local_258 + 6;
}
}
else {
local_2c4 = local_2c4 + 6;
}
}
else {
in_stack_fffffd18 = (Vector *)(param_4 + iVar10 * 0x10);
in_stack_fffffd28 = 0;
in_stack_fffffd24 = (Quaternion *)0x0;
in_stack_fffffd1c = (Quaternion *)(param_3 + iVar10 * 0xc);
in_stack_fffffd20 = (mstudio_rle_anim_t *)0x0;
local_2c4 = (uchar *)ExtractTwoFrames(*(uchar *)((int)local_2a0 + iVar22),fVar28,local_2c4
,&local_258,local_2ac,
(Quaternion *)in_stack_fffffd18,
(Vector *)in_stack_fffffd1c,false,
(mstudiolinearbone_t *)0x0,0);
}
iVar22 = iVar22 + 1;
} while (iVar22 < *(int *)(iVar9 + 0x9c));
}
}
else {
if (local_2c0 == (mstudio_rle_anim_t *)0x0) {
CalcZeroframeData(param_2,(studiohdr_t *)(iVar9 + 0x9c),pvVar2,pmVar21,this,(float)param_3,
(Vector *)param_4,(Quaternion *)param_8,(int)in_stack_fffffd18,
(float)in_stack_fffffd1c);
return;
}
local_274 = local_2c0;
while (uVar15 = (uint)(byte)*local_274, *local_274 != (mstudio_rle_anim_t)0xff) {
iVar22 = *(int *)(*(int *)(pvVar2 + 0x18) + uVar15 * 4);
if (((-1 < iVar22) &&
(((uint)param_8 & *(uint *)(*(int *)(param_2 + 0x2c) + iVar22 * 4)) != 0)) &&
((iVar10 = *(int *)(*(int *)(iVar25 + 4) + iVar22 * 4), -1 < iVar10 &&
(0.0 < *(float *)(param_5 + iVar10 * 4 + iVar19))))) {
in_stack_fffffd24 = param_4 + iVar22 * 0x10;
in_stack_fffffd20 = local_274;
if (local_290 == 0) {
in_stack_fffffd1c = (Quaternion *)(pmVar21 + uVar15 * 0xd8 + 0x90);
CalcBoneQuaternion((int)local_260,fVar28,(Quaternion *)(pmVar21 + uVar15 * 0xd8 + 0x2c),
(RadianEuler *)(pmVar21 + uVar15 * 0xd8 + 0x3c),
(Vector *)(pmVar21 + uVar15 * 0xd8 + 0x54),
*(int *)(pmVar21 + uVar15 * 0xd8 + 0xa0),in_stack_fffffd1c,local_274,
in_stack_fffffd24);
in_stack_fffffd18 = param_3 + iVar22 * 0xc;
CalcBonePosition((int)local_260,fVar28,
(Vector *)(pmVar21 + (uint)(byte)*local_274 * 0xd8 + 0x20),
(Vector *)(pmVar21 + (uint)(byte)*local_274 * 0xd8 + 0x48),local_274,
in_stack_fffffd18);
}
else {
iVar26 = uVar15 * 0x10 + local_290;
puVar24 = (undefined4 *)(*(int *)(local_290 + 0x24) + iVar26);
local_22c = *puVar24;
local_228 = puVar24[1];
local_224 = puVar24[2];
local_220 = puVar24[3];
iVar10 = local_290 + uVar15 * 0xc;
puVar24 = (undefined4 *)(*(int *)(local_290 + 0x20) + iVar10);
local_248 = *puVar24;
local_244 = puVar24[1];
local_240 = puVar24[2];
puVar24 = (undefined4 *)(iVar10 + *(int *)(local_290 + 0x14));
local_254 = *puVar24;
local_250 = puVar24[1];
local_24c = puVar24[2];
puVar24 = (undefined4 *)(iVar26 + *(int *)(local_290 + 0x10));
in_stack_fffffd1c = (Quaternion *)&local_22c;
local_23c = *puVar24;
local_238 = puVar24[1];
local_234 = puVar24[2];
local_230 = puVar24[3];
CalcBoneQuaternion((int)local_260,fVar28,(Quaternion *)&local_23c,
(RadianEuler *)&local_254,(Vector *)&local_248,
*(int *)(uVar15 * 4 + local_290 + *(int *)(local_290 + 4)),
in_stack_fffffd1c,local_274,in_stack_fffffd24);
iVar10 = local_290 + (uint)(byte)*local_274 * 0xc;
puVar24 = (undefined4 *)(*(int *)(local_290 + 0x1c) + iVar10);
local_22c = *puVar24;
local_228 = puVar24[1];
local_224 = puVar24[2];
puVar24 = (undefined4 *)(iVar10 + *(int *)(local_290 + 0xc));
local_23c = *puVar24;
local_238 = puVar24[1];
local_234 = puVar24[2];
in_stack_fffffd18 = param_3 + iVar22 * 0xc;
CalcBonePosition((int)local_260,fVar28,(Vector *)&local_23c,(Vector *)&local_22c,local_274
,in_stack_fffffd18);
}
*(int *)(param_2 + 0x58) = *(int *)(param_2 + 0x58) + 1;
}
if ((*(short *)(local_274 + 2) == 0) ||
(local_274 = local_274 + *(short *)(local_274 + 2), local_274 == (mstudio_rle_anim_t *)0x0)
) break;
}
}
if (0.0 < local_25c) {
CalcZeroframeData(param_2,(studiohdr_t *)(iVar9 + 0x9c),pvVar2,pmVar21,this,(float)param_3,
(Vector *)param_4,(Quaternion *)param_8,(int)in_stack_fffffd18,
(float)in_stack_fffffd1c);
}
if (*(int *)(this + 0x48) == 0) {
return;
}
do {
pmVar16 = g_MatrixPool;
if (g_MatrixPool == (matrix3x4_t *)0x0) {
pmVar16 = (matrix3x4_t *)memalign(0x10,0x1800);
if (((uint)pmVar16 & 0xf) != 0) {
raise(5);
}
break;
}
cVar8 = ThreadInterlockedAssignIf64
(&g_MatrixPool,*(undefined4 *)g_MatrixPool,DAT_01047874 + -1,g_MatrixPool,
DAT_01047874);
} while (cVar8 == '\0');
iVar22 = 0;
local_22c = 0;
local_228 = 0;
local_224 = 0;
local_220 = 0;
if (0 < *(int *)(this + 0x48)) {
do {
pmVar17 = (mstudiolocalhierarchy_t *)mstudioanimdesc_t::pHierarchy(this,iVar22);
if (pmVar17 == (mstudiolocalhierarchy_t *)0x0) break;
iVar9 = *(int *)(*(int *)(pvVar2 + 0x18) + *(int *)pmVar17 * 4);
if ((((-1 < iVar9) && (((uint)param_8 & *(uint *)(*(int *)(param_2 + 0x2c) + iVar9 * 4)) != 0)
) && (iVar10 = *(int *)(*(int *)(pvVar2 + 0x18) + *(int *)(pmVar17 + 4) * 4), -1 < iVar10
)) && (((uint)param_8 & *(uint *)(*(int *)(param_2 + 0x2c) + iVar10 * 4)) != 0)) {
CalcLocalHierarchyAnimation
(param_2,pmVar16,(CBoneBitList *)&local_22c,param_3,param_4,
(mstudiobone_t *)(iVar20 + iVar4),pmVar17,iVar9,iVar10,fVar11,
(int)in_stack_fffffd20,(float)in_stack_fffffd24,in_stack_fffffd28);
}
iVar22 = iVar22 + 1;
} while (iVar22 < *(int *)(this + 0x48));
}
do {
iVar22 = DAT_01047874;
pmVar7 = g_MatrixPool;
iVar9 = DAT_01047874 + 0x10001;
*(matrix3x4_t **)pmVar16 = g_MatrixPool;
cVar8 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar16,iVar9,pmVar7,iVar22);
} while (cVar8 == '\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.