L L4D2node

SmoothDispSurfNormals

0x000d2a30 · 2217 bytes · __cdecl

_Z21SmoothDispSurfNormalsPP13CCoreDispInfoi

Decompiled

undefined (2 params)

/* SmoothDispSurfNormals(CCoreDispInfo**, int) */

void SmoothDispSurfNormals(CCoreDispInfo **param_1,int param_2)

{
  CCoreDispInfo **ppCVar1;
  int iVar2;
  CCoreDispInfo *pCVar3;
  CCoreDispInfo *pCVar4;
  char cVar5;
  ushort *puVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  CPowerInfo *pCVar10;
  float *pfVar11;
  int iVar12;
  Vector *pVVar13;
  int iVar14;
  int iVar15;
  int iVar16;
  float fVar17;
  float fVar18;
  CCoreDispInfo *pCVar19;
  int local_ac;
  int local_a8;
  ushort *local_a4;
  int local_a0;
  int local_70;
  int local_60 [2];
  undefined4 local_58;
  CVertIndex local_54 [4];
  undefined4 local_50;
  undefined4 local_4c;
  float local_48;
  float local_44;
  float local_40;
  float local_3c;
  float local_38;
  undefined4 local_34;
  float local_30;
  short local_2c;
  short local_2a;
  int local_24;
  undefined4 local_20;
  
  if (0 < param_2) {
    iVar16 = 0;
    do {
      ppCVar1 = param_1 + iVar16;
      iVar16 = iVar16 + 1;
      CCoreDispInfo::SetDispUtilsHelperInfo(*ppCVar1,param_1,param_2);
    } while (iVar16 != param_2);
    local_70 = 0;
    do {
      iVar16 = 0;
      pCVar3 = param_1[local_70];
      if (pCVar3 != (CCoreDispInfo *)0x0) {
        do {
          puVar6 = (ushort *)(**(code **)(*(int *)pCVar3 + 4))(pCVar3,iVar16);
          if (((puVar6 != (ushort *)0x0) && (*puVar6 != 0xffff)) && (puVar6[3] != 0xffff)) {
            pCVar19 = pCVar3;
            iVar7 = iVar16;
            CDispUtilsHelper::GetEdgeMidPoint((int)local_60);
            iVar2 = local_60[0];
            iVar7 = (*(code *)**(undefined4 **)pCVar3)(pCVar3,pCVar19,iVar7);
            iVar2 = (iVar2 >> 0x10) * *(int *)(iVar7 + 0x24) + (int)(short)iVar2;
            iVar7 = iVar2 * 0x90;
            pCVar19 = param_1[*puVar6];
            pCVar4 = param_1[puVar6[3]];
            pVVar13 = (Vector *)(iVar7 + *(int *)(pCVar3 + 0x1b8) + 0x28);
            iVar8 = FindNeighborCornerVert(pCVar19,pVVar13);
            iVar9 = FindNeighborCornerVert(pCVar4,pVVar13);
            if ((iVar8 != -1) && (iVar9 != -1)) {
              pCVar10 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar19)(pCVar19);
              pfVar11 = (float *)CPowerInfo::GetCornerPointIndex(pCVar10,iVar8);
              local_50 = *pfVar11;
              pCVar10 = (CPowerInfo *)(*(code *)**(undefined4 **)pCVar4)(pCVar4);
              pfVar11 = (float *)CPowerInfo::GetCornerPointIndex(pCVar10,iVar9);
              local_4c = *pfVar11;
              iVar8 = *(int *)(pCVar3 + 0x1b8);
              local_44 = *(float *)(iVar8 + 0x40 + iVar7);
              local_40 = *(float *)(iVar8 + 0x44 + iVar7);
              iVar9 = (int)local_50._2_2_;
              local_3c = *(float *)(iVar8 + 0x48 + iVar7);
              iVar8 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
              iVar14 = (int)local_4c._2_2_;
              iVar8 = ((int)(short)local_50 + iVar9 * *(int *)(iVar8 + 0x24)) * 0x90 +
                      *(int *)(pCVar19 + 0x1b8);
              local_44 = local_44 + *(float *)(iVar8 + 0x40);
              local_40 = local_40 + *(float *)(iVar8 + 0x44);
              local_3c = local_3c + *(float *)(iVar8 + 0x48);
              iVar8 = (*(code *)**(undefined4 **)pCVar4)(pCVar4);
              iVar8 = ((int)(short)local_4c + iVar14 * *(int *)(iVar8 + 0x24)) * 0x90 +
                      *(int *)(pCVar4 + 0x1b8);
              local_44 = local_44 + *(float *)(iVar8 + 0x40);
              local_40 = local_40 + *(float *)(iVar8 + 0x44);
              local_3c = local_3c + *(float *)(iVar8 + 0x48);
              VectorNormalize((Vector *)&local_44);
              iVar8 = *(int *)(pCVar3 + 0x1b8);
              local_38 = *(float *)(iVar8 + 0x4c + iVar7);
              local_34 = *(float *)(iVar8 + 0x50 + iVar7);
              local_30 = *(float *)(iVar8 + 0x54 + iVar7);
              iVar8 = (int)local_50._2_2_;
              iVar7 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
              iVar9 = (int)local_4c._2_2_;
              iVar7 = ((int)(short)local_50 + iVar8 * *(int *)(iVar7 + 0x24)) * 0x90 +
                      *(int *)(pCVar19 + 0x1b8);
              local_38 = local_38 + *(float *)(iVar7 + 0x4c);
              local_34 = local_34 + *(float *)(iVar7 + 0x50);
              local_30 = local_30 + *(float *)(iVar7 + 0x54);
              iVar7 = (*(code *)**(undefined4 **)pCVar4)(pCVar4);
              iVar7 = ((int)(short)local_4c + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
                      *(int *)(pCVar4 + 0x1b8);
              local_38 = local_38 + *(float *)(iVar7 + 0x4c);
              local_34 = local_34 + *(float *)(iVar7 + 0x50);
              local_30 = local_30 + *(float *)(iVar7 + 0x54);
              VectorNormalize((Vector *)&local_38);
              UpdateTangentSpace(pCVar3,iVar2,(Vector *)&local_44,(Vector *)&local_38);
              UpdateTangentSpace(pCVar19,(CVertIndex *)&local_50,(Vector *)&local_44,
                                 (Vector *)&local_38);
              UpdateTangentSpace(pCVar4,(CVertIndex *)&local_4c,(Vector *)&local_44,
                                 (Vector *)&local_38);
            }
          }
          iVar16 = iVar16 + 1;
        } while (iVar16 != 4);
      }
      local_70 = local_70 + 1;
    } while (local_70 != param_2);
    BlendCorners(param_1,param_2);
    local_ac = 0;
    do {
      local_a8 = 0;
      pCVar3 = param_1[local_ac];
      if (pCVar3 != (CCoreDispInfo *)0x0) {
        do {
          local_a4 = (ushort *)(**(code **)(*(int *)pCVar3 + 4))(pCVar3,local_a8);
          local_a0 = 0;
          if (local_a4 != (ushort *)0x0) {
            do {
              if ((*local_a4 != 0xffff) &&
                 (pCVar19 = param_1[*local_a4], pCVar19 != (CCoreDispInfo *)0x0)) {
                local_30 = (float)((uint)local_30 & 0xffff0000);
                iVar16 = (&g_EdgeDims)[local_a8];
                local_34 = (float)((uint)local_34 & 0xffff0000);
                local_38 = 0.0;
                local_24 = 0;
                local_20 = 0;
                CDispSubEdgeIterator::Start
                          ((CDispSubEdgeIterator *)&local_38,(CDispUtilsHelper *)pCVar3,local_a8,
                           local_a0,true);
                CDispSubEdgeIterator::Next((CDispSubEdgeIterator *)&local_38);
                local_58 = local_34;
                iVar2 = (short)iVar16 * 2;
                iVar16 = (uint)(iVar16 == 0) * 2;
                cVar5 = CDispSubEdgeIterator::Next((CDispSubEdgeIterator *)&local_38);
                while (cVar5 != '\0') {
                  if ((int)*(short *)((int)&local_30 + (short)local_20 * 2) +
                      (int)*(short *)((int)&local_34 + (short)local_20 * 2) < local_24) {
                    iVar8 = (int)local_2a;
                    iVar7 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
                    iVar8 = ((int)local_2c + iVar8 * *(int *)(iVar7 + 0x24)) * 0x90 +
                            *(int *)(pCVar19 + 0x1b8);
                    iVar9 = (int)local_34._2_2_;
                    iVar7 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
                    iVar7 = ((int)(short)local_34 + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
                            *(int *)(pCVar3 + 0x1b8);
                    local_50 = *(float *)(iVar8 + 0x40) + *(float *)(iVar7 + 0x40);
                    local_4c = *(float *)(iVar8 + 0x44) + *(float *)(iVar7 + 0x44);
                    iVar9 = (int)local_2a;
                    local_48 = *(float *)(iVar8 + 0x48) + *(float *)(iVar7 + 0x48);
                    iVar7 = (*(code *)**(undefined4 **)pCVar19)(pCVar19);
                    iVar8 = ((int)local_2c + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
                            *(int *)(pCVar19 + 0x1b8);
                    iVar9 = (int)local_34._2_2_;
                    iVar7 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
                    iVar7 = ((int)(short)local_34 + iVar9 * *(int *)(iVar7 + 0x24)) * 0x90 +
                            *(int *)(pCVar3 + 0x1b8);
                    local_44 = *(float *)(iVar8 + 0x4c) + *(float *)(iVar7 + 0x4c);
                    local_40 = *(float *)(iVar8 + 0x50) + *(float *)(iVar7 + 0x50);
                    local_3c = *(float *)(iVar8 + 0x54) + *(float *)(iVar7 + 0x54);
                    VectorNormalize((Vector *)&local_50);
                    VectorNormalize((Vector *)&local_44);
                    UpdateTangentSpace(pCVar3,(CVertIndex *)&local_34,(Vector *)&local_50,
                                       (Vector *)&local_44);
                    UpdateTangentSpace(pCVar19,(CVertIndex *)&local_2c,(Vector *)&local_50,
                                       (Vector *)&local_44);
                  }
                  iVar8 = (int)*(short *)((int)&local_34 + iVar16);
                  iVar7 = *(short *)(local_54 + iVar16 + -4) + 1;
                  if (iVar7 < iVar8) {
                    fVar18 = (float)(int)*(short *)(local_54 + iVar16 + -4);
                    iVar9 = (int)local_58._2_2_;
                    iVar14 = (int)(short)local_58;
                    do {
                      if (fVar18 == (float)iVar8) {
                        fVar17 = (float)(-(uint)(fVar18 <= (float)iVar7) & 0x3f800000);
                      }
                      else {
                        fVar17 = ((float)iVar7 - fVar18) * (1.0 / ((float)iVar8 - fVar18));
                      }
                      iVar15 = (int)local_34._2_2_;
                      iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
                      iVar15 = (iVar15 * *(int *)(iVar12 + 0x24) + (int)(short)local_34) * 0x90 +
                               *(int *)(pCVar3 + 0x1b8);
                      iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
                      iVar12 = (iVar14 + iVar9 * *(int *)(iVar12 + 0x24)) * 0x90 +
                               *(int *)(pCVar3 + 0x1b8);
                      local_50 = (*(float *)(iVar15 + 0x40) - *(float *)(iVar12 + 0x40)) * fVar17 +
                                 *(float *)(iVar12 + 0x40);
                      local_4c = (*(float *)(iVar15 + 0x44) - *(float *)(iVar12 + 0x44)) * fVar17 +
                                 *(float *)(iVar12 + 0x44);
                      local_48 = (*(float *)(iVar15 + 0x48) - *(float *)(iVar12 + 0x48)) * fVar17 +
                                 *(float *)(iVar12 + 0x48);
                      VectorNormalize((Vector *)&local_50);
                      iVar15 = (int)local_34._2_2_;
                      iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
                      iVar15 = (iVar15 * *(int *)(iVar12 + 0x24) + (int)(short)local_34) * 0x90 +
                               *(int *)(pCVar3 + 0x1b8);
                      iVar12 = (*(code *)**(undefined4 **)pCVar3)(pCVar3);
                      iVar12 = (iVar14 + iVar9 * *(int *)(iVar12 + 0x24)) * 0x90 +
                               *(int *)(pCVar3 + 0x1b8);
                      local_44 = (*(float *)(iVar15 + 0x4c) - *(float *)(iVar12 + 0x4c)) * fVar17 +
                                 *(float *)(iVar12 + 0x4c);
                      local_40 = (*(float *)(iVar15 + 0x50) - *(float *)(iVar12 + 0x50)) * fVar17 +
                                 *(float *)(iVar12 + 0x50);
                      local_3c = (*(float *)(iVar15 + 0x54) - *(float *)(iVar12 + 0x54)) * fVar17 +
                                 *(float *)(iVar12 + 0x54);
                      VectorNormalize((Vector *)&local_44);
                      *(undefined2 *)(local_54 + iVar2) = *(undefined2 *)((int)&local_34 + iVar2);
                      *(short *)(local_54 + iVar16) = (short)iVar7;
                      iVar7 = iVar7 + 1;
                      UpdateTangentSpace(pCVar3,local_54,(Vector *)&local_50,(Vector *)&local_44);
                    } while (iVar7 < iVar8);
                  }
                  local_58 = local_34;
                  cVar5 = CDispSubEdgeIterator::Next((CDispSubEdgeIterator *)&local_38);
                }
              }
              local_a0 = local_a0 + 1;
              local_a4 = local_a4 + 3;
            } while (local_a0 != 2);
          }
          local_a8 = local_a8 + 1;
        } while (local_a8 != 4);
      }
      local_ac = local_ac + 1;
    } while (local_ac != param_2);
    return;
  }
  BlendCorners(param_1,param_2);
  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)