L L4D2node

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