L L4D2node

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 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)