DB/ItemDisplayInfo/GeosRenderPrep

From wowdev
Revision as of 00:50, 22 February 2016 by Schlumpf (talk | contribs) (Created page with " void CCharacterComponent::GeosRenderPrep(CCharacterComponent *characterComponent) { // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND] // "characte...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
void CCharacterComponent::GeosRenderPrep(CCharacterComponent *characterComponent)
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
  
  // "characterComponent->componentData.model2" simplified to "ourModel" for (vastly) shorter code
  // SHIRT = item_ids[2]
  // CHEST = item_ids[3]
  // BELT = item_ids[4]
  // PANTS = item_ids[5]
  // BOOTS = item_ids[6]
  // GLOVES = item_ids[8]
  // TABARD = item_ids[9]
  // CLOAK = field_6C0

  // Lookup something (if class is not DK)
  booleanOfQuestionableUsefulness = false;
  if ( characterComponent->componentData.class_ != 6 )
  {
    booleanOfQuestionableUsefulness = true;
    // ComponentGetSectionsRecord matches against CharSections.db2.
    // parameters: UNKNOWN, raceID, genderID, baseSection, variationIndex, colorIndex
    // since baseSection is 1, it is referring to the face, so variationIndex is really the 'type of face', and colorIndex is the skin color (so the face has matching skin color)'
    // what -exactly- v3 is is a bit of a mystery to me. Could be row ID from the DBC
    v3 = ComponentGetSectionsRecord(
           (__int64)&s_chrVarArray,
           characterComponent->componentData.race,
           characterComponent->componentData.gender,
           1,
           characterComponent->componentData.face,
           characterComponent->componentData.skinColor,
           0);
    if ( v3 )
    {
      booleanOfQuestionableUsefulness = (*(_BYTE *)(v3 + 28) & 4) == 0;
    }
  }
  
  // Disable all geosets from 0 to 2200
  CM2Model::SetGeometryVisible(ourModel, 0, 2200, 0);
  
  // Enable geoset 0, the skin
  CM2Model::SetGeometryVisible(ourModel, 0, 0, 1);
  
  // Enable default geosets for that model (i.e. fill in all the holes that there would be on a model with no armor on)
  if ( booleanOfQuestionableUsefulness )
  {
    v4 = 0; // Counter variable
    do
    {
      CM2Model::SetGeometryVisible(ourModel, characterComponent->componentData.submeshIds[v4], characterComponent->componentData.submeshIds[v4], 1);
      ++v4;
    }
    while ( (_DWORD)v4 != 21 );
  }
  // If Class is DK (or Race has eye glow?), enable special eyes
  else
  {
    v5 = 0; // Counter variable
    do
    {
      if ( (_DWORD)v5 == 17 )
      {
        v6 = 1703;
        v7 = 1703;
      }
      else
      {
        v6 = characterComponent->componentData.submeshIds[v5];
        v7 = characterComponent->componentData.submeshIds[v5];
      }
      CM2Model::SetGeometryVisible(ourModel, v6, v7, 1);
      ++v5;
    }
    while ( (_DWORD)v5 != 21 );
  }
  
  // TAIL is checked here? 'GetConditionalGeoset' probably checks racial conditions or something.
  CM2Model::SetGeometryVisible(ourModel, 1900, 1999, 0);
  v8 = GetConditionalGeoset(&characterComponent->componentData, (COMP_GEOSET)19);
  v9 = v8 + 1900;
  if ( (signed int)v8 <= 0 )
  {
    v9 = 1901;
  }
  CM2Model::SetGeometryVisible(ourModel, v9, v9, 1);
  
  // GLOVES (8)
  v10 = characterComponent->item_ids[GLOVES];
  if ( v10 && g_itemDisplayInfoDB->GetRecord(v10) && g_itemDisplayInfoDB->GetRecord(v10)->m_geosetGroup[0] )
  {
    CM2Model::SetGeometryVisible(ourModel, 400, 499, 0);
    CM2Model::SetGeometryVisible(
      ourModel,
      g_itemDisplayInfoDB->GetRecord(v10)->m_geosetGroup[0] + 401,
      g_itemDisplayInfoDB->GetRecord(v10)->m_geosetGroup[0] + 401,
      1);
  }
  else
  {
    // if no glove geoset, CHEST (3) - m_geosetGroup[0] modifies 801
    v14 = characterComponent->item_ids[CHEST];
    if ( v14 )
    {
      v15 = g_itemDisplayInfoDB->GetRecord(v14);
      if ( v15 )
      {
        v16 = v15->m_geosetGroup[0];
        if ( v16 )
        {
          CM2Model::SetGeometryVisible(ourModel, v16 + 801, v16 + 801, 1);
        }
      }
    }
  }
  
  bool valid = true;
  for ( int v13 = 65; v13 <= 70; ++v13 )
  {
    if ( *(&characterComponent->field_0 + v13) != 0 )
    {
      valid = false;
    }
  }
  if (valid)
    // (CONDITIONALLY) SHIRT (2) - m_geosetGroup[0] modifies 801
    v18 = characterComponent->item_ids[SHIRT];
    if ( v18 )
    {
      v19 = g_itemDisplayInfoDB->GetRecord(v18);
      if ( v19 )
      {
        v20 = v19->m_geosetGroup[0];
        if ( v20 )
        {
          CM2Model::SetGeometryVisible(ourModel, v20 + 801, v20 + 801, 1);
        }
      }
    }
  }
  
  // BELT (4) - m_geosetGroup[0] modifies a truth value used later to test whether to apply the tabard geoset (only if m_flags & 0x200)
  hasBulkyBeltFlag = 0;
  v21 = characterComponent->item_ids[BELT];
  if ( v21 )
  {
    v23 = g_itemDisplayInfoDB->GetRecord(v21);
    if ( v23 )
    {
      if ( v23->m_geosetGroup[0] )
      {
        hasBulkyBeltFlag = ((unsigned int)v23->m_flags >> 9) & 1;
      }
    }
  }
  
  v24 = characterComponent->item_ids[CHEST];
  v29 = characterComponent->item_ids[PANTS];
  // CHEST (3) - m_geosetGroup[2] modifies 1301
  if ( v24 && g_itemDisplayInfoDB->GetRecord(v24) && g_itemDisplayInfoDB->GetRecord(v24)->m_geosetGroup[2] )
  {
    dressPants = false;
    dressChestpiece = true;
    CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(v24)->m_geosetGroup[2] + 1301, g_itemDisplayInfoDB->GetRecord(v24)->m_geosetGroup[2] + 1301, 1);
  }
  // (CONDITIONALLY) PANTS (5) - m_geosetGroup[2] modifies 1301 (only if CHEST's m_geosetGroup[2] is 0)
  // FIELD 20 CHECK (&0x08 == 0)
  else if ( v29 && g_itemDisplayInfoDB->GetRecord(v29) && g_itemDisplayInfoDB->GetRecord(v29)->m_geosetGroup[2]  && (characterComponent->field_20 & 8 == 0) )
  {
    dressPants = true;
    dressChestpiece = false;
    CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(v29)->m_geosetGroup[2] + 1301, g_itemDisplayInfoDB->GetRecord(v29)->m_geosetGroup[2] + 1301, 1);
  }
  else
  {
    dressPants = false;
    dressChestpiece = false;
    // (CONDITIONALLY) BOOTS (6) - m_geosetGroup[0] modifies 501 (only if CHEST's m_geosetGroup[2] is 0 and PANTS' m_geosetGroup[2] is 0)
    v31 = characterComponent->item_ids[BOOTS];
    if ( v31 && g_itemDisplayInfoDB->GetRecord(v31) && g_itemDisplayInfoDB->GetRecord(v31)->m_geosetGroup[0] )
    {
      CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(v31)->m_geosetGroup[0] + 501, g_itemDisplayInfoDB->GetRecord(v31)->m_geosetGroup[0] + 501, 1);
    }
    else
    {
      // (CONDITIONALLY) PANTS (5) - m_geosetGroup[1] modifies 901 (only if CHEST's m_geosetGroup[2] is 0 and PANTS' m_geosetGroup[2] is 0 and BOOTS' m_geosetGroup[0] is 0 and field_20 & 0x08 != 0)
      v34 = characterComponent->item_ids[PANTS];
      // FIELD 20 CHECK (&0x08 == 0)
      if ( v34 && g_itemDisplayInfoDB->GetRecord(v34) && g_itemDisplayInfoDB->GetRecord(v34)->m_geosetGroup[1] && (characterComponent->field_20 & 8 == 0) )
      {
        v38 = v36 + 901;
      }
      // else, else, else: 901 is set (901 is default set then)
      else
      {
        v38 = 901;
      }
      CM2Model::SetGeometryVisible(ourModel, v38, v38, 1);
    }
  }
  
  // BOOTS (6) - m_geosetGroup[1] modifies 2000 (yes, 2000) and has some fun conditionals
  v40 = characterComponent->item_ids[BOOTS];
  // If you are wearing BOOTS
  if ( v40 )
  {
    v41 = g_itemDisplayInfoDB->GetRecord(v40);
    // If your BOOTS' m_geosetGroup[1] is 0
    if ( !v41 || !v41->m_geosetGroup[1] )
    {
      v44 = 2002;
      v45 = 2002;
    }
    // If your BOOTS' m_geosetGroup[1] is non-zero
    else
    {
      v44 = v41->m_geosetGroup[1] + 2000;
      v45 = v41->m_geosetGroup[1] + 2000;
    }
  }
  // If you are not wearing BOOTS
  else
  {
    v44 = 2001;
    v45 = 2001;
  }
  CM2Model::SetGeometryVisible(ourModel, v44, v45, 1);
  
  // (CONDITIONALLY) TABARD (9) - m_geosetGroup[0] modifies 1201 (if not wearing a dress and m_flags & 0x200 is 0 for your BELT)
  showsTabard = false;
  hasDress = (dressChestpiece | dressPants);
  if ( !hasDress && !hasBulkyBeltFlag )
  {
    v49 = characterComponent->item_ids[TABARD];
    if ( v49 )
    {
      v50 = g_itemDisplayInfoDB->GetRecord(v49);
      if ( v50 )
      {
        v51 = v50->m_geosetGroup[0];
        if ( v51 )
        {
          showsTabard = true;
          CM2Model::SetGeometryVisible(ourModel, v51 + 1201, v51 + 1201, 1);
        }
      }
    }
  }
  // FIELD 20 CHECK (&0x20 == 0) - result is tabard geoset hidden
  if ( characterComponent->field_20 & 0x20 == 0 )
  {
    CM2Model::SetGeometryVisible(ourModel, 1201, 1201, 1)
  }
  // FIELD 20 CHECK (&0x20 == 0) - result is tabard geoset shown if hasDress is false
  if ( (characterComponent->field_20 & 0x20 == 0) && !hasDress )
  {
    CM2Model::SetGeometryVisible(ourModel, 1202, 1202, 1);
    showsTabard = true;
  }
  else
  {
    if ( !showsTabard && !dressChestpiece )
    {
      // (CONDITIONALLY) CHEST (3) - m_geosetGroup[1] modifies 1001
      if (characterComponent->item_ids[CHEST] && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST]) && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST])->m_geosetGroup[1])
      {
        CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST])->m_geosetGroup[1] + 1001, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST])->m_geosetGroup[1] + 1001, 1);
        showsTabard = false;
      }
      // (CONDITIONALLY) SHIRT (2) - m_geosetGroup[1] modifies 1001
      else if (characterComponent->item_ids[SHIRT] && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT]) && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT])->m_geosetGroup[1])
      {
        CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT])->m_geosetGroup[1] + 1001, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT])->m_geosetGroup[1] + 1001, 1);
        showsTabard = false;
      }
    }
  }
  
  // FIELD 20 CHECK (&0x08 == 0)
  if ( !dressChestpiece && (characterComponent->field_20 & 8 == 0) )
  {
    // (CONDITIONALLY) PANTS (5) - m_geosetGroup[0] modifies 1101 (if m_geosetGroup[0] > 2, it wipes all geosets from 1300 to 1399 and then sets 1101. if it is less than or equal to 2 and if a tabard is shown, it sets 1101.)
    v58 = characterComponent->item_ids[PANTS];
    if ( v58 )
    {
      v59 = g_itemDisplayInfoDB->GetRecord(v58);
      if ( v59 )
      {
        v60 = v59->m_geosetGroup[0];
        if ( v60 )
        {
          if ( v60 > 2 )
          {
            CM2Model::SetGeometryVisible(ourModel, 1300, 1399, 0);
            CM2Model::SetGeometryVisible(ourModel, v60 + 1101, v60 + 1101, 1);
          }
          else if ( showsTabard )
          {
            CM2Model::SetGeometryVisible(ourModel, v60 + 1101, v60 + 1101, 1);
          }
        }
      }
    }
  }
  
  // CLOAK (?) - m_geosetGroup[0] modifies 1501
  // FIELD 6C0 CHECK (it's an itemID?)
  v61 = characterComponent->field_6C0;
  if ( v61 )
  {
    v62 = g_itemDisplayInfoDB->GetRecord(v61);
    if ( v62 )
    {
      if ( v62->m_geosetGroup[0] )
      {
        CM2Model::SetGeometryVisible(ourModel, 1500, 1599, 0);
        CM2Model::SetGeometryVisible(ourModel, v62->m_geosetGroup[0] + 1501, v62->m_geosetGroup[0] + 1501, 1);
      }
    }
  }
  // BELT (4) - m_geosetGroup[0] modifies 1801
  v64 = characterComponent->item_ids[BELT];
  if ( v64 )
  {
    v65 = g_itemDisplayInfoDB->GetRecord(v64);
    if ( v65 )
    {
      if ( v65->m_geosetGroup[0] )
      {
        CM2Model::SetGeometryVisible(ourModel, 1800, 1899, 0);
        CM2Model::SetGeometryVisible(ourModel, v65->m_geosetGroup[0] + 1801, v65->m_geosetGroup[0] + 1801, 1);
      }
    }
  }
  // FIELD 20 CHECK (&0x10 != 0)
  if ( characterComponent->field_20 & 0x10 != )
  {
    // If you aren't wearing PANTS, you have a tabard, and you don't have a dress (a dress from CHEST presumably, since you aren't wearing PANTS), enable 1401
    if ( showsTabard && !characterComponent->item_ids[PANTS] && !hasDress )
    {
      v67 = 1401;
      v68 = 1401;
      v69 = 1;
    }
    else
    {
      v67 = 1400;
      v68 = 1499;
      v69 = 0;
    }
    CM2Model::SetGeometryVisible(ourModel, v67, v68, v69);
  }
  
  // Remove unneeded edges and vertices due to the enabled geosets
  CM2Model::OptimizeVisibleGeometry(ourModel);
  
  // FIELD 20 MODIFICATION (&=0xFD)
  characterComponent->field_20 &= 0xFD;
}