L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)