ApplyMonsterGeoset

From wowdev
Jump to navigation Jump to search

Supposedly used for filtering geosets when there is no DB/CreatureDisplayInfoExtra available?

int __usercall CCharacterComponent::ApplyMonsterGeosets@<eax>(CM2Model *this_m2model@<rdi>, CreatureModelData_Rec *cmd@<rax>, int a3@<edx>, int a4@<ecx>, CreatureDisplayInfoRec_C *cdi@<rsi>, int a6@<r8d>)
{
  char v6; // r12@5
  unsigned int v7; // ebx@5
  signed int v8; // er14@6
  unsigned int v9; // er13@6
  unsigned int v10; // ebx@8

  if ( this_m2model )
  {
    if ( cdi )
    {
      cmd = WowClientDB_Base::GetRecordDataUnsafe(&g_creatureModelDataDB, cdi->ModelID, a3, a4, a6);
      if ( cmd )
      {
        if ( cmd->CreatureGetosetDataID )
        {
          // packed mask of active geosets
          // if (cmd->CreatureGeosetDataID != 0)
          // {
          //   std::vector<int> activeGeosets;
          //   for (int i = 0; i < 8; ++i)
          //     activeGeosets.push_back(((cdi.CreatureGeosetData >> (4 * i)) & 0xF) + i * 100);
          // } 
          // 
          v6 = 0;
          CM2Model::SetGeometryVisible(this_m2model, 1u, 899u, 0);
          v7 = cdi->CreatureGeosetData;
          if ( v7 )
          {
            v8 = 8;
            v9 = 100;
            while ( 1 )
            {
              v10 = v7 >> v6;
              if ( v10 & 15 )
              {
                CM2Model::SetGeometryVisible(this_m2model, v9, v9 + 99, 0);
                CM2Model::SetGeometryVisible(this_m2model, v9 + (v10 & 15), v9 + (v10 & 15), 1);
              }
              if ( !--v8 )
                break;
              v6 += 4;
              v9 += 100;
              v7 = cdi->CreatureGeosetData;
            }
          }
          LODWORD(cmd) = CM2Model::OptimizeVisibleGeometry(this_m2model);
        }
      }
    }
  }
  return cmd;
}