L L4D2node

WorldSpaceSlerp

0x00b90840 · 1904 bytes · __cdecl

_Z15WorldSpaceSlerpPK10CStudioHdrP10QuaternionP6VectorR16mstudioseqdesc_tiPKS2_PKS4_fi

Decompiled

undefined (9 params)

/* WorldSpaceSlerp(CStudioHdr const*, Quaternion*, Vector*, mstudioseqdesc_t&, int, Quaternion
   const*, Vector const*, float, int) */

void WorldSpaceSlerp(CStudioHdr *param_1,Quaternion *param_2,Vector *param_3,
                    mstudioseqdesc_t *param_4,int param_5,Quaternion *param_6,Vector *param_7,
                    float param_8,int param_9)

{
  float fVar1;
  float fVar2;
  int iVar3;
  int iVar4;
  char cVar5;
  matrix3x4_t *pmVar6;
  matrix3x4_t *pmVar7;
  int iVar8;
  matrix3x4_t *pmVar9;
  matrix3x4_t *pmVar10;
  Vector *pVVar11;
  int iVar12;
  Vector *pVVar13;
  float fVar14;
  int local_154;
  int local_14c;
  int local_144;
  Quaternion *local_140;
  Vector local_130 [12];
  Vector local_124 [12];
  Vector local_118 [12];
  undefined4 local_10c;
  undefined4 local_108;
  undefined4 local_104;
  undefined4 local_100;
  undefined4 local_fc;
  undefined4 local_f8;
  undefined4 local_f4;
  undefined4 local_f0;
  undefined4 local_ec;
  undefined4 local_e8;
  undefined4 local_e4;
  undefined4 local_e0;
  Quaternion local_dc [16];
  Quaternion local_cc [16];
  Quaternion local_bc [16];
  matrix3x4_t local_ac [48];
  matrix3x4_t local_7c [48];
  RadianEuler local_4c [60];
  
  SetIdentityMatrix(local_ac);
  do {
    pmVar6 = g_MatrixPool;
    if (g_MatrixPool == (matrix3x4_t *)0x0) {
      pmVar6 = (matrix3x4_t *)memalign(0x10,0x1800);
      if (((uint)pmVar6 & 0xf) != 0) {
        raise(5);
      }
      break;
    }
    cVar5 = ThreadInterlockedAssignIf64
                      (&g_MatrixPool,*(undefined4 *)g_MatrixPool,DAT_01047874 + -1,g_MatrixPool,
                       DAT_01047874);
  } while (cVar5 == '\0');
  local_10c = 0;
  local_108 = 0;
  local_104 = 0;
  local_100 = 0;
  do {
    pmVar7 = g_MatrixPool;
    if (g_MatrixPool == (matrix3x4_t *)0x0) {
      pmVar7 = (matrix3x4_t *)memalign(0x10,0x1800);
      if (((uint)pmVar7 & 0xf) != 0) {
        raise(5);
      }
      break;
    }
    cVar5 = ThreadInterlockedAssignIf64
                      (&g_MatrixPool,*(undefined4 *)g_MatrixPool,DAT_01047874 + -1,g_MatrixPool,
                       DAT_01047874);
  } while (cVar5 == '\0');
  local_fc = 0;
  local_f8 = 0;
  local_f4 = 0;
  local_f0 = 0;
  do {
    pmVar10 = g_MatrixPool;
    g_MatrixPool = pmVar10;
    if (pmVar10 == (matrix3x4_t *)0x0) {
      pmVar10 = (matrix3x4_t *)memalign(0x10,0x1800);
      if (((uint)pmVar10 & 0xf) != 0) {
        raise(5);
      }
      break;
    }
    cVar5 = ThreadInterlockedAssignIf64
                      (&g_MatrixPool,*(undefined4 *)pmVar10,DAT_01047874 + -1,pmVar10,DAT_01047874);
  } while (cVar5 == '\0');
  local_ec = 0;
  local_e8 = 0;
  local_e4 = 0;
  local_e0 = 0;
  iVar8 = *(int *)(param_1 + 4);
  if (iVar8 == 0) {
    local_154 = 0;
  }
  else {
    local_154 = *(int *)(param_5 * 0x10 + *(int *)(iVar8 + 8) + 8) * 0x90 + *(int *)(iVar8 + 0x58);
  }
  iVar8 = *(int *)param_1;
  local_144 = *(int *)(iVar8 + 0xa0) + iVar8;
  if (0 < *(int *)(iVar8 + 0x9c)) {
    local_14c = 0;
    local_140 = param_2;
    iVar12 = 0;
    pVVar11 = param_3;
    pVVar13 = param_7;
    do {
      if ((param_9 & *(uint *)(*(int *)(param_1 + 0x2c) + iVar12 * 4)) != 0) {
        iVar3 = *(int *)(local_144 + 4);
        if (local_154 == 0) {
          fVar14 = param_8 * *(float *)(param_4 + iVar12 * 4 + *(int *)(param_4 + 0x9c));
          if (iVar3 != -1) {
            fVar1 = *(float *)(param_4 + *(int *)(param_4 + 0x9c) + iVar3 * 4);
LAB_00b90bcb:
            if ((fVar14 == 1.0) && (param_8 * fVar1 == 1.0)) {
              iVar8 = iVar12 * 0x10;
              *(float *)pVVar11 = *(float *)pVVar13;
              *(float *)(pVVar11 + 4) = *(float *)(pVVar13 + 4);
              *(float *)(pVVar11 + 8) = *(float *)(pVVar13 + 8);
              *(undefined4 *)local_140 = *(undefined4 *)(param_6 + iVar8);
              *(undefined4 *)(local_140 + 4) = *(undefined4 *)(param_6 + iVar8 + 4);
              *(undefined4 *)(local_140 + 8) = *(undefined4 *)(param_6 + iVar8 + 8);
              *(undefined4 *)(local_140 + 0xc) = *(undefined4 *)(param_6 + iVar8 + 0xc);
              iVar8 = *(int *)param_1;
              goto LAB_00b90b03;
            }
          }
        }
        else {
          iVar4 = *(int *)(*(int *)(local_154 + 4) + iVar12 * 4);
          if (iVar4 < 0) goto LAB_00b90b03;
          fVar14 = param_8 * *(float *)(param_4 + *(int *)(param_4 + 0x9c) + iVar4 * 4);
          if (iVar3 != -1) {
            fVar1 = *(float *)(param_4 +
                              *(int *)(param_4 + 0x9c) +
                              *(int *)(*(int *)(local_154 + 4) + iVar3 * 4) * 4);
            goto LAB_00b90bcb;
          }
        }
        if (0.0 < fVar14) {
          BuildBoneChain(param_1,local_ac,param_3,param_2,iVar12,pmVar7,(CBoneBitList *)&local_fc);
          BuildBoneChain(param_1,local_ac,param_7,param_6,iVar12,pmVar6,(CBoneBitList *)&local_10c);
          MatrixAngles(pmVar7 + local_14c,local_cc,local_124);
          MatrixAngles(pmVar6 + local_14c,local_dc,local_130);
          QuaternionSlerp(local_cc,local_dc,fVar14,local_bc);
          pmVar9 = pmVar10 + local_14c;
          QuaternionAngles(local_bc,local_4c);
          AngleMatrix(local_4c,local_124,pmVar9);
          if (iVar3 == -1) {
            MatrixAngles(pmVar9,local_140,local_118);
            iVar8 = *(int *)param_1;
          }
          else {
            MatrixInvert(pmVar10 + iVar3 * 0x30,local_7c);
            ConcatTransforms_Aligned(local_7c,pmVar9,(matrix3x4_t *)local_4c);
            MatrixAngles((matrix3x4_t *)local_4c,local_140,local_118);
            fVar1 = *(float *)(pVVar13 + 8);
            fVar2 = *(float *)pVVar13;
            *(float *)(pVVar11 + 4) =
                 (*(float *)(pVVar13 + 4) - *(float *)(pVVar11 + 4)) * fVar14 +
                 *(float *)(pVVar11 + 4);
            *(float *)(pVVar11 + 8) =
                 (fVar1 - *(float *)(pVVar11 + 8)) * fVar14 + *(float *)(pVVar11 + 8);
            *(float *)pVVar11 = (fVar2 - *(float *)pVVar11) * fVar14 + *(float *)pVVar11;
            iVar8 = *(int *)param_1;
          }
        }
      }
LAB_00b90b03:
      iVar12 = iVar12 + 1;
      pVVar13 = pVVar13 + 0xc;
      pVVar11 = pVVar11 + 0xc;
      local_140 = local_140 + 0x10;
      local_144 = local_144 + 0xd8;
      local_14c = local_14c + 0x30;
    } while (iVar12 < *(int *)(iVar8 + 0x9c));
  }
  do {
    iVar8 = DAT_01047874;
    pmVar9 = g_MatrixPool;
    iVar12 = DAT_01047874 + 0x10001;
    *(matrix3x4_t **)pmVar6 = g_MatrixPool;
    cVar5 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar6,iVar12,pmVar9,iVar8);
  } while (cVar5 == '\0');
  do {
    iVar8 = DAT_01047874;
    pmVar6 = g_MatrixPool;
    iVar12 = DAT_01047874 + 0x10001;
    *(matrix3x4_t **)pmVar7 = g_MatrixPool;
    cVar5 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar7,iVar12,pmVar6,iVar8);
  } while (cVar5 == '\0');
  do {
    iVar8 = DAT_01047874;
    pmVar6 = g_MatrixPool;
    iVar12 = DAT_01047874 + 0x10001;
    *(matrix3x4_t **)pmVar10 = g_MatrixPool;
    cVar5 = ThreadInterlockedAssignIf64(&g_MatrixPool,pmVar10,iVar12,pmVar6,iVar8);
  } while (cVar5 == '\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)