L L4D2node

LightDesc_t::ComputeLightAtPoints

0x002712d0 · 620 bytes · __thiscall

_ZNK11LightDesc_t20ComputeLightAtPointsERK11FourVectorsS2_RS0_b

Decompiled

undefined (5 params)

/* LightDesc_t::ComputeLightAtPoints(FourVectors const&, FourVectors const&, FourVectors&, bool)
   const */

void __thiscall
LightDesc_t::ComputeLightAtPoints
          (LightDesc_t *this,FourVectors *param_1,FourVectors *param_2,FourVectors *param_3,
          bool param_4)

{
  float fVar1;
  float fVar2;
  undefined4 uVar3;
  int iVar4;
  uint uVar5;
  float in_XMM0_Da;
  float in_XMM0_Db;
  float in_XMM0_Dc;
  float in_XMM0_Dd;
  undefined1 auVar6 [16];
  float in_XMM1_Da;
  float in_XMM1_Db;
  float in_XMM1_Dc;
  float in_XMM1_Dd;
  float fVar7;
  float in_XMM2_Da;
  float fVar8;
  float in_XMM2_Db;
  float fVar9;
  float in_XMM2_Dc;
  float fVar10;
  float in_XMM2_Dd;
  float fVar11;
  float fVar12;
  undefined1 auVar13 [16];
  undefined1 auVar14 [16];
  undefined1 auVar15 [16];
  float fVar16;
  undefined1 auVar17 [16];
  float fVar19;
  undefined1 auVar18 [16];
  undefined1 auVar20 [16];
  undefined1 in_XMM7 [16];
  undefined1 auVar21 [16];
  undefined1 local_2c [16];
  
  iVar4 = *(int *)this;
  if (iVar4 == 2) {
    ComputeLightAtPointsForDirectional(this,param_1,param_2,param_3,param_4);
    return;
  }
  if ((iVar4 == 3) || (iVar4 == 1)) {
    fVar7 = *(float *)(this + 0x10);
    fVar12 = *(float *)(this + 0x14);
    fVar10 = *(float *)(this + 0x18);
    in_XMM2_Da = fVar7 - *(float *)param_1;
    in_XMM2_Db = fVar7 - *(float *)(param_1 + 4);
    in_XMM2_Dc = fVar7 - *(float *)(param_1 + 8);
    in_XMM2_Dd = fVar7 - *(float *)(param_1 + 0xc);
    in_XMM1_Da = fVar12 - *(float *)(param_1 + 0x10);
    in_XMM1_Db = fVar12 - *(float *)(param_1 + 0x14);
    in_XMM1_Dc = fVar12 - *(float *)(param_1 + 0x18);
    in_XMM1_Dd = fVar12 - *(float *)(param_1 + 0x1c);
    in_XMM0_Da = fVar10 - *(float *)(param_1 + 0x20);
    in_XMM0_Db = fVar10 - *(float *)(param_1 + 0x24);
    in_XMM0_Dc = fVar10 - *(float *)(param_1 + 0x28);
    in_XMM0_Dd = fVar10 - *(float *)(param_1 + 0x2c);
  }
  uVar5 = *(uint *)(this + 0x50);
  auVar20._0_4_ = in_XMM0_Da * in_XMM0_Da + in_XMM1_Da * in_XMM1_Da + in_XMM2_Da * in_XMM2_Da;
  auVar20._4_4_ = in_XMM0_Db * in_XMM0_Db + in_XMM1_Db * in_XMM1_Db + in_XMM2_Db * in_XMM2_Db;
  auVar20._8_4_ = in_XMM0_Dc * in_XMM0_Dc + in_XMM1_Dc * in_XMM1_Dc + in_XMM2_Dc * in_XMM2_Dc;
  auVar20._12_4_ = in_XMM0_Dd * in_XMM0_Dd + in_XMM1_Dd * in_XMM1_Dd + in_XMM2_Dd * in_XMM2_Dd;
  auVar17 = maxps(Four_Ones,auVar20);
  auVar14 = Four_Epsilons;
  if ((uVar5 & 1) != 0) {
    uVar3 = *(undefined4 *)(this + 0x30);
    auVar14._4_4_ = uVar3;
    auVar14._0_4_ = uVar3;
    auVar14._8_4_ = uVar3;
    auVar14._12_4_ = uVar3;
  }
  auVar13 = auVar14;
  if ((uVar5 & 2) != 0) {
    auVar21 = sqrtps(in_XMM7,auVar17);
    fVar7 = *(float *)(this + 0x34);
    auVar13._0_4_ = auVar14._0_4_ + fVar7 * auVar21._0_4_;
    auVar13._4_4_ = auVar14._4_4_ + fVar7 * auVar21._4_4_;
    auVar13._8_4_ = auVar14._8_4_ + fVar7 * auVar21._8_4_;
    auVar13._12_4_ = auVar14._12_4_ + fVar7 * auVar21._12_4_;
  }
  auVar21 = auVar13;
  if ((uVar5 & 4) != 0) {
    fVar7 = *(float *)(this + 0x38);
    auVar21._0_4_ = auVar13._0_4_ + fVar7 * auVar17._0_4_;
    auVar21._4_4_ = auVar13._4_4_ + fVar7 * auVar17._4_4_;
    auVar21._8_4_ = auVar13._8_4_ + fVar7 * auVar17._8_4_;
    auVar21._12_4_ = auVar13._12_4_ + fVar7 * auVar17._12_4_;
  }
  auVar14 = rcpps(auVar21,auVar21);
  auVar15 = auVar14;
  if (*(float *)(this + 0x28) != 0.0) {
    fVar7 = *(float *)(this + 0x54);
    auVar15._0_4_ = auVar14._0_4_ & -(uint)(auVar17._0_4_ < fVar7);
    auVar15._4_4_ = auVar14._4_4_ & -(uint)(auVar17._4_4_ < fVar7);
    auVar15._8_4_ = auVar14._8_4_ & -(uint)(auVar17._8_4_ < fVar7);
    auVar15._12_4_ = auVar14._12_4_ & -(uint)(auVar17._12_4_ < fVar7);
  }
  auVar14 = rsqrtps(auVar20,auVar20);
  fVar7 = auVar14._0_4_;
  fVar12 = auVar14._4_4_;
  fVar10 = auVar14._8_4_;
  fVar11 = auVar14._12_4_;
  auVar17._0_4_ =
       *(float *)(param_2 + 0x20) * in_XMM0_Da * fVar7 +
       *(float *)(param_2 + 0x10) * in_XMM1_Da * fVar7 + *(float *)param_2 * in_XMM2_Da * fVar7;
  auVar17._4_4_ =
       *(float *)(param_2 + 0x24) * in_XMM0_Db * fVar12 +
       *(float *)(param_2 + 0x14) * in_XMM1_Db * fVar12 +
       *(float *)(param_2 + 4) * in_XMM2_Db * fVar12;
  auVar17._8_4_ =
       *(float *)(param_2 + 0x28) * in_XMM0_Dc * fVar10 +
       *(float *)(param_2 + 0x18) * in_XMM1_Dc * fVar10 +
       *(float *)(param_2 + 8) * in_XMM2_Dc * fVar10;
  auVar17._12_4_ =
       *(float *)(param_2 + 0x2c) * in_XMM0_Dd * fVar11 +
       *(float *)(param_2 + 0x1c) * in_XMM1_Dd * fVar11 +
       *(float *)(param_2 + 0xc) * in_XMM2_Dd * fVar11;
  if (param_4) {
    auVar18._0_4_ = auVar17._0_4_ * (float)0x3f000000 + (float)0x3f000000;
    auVar18._4_4_ = auVar17._4_4_ * (float)0x3f000000 + (float)0x3f000000;
    auVar18._8_4_ = auVar17._8_4_ * (float)0x3f000000 + (float)0x3f000000;
    auVar18._12_4_ = auVar17._12_4_ * (float)0x3f000000 + (float)0x3f000000;
  }
  else {
    auVar18 = maxps(auVar17,Four_Zeros);
  }
  if (iVar4 == 3) {
    fVar16 = *(float *)(this + 0x1c);
    fVar19 = *(float *)(this + 0x20);
    fVar1 = *(float *)(this + 0x24);
    fVar2 = *(float *)(this + 0x4c);
    fVar8 = (float)0 -
            (fVar1 * in_XMM0_Da * fVar7 + fVar19 * in_XMM1_Da * fVar7 + fVar16 * in_XMM2_Da * fVar7)
    ;
    fVar9 = (float)0 -
            (fVar1 * in_XMM0_Db * fVar12 +
            fVar19 * in_XMM1_Db * fVar12 + fVar16 * in_XMM2_Db * fVar12);
    fVar10 = (float)0 -
             (fVar1 * in_XMM0_Dc * fVar10 +
             fVar19 * in_XMM1_Dc * fVar10 + fVar16 * in_XMM2_Dc * fVar10);
    fVar11 = (float)0 -
             (fVar1 * in_XMM0_Dd * fVar11 +
             fVar19 * in_XMM1_Dd * fVar11 + fVar16 * in_XMM2_Dd * fVar11);
    fVar7 = *(float *)(this + 0x48);
    auVar6._0_4_ = fVar2 * (fVar8 - fVar7);
    auVar6._4_4_ = fVar2 * (fVar9 - fVar7);
    auVar6._8_4_ = fVar2 * (fVar10 - fVar7);
    auVar6._12_4_ = fVar2 * (fVar11 - fVar7);
    fVar12 = *(float *)(this + 0x2c);
    auVar14 = minps(auVar6,Four_Ones);
    if ((fVar12 != 0.0) && (fVar12 != 1.0)) {
      local_2c = auVar14;
      Pow_FixedPoint_Exponent_SIMD((_func_float_int **)local_2c,(int)(fVar12 * 4.0));
      fVar7 = *(float *)(this + 0x48);
    }
    fVar12 = auVar18._4_4_;
    fVar16 = auVar18._8_4_;
    fVar19 = auVar18._12_4_;
    auVar18._0_4_ = (float)(-(uint)(fVar7 < fVar8) & (uint)(auVar14._0_4_ * auVar18._0_4_));
    auVar18._4_4_ = (float)(-(uint)(fVar7 < fVar9) & (uint)(auVar14._4_4_ * fVar12));
    auVar18._8_4_ = (float)(-(uint)(fVar7 < fVar10) & (uint)(auVar14._8_4_ * fVar16));
    auVar18._12_4_ = (float)(-(uint)(fVar7 < fVar11) & (uint)(auVar14._12_4_ * fVar19));
  }
  fVar12 = auVar15._0_4_ * auVar18._0_4_;
  fVar10 = auVar15._4_4_ * auVar18._4_4_;
  fVar11 = auVar15._8_4_ * auVar18._8_4_;
  fVar16 = auVar15._12_4_ * auVar18._12_4_;
  fVar7 = *(float *)(this + 4);
  *(float *)param_3 = fVar7 * fVar12 + *(float *)param_3;
  *(float *)(param_3 + 4) = fVar7 * fVar10 + *(float *)(param_3 + 4);
  *(float *)(param_3 + 8) = fVar7 * fVar11 + *(float *)(param_3 + 8);
  *(float *)(param_3 + 0xc) = fVar7 * fVar16 + *(float *)(param_3 + 0xc);
  fVar7 = *(float *)(this + 8);
  *(float *)(param_3 + 0x10) = fVar7 * fVar12 + *(float *)(param_3 + 0x10);
  *(float *)(param_3 + 0x14) = fVar7 * fVar10 + *(float *)(param_3 + 0x14);
  *(float *)(param_3 + 0x18) = fVar7 * fVar11 + *(float *)(param_3 + 0x18);
  *(float *)(param_3 + 0x1c) = fVar7 * fVar16 + *(float *)(param_3 + 0x1c);
  fVar7 = *(float *)(this + 0xc);
  *(float *)(param_3 + 0x20) = fVar7 * fVar12 + *(float *)(param_3 + 0x20);
  *(float *)(param_3 + 0x24) = fVar7 * fVar10 + *(float *)(param_3 + 0x24);
  *(float *)(param_3 + 0x28) = fVar7 * fVar11 + *(float *)(param_3 + 0x28);
  *(float *)(param_3 + 0x2c) = fVar7 * fVar16 + *(float *)(param_3 + 0x2c);
  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)