CIKContext::SolveDependencies
0x00b87ab0 · 2163 bytes · __thiscall
_ZN10CIKContext17SolveDependenciesEP6VectorP10QuaternionP11matrix3x4_tR12CBoneBitList
Decompiled
undefined (5 params)
/* CIKContext::SolveDependencies(Vector*, Quaternion*, matrix3x4_t*, CBoneBitList&) */
void __thiscall
CIKContext::SolveDependencies
(CIKContext *this,Vector *param_1,Quaternion *param_2,matrix3x4_t *param_3,
CBoneBitList *param_4)
{
mstudioikchain_t *pmVar1;
int iVar2;
float fVar3;
float fVar4;
int iVar5;
char cVar6;
CStudioHdr *pCVar7;
int *piVar8;
int iVar9;
Vector *pVVar10;
CIKContext *pCVar11;
int iVar12;
Vector *pVVar13;
Quaternion *pQVar14;
int iVar15;
float fVar16;
float fVar17;
float fVar18;
int local_55c;
int local_554;
float local_548;
float local_544;
float local_540;
float local_53c;
float local_538;
float local_534;
matrix3x4_t local_52c [48];
float local_4fc;
float local_4f8;
float local_4f4;
Quaternion local_4cc [48];
float local_49c [3];
Quaternion aQStack_490 [4];
Quaternion local_48c [16];
float local_47c [283];
iVar15 = 0;
pCVar7 = *(CStudioHdr **)(this + 0xff8);
iVar9 = *(int *)pCVar7;
pQVar14 = local_48c;
if (0 < *(int *)(iVar9 + 0x11c)) {
do {
while( true ) {
iVar9 = iVar9 + iVar15 * 0x10 + *(int *)(iVar9 + 0x120);
iVar9 = *(int *)(iVar9 + 0x38 + *(int *)(iVar9 + 0xc));
*(undefined4 *)(pQVar14 + -0x10) = 0xffffffff;
*(undefined4 *)(pQVar14 + 0x10) = 0;
if ((*(uint *)(this + 0x105c) & *(uint *)(*(int *)(pCVar7 + 0x2c) + iVar9 * 4)) == 0) break;
iVar15 = iVar15 + 1;
::BuildBoneChain(pCVar7,(matrix3x4_t *)(this + 0x1024),param_1,param_2,iVar9,param_3,param_4
);
MatrixAngles(param_3 + iVar9 * 0x30,pQVar14,(Vector *)(pQVar14 + -0xc));
pCVar7 = *(CStudioHdr **)(this + 0xff8);
iVar9 = *(int *)pCVar7;
pQVar14 = pQVar14 + 0x24;
if (*(int *)(iVar9 + 0x11c) <= iVar15) goto LAB_00b87ba8;
}
iVar9 = *(int *)pCVar7;
iVar15 = iVar15 + 1;
pQVar14 = pQVar14 + 0x24;
} while (iVar15 < *(int *)(iVar9 + 0x11c));
}
LAB_00b87ba8:
if (0 < *(int *)(this + 0x1008)) {
iVar9 = *(int *)(this + 0xffc);
local_55c = 0;
do {
piVar8 = (int *)(iVar9 + local_55c * 0x14);
if (0 < piVar8[3]) {
iVar15 = 0;
do {
iVar12 = iVar15 * 0x84 + *piVar8;
iVar5 = *(int *)(iVar12 + 8);
iVar2 = iVar5 * 0x24;
local_49c[iVar5 * 9] = -NAN;
if (*(int *)(iVar12 + 4) == 1) {
QuaternionMatrix((Quaternion *)(iVar12 + 0x2c),(Vector *)(iVar12 + 0x20),
(matrix3x4_t *)local_4cc);
if (*(int *)(iVar12 + 0xc) == -1) {
ConcatTransforms((matrix3x4_t *)(this + 0x1024),(matrix3x4_t *)local_4cc,local_52c);
}
else {
::BuildBoneChain(*(CStudioHdr **)(this + 0xff8),(matrix3x4_t *)(this + 0x1024),param_1
,param_2,*(int *)(iVar12 + 0xc),param_3,param_4);
ConcatTransforms_Aligned
(param_3 + *(int *)(iVar12 + 0xc) * 0x30,(matrix3x4_t *)local_4cc,local_52c)
;
}
fVar16 = *(float *)(iVar12 + 0x60) * *(float *)(iVar12 + 0x5c);
fVar17 = 1.0 - fVar16;
local_47c[iVar5 * 9] = fVar17 * local_47c[iVar5 * 9] + fVar16;
MatrixAngles(local_52c,(Quaternion *)&local_4fc,(Vector *)&local_53c);
fVar3 = *(float *)(local_48c + iVar2 + -4);
fVar4 = local_49c[iVar5 * 9 + 1];
local_49c[iVar5 * 9 + 2] = local_49c[iVar5 * 9 + 2] * fVar17 + local_538 * fVar16;
*(float *)(local_48c + iVar2 + -4) = fVar3 * fVar17 + local_534 * fVar16;
local_49c[iVar5 * 9 + 1] = fVar17 * fVar4 + local_53c * fVar16;
QuaternionSlerp(local_48c + iVar2,(Quaternion *)&local_4fc,fVar16,local_48c + iVar2);
iVar9 = *(int *)(this + 0xffc);
}
else if (*(int *)(iVar12 + 4) == 4) {
fVar16 = *(float *)(iVar12 + 0x60) * *(float *)(iVar12 + 0x5c);
iVar9 = *(int *)*(CStudioHdr **)(this + 0xff8);
iVar9 = iVar9 + *(int *)(iVar12 + 8) * 0x10 + *(int *)(iVar9 + 0x120);
iVar9 = *(int *)(iVar9 + 0x38 + *(int *)(iVar9 + 0xc));
::BuildBoneChain(*(CStudioHdr **)(this + 0xff8),(matrix3x4_t *)(this + 0x1024),param_1,
param_2,iVar9,param_3,param_4);
MatrixAngles(param_3 + iVar9 * 0x30,local_4cc,(Vector *)&local_4fc);
fVar17 = 1.0 - fVar16;
fVar3 = *(float *)(local_48c + iVar2 + -4);
fVar4 = local_49c[iVar5 * 9 + 1];
local_49c[iVar5 * 9 + 2] = local_49c[iVar5 * 9 + 2] * fVar17 + local_4f8 * fVar16;
*(float *)(local_48c + iVar2 + -4) = fVar3 * fVar17 + local_4f4 * fVar16;
local_49c[iVar5 * 9 + 1] = fVar17 * fVar4 + local_4fc * fVar16;
QuaternionSlerp(local_48c + iVar2,local_4cc,fVar16,local_48c + iVar2);
iVar9 = *(int *)(this + 0xffc);
}
iVar15 = iVar15 + 1;
piVar8 = (int *)(iVar9 + local_55c * 0x14);
} while (iVar15 < piVar8[3]);
}
local_55c = local_55c + 1;
} while (local_55c < *(int *)(this + 0x1008));
}
if (0 < *(int *)(this + 0xff0)) {
pVVar10 = (Vector *)(this + 0x60);
pCVar11 = this + 0xf0;
local_554 = 0;
pVVar13 = pVVar10;
do {
if (0.0 < *(float *)(pVVar13 + -4)) {
iVar15 = *(int *)(pVVar13 + -0x60);
iVar9 = iVar15 * 0x24;
QuaternionAngles((Quaternion *)(pVVar13 + -0x48),(RadianEuler *)&local_4fc);
AngleMatrix((RadianEuler *)&local_4fc,pVVar13 + -0x54,(matrix3x4_t *)local_4cc);
QuaternionAngles((Quaternion *)(pVVar13 + 0xc),(RadianEuler *)&local_53c);
AngleMatrix((RadianEuler *)&local_53c,pVVar13,(matrix3x4_t *)&local_4fc);
ConcatTransforms((matrix3x4_t *)&local_4fc,(matrix3x4_t *)local_4cc,local_52c);
MatrixAngles(local_52c,(Quaternion *)&local_53c,(Vector *)&local_548);
fVar3 = *(float *)(pVVar13 + -4);
fVar4 = local_49c[iVar15 * 9 + 2];
local_47c[iVar15 * 9] = fVar3;
fVar18 = 1.0 - fVar3;
fVar16 = *(float *)(local_48c + iVar9 + -4);
fVar17 = local_49c[iVar15 * 9 + 1];
local_49c[iVar15 * 9 + 2] = fVar4 * fVar18 + local_544 * fVar3;
*(float *)(local_48c + iVar9 + -4) = fVar16 * fVar18 + local_540 * fVar3;
local_49c[iVar15 * 9 + 1] = fVar18 * fVar17 + local_548 * fVar3;
QuaternionSlerp(local_48c + iVar9,(Quaternion *)&local_53c,fVar3,local_48c + iVar9);
}
if (pVVar13[0x68] != (Vector)0x0) {
pVVar13[0x69] = (Vector)0x1;
*(undefined4 *)(pVVar13 + 0x9c) = *(undefined4 *)(pVVar13 + 0xc);
*(undefined4 *)(pVVar13 + 0xa0) = *(undefined4 *)(pVVar13 + 0x10);
*(undefined4 *)(pVVar13 + 0xa4) = *(undefined4 *)(pVVar13 + 0x14);
*(undefined4 *)(pVVar13 + 0xa8) = *(undefined4 *)(pVVar13 + 0x18);
*(undefined4 *)pCVar11 = *(undefined4 *)pVVar10;
*(undefined4 *)(pCVar11 + 4) = *(undefined4 *)(pVVar10 + 4);
*(undefined4 *)(pCVar11 + 8) = *(undefined4 *)(pVVar10 + 8);
}
pVVar10 = pVVar10 + 0x154;
pCVar11 = pCVar11 + 0x154;
local_554 = local_554 + 1;
pVVar13 = pVVar13 + 0x154;
} while (local_554 < *(int *)(this + 0xff0));
}
piVar8 = *(int **)(this + 0xff8);
iVar15 = 0;
pQVar14 = local_48c;
iVar9 = *piVar8;
if (*(int *)(iVar9 + 0x11c) < 1) {
return;
}
do {
while (*(float *)(pQVar14 + 0x10) <= 0.0) {
LAB_00b881aa:
iVar9 = *piVar8;
iVar15 = iVar15 + 1;
pQVar14 = pQVar14 + 0x24;
if (*(int *)(iVar9 + 0x11c) <= iVar15) {
return;
}
}
pmVar1 = (mstudioikchain_t *)(iVar9 + iVar15 * 0x10 + *(int *)(iVar9 + 0x120));
cVar6 = Studio_SolveIK(pmVar1,(Vector *)(pQVar14 + -0xc),param_3);
if (cVar6 == '\0') {
iVar9 = *(int *)(pQVar14 + -0x10);
if (iVar9 != -1) {
*(float *)(this + iVar9 * 0x154 + 0x10c) = *(float *)(this + iVar9 * 0x154 + 0x10c) * 0.8;
*(float *)(this + iVar9 * 0x154 + 0x110) = *(float *)(this + iVar9 * 0x154 + 0x110) * 0.8;
*(float *)(this + iVar9 * 0x154 + 0x114) = *(float *)(this + iVar9 * 0x154 + 0x114) * 0.8;
QuaternionScale((Quaternion *)(this + iVar9 * 0x154 + 0x118),0.8,
(Quaternion *)(this + iVar9 * 0x154 + 0x118));
}
piVar8 = *(int **)(this + 0xff8);
goto LAB_00b881aa;
}
iVar15 = iVar15 + 1;
MatrixGetColumn(param_3 + *(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x38) * 0x30,3,
(Vector *)local_4cc);
QuaternionMatrix(pQVar14,(Vector *)local_4cc,
param_3 + *(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x38) * 0x30);
SolveBone(*(CStudioHdr **)(this + 0xff8),*(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x38),
param_3,param_1,param_2);
SolveBone(*(CStudioHdr **)(this + 0xff8),*(int *)(pmVar1 + *(int *)(pmVar1 + 0xc) + 0x1c),
param_3,param_1,param_2);
SolveBone(*(CStudioHdr **)(this + 0xff8),*(int *)(pmVar1 + *(int *)(pmVar1 + 0xc)),param_3,
param_1,param_2);
piVar8 = *(int **)(this + 0xff8);
iVar9 = *piVar8;
pQVar14 = pQVar14 + 0x24;
if (*(int *)(iVar9 + 0x11c) <= iVar15) {
return;
}
} while( true );
}
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.