DB/ItemDisplayInfo/GeosRenderPrep: Difference between revisions

From wowdev
Jump to navigation Jump to search
(Updated code for 8.0.1. It's also more clear.)
(Minor update for 8.0.1 code from TOM_RUS.)
Line 1: Line 1:
  // GeosetRenderPrep.cpp : Defines the entry point for the console application.
  // GeosetRenderPrep.cpp : Defines the entry point for the console application.
  //
  //
 
  #include "stdafx.h"
  #include "stdafx.h"
 
  int main()
  int main()
  {
  {
return 0;
    return 0;
  }
  }
 
  struct CCharacterComponent
  struct CCharacterComponent
  {
  {
uint32_t raceID;
    uint32_t raceID;
uint32_t classID;
    uint32_t classID;
uint32_t skinIndex;
    uint32_t skinIndex;
uint32_t genderID;
    uint32_t genderID;
uint32_t faceIndex;
    uint32_t faceIndex;
void *modelPtr;
    void *modelPtr;
uint32_t submeshIds[29];
    uint32_t submeshIds[29];
uint32_t itemids[10];
    uint32_t itemids[10];
uint32_t gap2[520];
    uint32_t gap2[520];
uint64_t shirtRelated[6];
    uint64_t shirtRelated[6];
uint32_t flags;
    uint32_t flags;
 
static void GeosRenderPrep(CCharacterComponent *pCharComponent);
    static void GeosRenderPrep(CCharacterComponent *pCharComponent);
  };
  };
 
  struct CharSectionsRec
  struct CharSectionsRec
  {
  {
uint32_t Flags;
    uint32_t Flags;
  };
  };
 
  struct CM2Model
  struct CM2Model
  {
  {
static void SetGeometryVisible(void *model, uint32_t start, uint32_t end, BOOL visible) {}
    static void SetGeometryVisible(void *model, uint32_t start, uint32_t end, BOOL visible) {}
  };
  };
 
  struct ItemDisplayInfoRec
  struct ItemDisplayInfoRec
  {
  {
uint32_t Flags;
    uint32_t Flags;
uint32_t GeosetGroup[4];
    uint32_t GeosetGroup[4];
  };
  };
 
  CharSectionsRec *ComponentGetSectionsRecord(uint32_t raceID, uint32_t genderID, uint32_t sectionID, uint32_t faceIndex, uint32_t skinIndex, uint32_t unk1)
  CharSectionsRec *ComponentGetSectionsRecord(uint32_t raceID, uint32_t genderID, uint32_t sectionID, uint32_t faceIndex, uint32_t skinIndex, uint32_t unk1)
  {
  {
return nullptr;
    return nullptr;
  }
  }
 
  uint32_t GetConditionalGeoset(uint32_t raceID, uint32_t geosetGroup)
  uint32_t GetConditionalGeoset(uint32_t raceID, uint32_t geosetGroup)
  {
  {
return 0;
    return 0;
  }
  }
 
  ItemDisplayInfoRec *GetItemDisplayInfoRec(uint32_t itemID)
  ItemDisplayInfoRec *GetItemDisplayInfoRec(uint32_t itemID)
  {
  {
return nullptr;
    return nullptr;
  }
  }
 
  void CCharacterComponent::GeosRenderPrep(CCharacterComponent *pCharComponent)
  void CCharacterComponent::GeosRenderPrep(CCharacterComponent *pCharComponent)
  {
  {
BOOL eyeGlowFlag;
    BOOL eyeGlowFlag = 0;
 
if (pCharComponent->classID == 6) // DK
    if (pCharComponent->classID == 6) // DK
{
    {
eyeGlowFlag = 1;
        eyeGlowFlag = 1;
}
    }
else
    else
{
    {
// section Face
        // section Face
auto pFaceSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 1, pCharComponent->faceIndex, pCharComponent->skinIndex, 0);
        auto pFaceSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 1, pCharComponent->faceIndex, pCharComponent->skinIndex, 0);
 
if (pFaceSection)
        if (pFaceSection)
eyeGlowFlag = pFaceSection->Flags & 4;// flags & 0x4
            eyeGlowFlag = pFaceSection->Flags & 4;// flags & 0x4
else
        else
eyeGlowFlag = 0;
            eyeGlowFlag = 0;
}
    }
 
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 3000, 0); // disable all
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 3000, 0); // disable all
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 0, 1); // enable skin
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 0, 1); // enable skin
 
uint32_t i = 0;
    uint32_t i = 0;
do
    do
{
    {
if (eyeGlowFlag && i == 17)
        if (eyeGlowFlag && i == 17)
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1703, 1703, 1);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1703, 1703, 1);
else
        else
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pCharComponent->submeshIds[i], pCharComponent->submeshIds[i], 1);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pCharComponent->submeshIds[i], pCharComponent->submeshIds[i], 1);
++i;
        ++i;
} while (i != 29);
    } while (i != 29);
 
// Tail
    // Tail
BOOL tailFlag = 0;
    BOOL tailFlag = 0;
// section Skin
    // section Skin
auto pSkinSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 0, 0, pCharComponent->skinIndex, 0);
    auto pSkinSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 0, 0, pCharComponent->skinIndex, 0);
if (pSkinSection)
    if (pSkinSection)
tailFlag = pSkinSection->Flags & 0x100; // flags & 0x100
        tailFlag = pSkinSection->Flags & 0x100; // flags & 0x100
 
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900, 1999, 0);
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900, 1999, 0);
 
uint32_t tailGeoset = 1;
    uint32_t tailGeoset = 1;
if (!tailFlag)
    if (!tailFlag)
tailGeoset = GetConditionalGeoset(pCharComponent->raceID, 19);
        tailGeoset = GetConditionalGeoset(pCharComponent->raceID, 19);
if (tailGeoset <= 0)
    if (tailGeoset <= 0)
tailGeoset = 1;
        tailGeoset = 1;
 
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900 + tailGeoset, 1900 + tailGeoset, 1);
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900 + tailGeoset, 1900 + tailGeoset, 1);
 
// Item ID's
    // Item ID's
auto shirtID = pCharComponent->itemids[0];
    auto shirtID = pCharComponent->itemids[0];
auto chestID = pCharComponent->itemids[1];
    auto chestID = pCharComponent->itemids[1];
auto beltID = pCharComponent->itemids[2];
    auto beltID = pCharComponent->itemids[2];
auto pantsID = pCharComponent->itemids[3];
    auto pantsID = pCharComponent->itemids[3];
auto bootsID = pCharComponent->itemids[4];
    auto bootsID = pCharComponent->itemids[4];
// 5?
    // 5 wrist?
auto glovesID = pCharComponent->itemids[6];
    auto glovesID = pCharComponent->itemids[6];
auto tabardID = pCharComponent->itemids[7];
    auto tabardID = pCharComponent->itemids[7];
auto cloakID = pCharComponent->itemids[8];
    auto cloakID = pCharComponent->itemids[8];
 
// Gloves
    // Gloves
if (glovesID)
    if (glovesID)
{
    {
auto pGloves = GetItemDisplayInfoRec(glovesID);
        auto pGloves = GetItemDisplayInfoRec(glovesID);
if (pGloves && pGloves->GeosetGroup[0])
        if (pGloves && pGloves->GeosetGroup[0])
{
        {
auto glovesGeoset = 401 + pGloves->GeosetGroup[0];
            auto glovesGeoset = 401 + pGloves->GeosetGroup[0];
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 401, 499, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 401, 499, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, glovesGeoset, glovesGeoset, 1);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, glovesGeoset, glovesGeoset, 1);
}
        }
}
    }
else
    else
{
    {
// Chest
        // Chest
if (chestID)
        if (chestID)
{
        {
auto pChest = GetItemDisplayInfoRec(chestID);
            auto pChest = GetItemDisplayInfoRec(chestID);
if (pChest && pChest->GeosetGroup[0])
            if (pChest && pChest->GeosetGroup[0])
{
            {
auto chesetGeoset = 801 + pChest->GeosetGroup[0];
                auto chesetGeoset = 801 + pChest->GeosetGroup[0];
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chesetGeoset, chesetGeoset, 1);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chesetGeoset, chesetGeoset, 1);
}
            }
}
        }
}
    }
 
// unknown shirt pre-check
    // unknown shirt pre-check
if (!pCharComponent->shirtRelated[0] && !pCharComponent->shirtRelated[1] && !pCharComponent->shirtRelated[2] && !pCharComponent->shirtRelated[3] && !pCharComponent->shirtRelated[4] && !pCharComponent->shirtRelated[5])
    // possibly !textureArmUpper && !textureArmLower && !textureTorsoUpper && !textureTorsoLower && !textureLegUpper && !textureLegLower ?
{
    if (!pCharComponent->shirtRelated[0] && !pCharComponent->shirtRelated[1] && !pCharComponent->shirtRelated[2] && !pCharComponent->shirtRelated[3] && !pCharComponent->shirtRelated[4] && !pCharComponent->shirtRelated[5])
// Shirt
    {
if (shirtID)
        // Shirt
{
        if (shirtID)
auto pShirt = GetItemDisplayInfoRec(shirtID);
        {
if (pShirt && pShirt->GeosetGroup[0])
            auto pShirt = GetItemDisplayInfoRec(shirtID);
{
            if (pShirt && pShirt->GeosetGroup[0])
auto shirtGeoset = 801 + pShirt->GeosetGroup[0];
            {
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1);
                auto shirtGeoset = 801 + pShirt->GeosetGroup[0];
}
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1);
}
            }
}
        }
    }
// Tabard
 
auto pTabard = GetItemDisplayInfoRec(tabardID);
    // Tabard
if (pTabard)
    auto pTabard = GetItemDisplayInfoRec(tabardID);
{
    if (pTabard)
if (!(pTabard->Flags & 0x100000))
    {
{
        if (!(pTabard->Flags & 0x100000))
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0);
        {
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2202, 2202, 1);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0);
}
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2202, 2202, 1);
}
        }
else
    }
{
    else
// Chest
    {
if (chestID)
        // Chest
{
        if (chestID)
auto pChest = GetItemDisplayInfoRec(chestID);
        {
if (pChest && pChest->GeosetGroup[3])
            auto pChest = GetItemDisplayInfoRec(chestID);
{
            if (pChest && pChest->GeosetGroup[3])
auto chestGeoset = 2201 + pChest->GeosetGroup[3];
            {
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0);
                auto chestGeoset = 2201 + pChest->GeosetGroup[3];
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0);
}
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
}
            }
}
        }
    }
// Belt
 
BOOL hasBulkyBeltFlag = 0;
    // Belt
auto pBelt = GetItemDisplayInfoRec(beltID);
    BOOL hasBulkyBeltFlag = 0;
if (pBelt)
    auto pBelt = GetItemDisplayInfoRec(beltID);
hasBulkyBeltFlag = pBelt->Flags & 0x200;
    if (pBelt)
        hasBulkyBeltFlag = pBelt->Flags & 0x200;
BOOL dressPants, dressChestpiece;
 
    BOOL dressPants, dressChestpiece;
// Chest
 
if (chestID)
    // Chest
{
    if (chestID)
auto pChest = GetItemDisplayInfoRec(chestID);
    {
if (pChest && pChest->GeosetGroup[2])
        auto pChest = GetItemDisplayInfoRec(chestID);
{
        if (pChest && pChest->GeosetGroup[2])
if (pChest->GeosetGroup[2])
        {
{
            if (pChest->GeosetGroup[2])
dressPants = 0;
            {
dressChestpiece = 1;
                dressPants = 0;
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
                dressChestpiece = 1;
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0);
auto chestGeoset = pChest->GeosetGroup[2] + 1301;
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
                auto chestGeoset = 1301 + pChest->GeosetGroup[2];
}
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
}
            }
}
        }
else if (pantsID)// Pants
    }
{
    else if (pantsID)// Pants
auto pPants = GetItemDisplayInfoRec(pantsID);
    {
if (pPants && pPants->GeosetGroup[2] && !HIWORD(pCharComponent->flags))
        auto pPants = GetItemDisplayInfoRec(pantsID);
{
        if (pPants && pPants->GeosetGroup[2] && !HIWORD(pCharComponent->flags))
dressPants = 1;
        {
dressChestpiece = 0;
            dressPants = 1;
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
            dressChestpiece = 0;
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0);
auto pantsGeoset = pPants->GeosetGroup[2] + 1301;
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
            auto pantsGeoset = 1301 + pPants->GeosetGroup[2];
}
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
}
        }
else
    }
{
    else
dressPants = 0;
    {
dressChestpiece = 0;
        dressPants = 0;
// Boots
        dressChestpiece = 0;
auto pBoots = GetItemDisplayInfoRec(bootsID);
        // Boots
if (pBoots && pBoots->GeosetGroup[0])
        auto pBoots = GetItemDisplayInfoRec(bootsID);
{
        if (pBoots && pBoots->GeosetGroup[0])
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
        {
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 901, 901, 1);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
auto bootsGeoset = 501 + pBoots->GeosetGroup[0];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 901, 901, 1);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1);
            auto bootsGeoset = 501 + pBoots->GeosetGroup[0];
}
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1);
else
        }
{
        else
// Pants
        {
auto pPants = GetItemDisplayInfoRec(pantsID);
            // Pants
uint32_t pantsGeoset;
            auto pPants = GetItemDisplayInfoRec(pantsID);
if (pPants && pPants->GeosetGroup[1] && !HIWORD(pCharComponent->flags))
            uint32_t pantsGeoset;
{
            if (pPants && pPants->GeosetGroup[1] && !HIWORD(pCharComponent->flags))
pantsGeoset = pPants->GeosetGroup[1] + 901;
            {
}
                pantsGeoset = 901 + pPants->GeosetGroup[1];
else
            }
{
            else
pantsGeoset = 901;
            {
}
                pantsGeoset = 901;
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
            }
}
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
}
        }
    }
// Boots
 
BOOL bootsFlag = 0;
    // Boots
auto pBoots = GetItemDisplayInfoRec(bootsID);
    BOOL bootsFlag = 0;
if (pBoots)
    auto pBoots = GetItemDisplayInfoRec(bootsID);
bootsFlag = (pBoots->Flags & 0x100000) == 0;
    if (pBoots)
        bootsFlag = (pBoots->Flags & 0x100000) == 0;
uint32_t bootsGeoset;
 
if (pBoots && pBoots->GeosetGroup[1])
    uint32_t bootsGeoset;
{
    if (pBoots && pBoots->GeosetGroup[1])
bootsGeoset = pBoots->GeosetGroup[1] + 2000;
    {
}
        bootsGeoset = 2000 + pBoots->GeosetGroup[1];
else
    }
{
    else
if (bootsFlag)
    {
{
        if (bootsFlag)
bootsGeoset = 2002;
        {
}
            bootsGeoset = 2002;
else
        }
{
        else
bootsGeoset = 2001;
        {
}
            bootsGeoset = 2001;
}
        }
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1);
    }
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1);
// Tabard
 
BOOL showsTabard = 0;
    // Tabard
BOOL hasDress = dressChestpiece | dressPants;
    BOOL showsTabard = 0;
if (!hasDress && tabardID != 0 && pTabard && pTabard->GeosetGroup[0])
    BOOL hasDress = dressChestpiece | dressPants;
{
    if (!hasDress && tabardID != 0 && pTabard && pTabard->GeosetGroup[0])
showsTabard = 0;
    {
uint32_t tabardGeoset;
        showsTabard = 0;
if (hasBulkyBeltFlag)
        uint32_t tabardGeoset;
{
        if (hasBulkyBeltFlag)
showsTabard = 1;
        {
tabardGeoset = 1203;
            showsTabard = 1;
}
            tabardGeoset = 1203;
else
        }
{
        else
tabardGeoset = pTabard->GeosetGroup[0] + 1201;
        {
showsTabard = 1;
            tabardGeoset = 1201 + pTabard->GeosetGroup[0];
}
            showsTabard = 1;
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1);
        }
}
        CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1);
else if (!(pCharComponent->flags & 0x10))
    }
{
    else if (!(pCharComponent->flags & 0x10))
    {
}
        // nop
else
    }
{
    else
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1201, 1201, 1);
    {
        CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1201, 1201, 1);
if (!hasDress)
 
{
        if (!hasDress)
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1202, 1202, 1);
        {
showsTabard = 1;
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1202, 1202, 1);
}
            showsTabard = 1;
}
        }
    }
if (!(dressChestpiece | showsTabard))
 
{
    if (!(dressChestpiece | showsTabard))
// Chest
    {
if (chestID)
        // Chest
{
        if (chestID)
auto pChest = GetItemDisplayInfoRec(chestID);
        {
if (pChest && pChest->GeosetGroup[1])
            auto pChest = GetItemDisplayInfoRec(chestID);
{
            if (pChest && pChest->GeosetGroup[1])
auto chestGeoset = 1001 + pChest->GeosetGroup[1];
            {
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
                auto chestGeoset = 1001 + pChest->GeosetGroup[1];
}
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
}
            }
else if (shirtID)
        }
{
        else if (shirtID)
auto pShirt = GetItemDisplayInfoRec(shirtID);
        {
if (pShirt && pShirt->GeosetGroup[1])
            auto pShirt = GetItemDisplayInfoRec(shirtID);
{
            if (pShirt && pShirt->GeosetGroup[1])
auto shirtGeoset = 1001 + pShirt->GeosetGroup[1];
            {
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1);
                auto shirtGeoset = 1001 + pShirt->GeosetGroup[1];
}
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1);
}
            }
}
        }
    }
if (!dressChestpiece && !HIWORD(pCharComponent->flags))
 
{
    if (!dressChestpiece && !HIWORD(pCharComponent->flags))
if (pantsID)
    {
{
        if (pantsID)
auto pPants = GetItemDisplayInfoRec(pantsID);
        {
if (pPants && pPants->GeosetGroup[0])
            auto pPants = GetItemDisplayInfoRec(pantsID);
{
            if (pPants && pPants->GeosetGroup[0])
auto geosetGroup = pPants->GeosetGroup[0];
            {
auto pantsGeoset = 1101 + geosetGroup;
                auto geosetGroup = pPants->GeosetGroup[0];
if (geosetGroup > 2)
                auto pantsGeoset = 1101 + geosetGroup;
{
                if (geosetGroup > 2)
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
                {
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
                    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
}
                    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
else if (!showsTabard)
                }
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
                else if (!showsTabard)
}
                    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
}
            }
}
        }
    }
// Cloak
 
if (cloakID)
    // Cloak
{
    if (cloakID)
auto pCloak = GetItemDisplayInfoRec(cloakID);
    {
if (pCloak && pCloak->GeosetGroup[0])
        auto pCloak = GetItemDisplayInfoRec(cloakID);
{
        if (pCloak && pCloak->GeosetGroup[0])
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1500, 1599, 0);
        {
auto cloakGeoset = 1501 + pCloak->GeosetGroup[0];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1500, 1599, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, cloakGeoset, cloakGeoset, 1);
            auto cloakGeoset = 1501 + pCloak->GeosetGroup[0];
}
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, cloakGeoset, cloakGeoset, 1);
}
        }
    }
// Belt
 
if (beltID)
    // Belt
{
    if (beltID)
auto pBelt = GetItemDisplayInfoRec(beltID);
    {
if (pBelt && pBelt->GeosetGroup[0])
        auto pBelt = GetItemDisplayInfoRec(beltID);
{
        if (pBelt && pBelt->GeosetGroup[0])
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1800, 1899, 0);
        {
auto beltGeoset = 1801 + pBelt->GeosetGroup[0];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1800, 1899, 0);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, beltGeoset, beltGeoset, 1);
            auto beltGeoset = 1801 + pBelt->GeosetGroup[0];
}
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, beltGeoset, beltGeoset, 1);
}
        }
    }
BOOL v76;
 
    BOOL unkBool;
if (pCharComponent->flags & 8)
 
{
    if (pCharComponent->flags & 8)
v76 = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1);
    {
if (v76)
        unkBool = !pantsID && !dressChestpiece && !dressPants && !showsTabard && !tailFlag && !hasBulkyBeltFlag;
{
        //unkBool = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1);
        if (unkBool)
}
        {
else
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1);
{
        }
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0);
        else
}
        {
}
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0);
else
        }
{
    }
v76 = 0;
    else
}
    {
        unkBool = 0;
// DH hands
    }
uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23);
 
if (v86 <= 0)
    // DH hands
v86 = 1;
    uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23);
CM2Model::SetGeometryVisible(pCharComponent->modelPtr, (v86 + 2300), (v86 + 2300), 1);
    if (v86 <= 0)
        v86 = 1;
//sub_1000990E0(pCharComponent, v76 != 0);
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2300 + v86, 2300 + v86, 1);
//v87 = pCharComponent->raceID;
 
//v88 = *genderID;
    //sub_1401BCDC0(pCharComponent, unkBool);
//if (!byte_101E3C7D0)
    //auto v132 = sub_1401C53B0(pCharComponent->raceID, pCharComponent->genderID);
//{
    //auto v133 = sub_14023D380(pCharComponent->raceID, pCharComponent->genderID, pCharComponent->faceIndex, v132 != 0);
// byte_101E3C7D0 = 1;
    //uint32_t v2 = 0;
// v89 = qword_101E3C7C8;
    //if (v133)
// if (qword_101E3C7C8 || (v89 = sub_1000E0760("hdPlayerModels"), (qword_101E3C7C8 = v89) != 0))
    // v2 = *v133;
// v90 = *(v89 + 92) != 0;
    //sub_1412EFA90(pCharComponent->modelPtr, v2);
// else
    //sub_1412EE6B0(pCharComponent->modelPtr);
// v90 = 0;
    //LOBYTE(pCharComponent->flags) &= 0xFDu;
// sub_100097210(v90, dword_101E3C15C);
//}
//v91 = 0;
//if (v87 > 36)
//{
// v92 = 0;
//}
//else
//{
// v92 = 0;
// if (v88 <= 1)
// v92 = dword_101E3C15C[4 * v87 + 2 * v88] == 1;
//}
//v93 = sub_100148CA0(pCharComponent->raceID, *genderID, pCharComponent->faceIndex, v92);
//if (v93)
// v91 = *v93;
//sub_101436B70(pCharComponent->modelPtr, v91);
//sub_1014387C0(pCharComponent->modelPtr);
//LOBYTE(pCharComponent->flags) &= 0xFDu;
  }
  }

Revision as of 20:13, 30 March 2018

// GeosetRenderPrep.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
int main()
{
    return 0;
}
 
struct CCharacterComponent
{
    uint32_t raceID;
    uint32_t classID;
    uint32_t skinIndex;
    uint32_t genderID;
    uint32_t faceIndex;
    void *modelPtr;
    uint32_t submeshIds[29];
    uint32_t itemids[10];
    uint32_t gap2[520];
    uint64_t shirtRelated[6];
    uint32_t flags;
 
    static void GeosRenderPrep(CCharacterComponent *pCharComponent);
};
 
struct CharSectionsRec
{
    uint32_t Flags;
};
 
struct CM2Model
{
    static void SetGeometryVisible(void *model, uint32_t start, uint32_t end, BOOL visible) {}
};
 
struct ItemDisplayInfoRec
{
    uint32_t Flags;
    uint32_t GeosetGroup[4];
};
 
CharSectionsRec *ComponentGetSectionsRecord(uint32_t raceID, uint32_t genderID, uint32_t sectionID, uint32_t faceIndex, uint32_t skinIndex, uint32_t unk1)
{
    return nullptr;
}
 
uint32_t GetConditionalGeoset(uint32_t raceID, uint32_t geosetGroup)
{
    return 0;
}
 
ItemDisplayInfoRec *GetItemDisplayInfoRec(uint32_t itemID)
{
    return nullptr;
}
 
void CCharacterComponent::GeosRenderPrep(CCharacterComponent *pCharComponent)
{
    BOOL eyeGlowFlag = 0;
 
    if (pCharComponent->classID == 6) // DK
    {
        eyeGlowFlag = 1;
    }
    else
    {
        // section Face
        auto pFaceSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 1, pCharComponent->faceIndex, pCharComponent->skinIndex, 0);
 
        if (pFaceSection)
            eyeGlowFlag = pFaceSection->Flags & 4;// flags & 0x4
        else
            eyeGlowFlag = 0;
    }
 
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 3000, 0); // disable all
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 0, 0, 1); // enable skin
 
    uint32_t i = 0;
    do
    {
        if (eyeGlowFlag && i == 17)
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1703, 1703, 1);
        else
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pCharComponent->submeshIds[i], pCharComponent->submeshIds[i], 1);
        ++i;
    } while (i != 29);
 
    // Tail
    BOOL tailFlag = 0;
    // section Skin
    auto pSkinSection = ComponentGetSectionsRecord(pCharComponent->raceID, pCharComponent->genderID, 0, 0, pCharComponent->skinIndex, 0);
    if (pSkinSection)
        tailFlag = pSkinSection->Flags & 0x100; // flags & 0x100
 
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900, 1999, 0);
 
    uint32_t tailGeoset = 1;
    if (!tailFlag)
        tailGeoset = GetConditionalGeoset(pCharComponent->raceID, 19);
    if (tailGeoset <= 0)
        tailGeoset = 1;
 
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1900 + tailGeoset, 1900 + tailGeoset, 1);
 
    // Item ID's
    auto shirtID = pCharComponent->itemids[0];
    auto chestID = pCharComponent->itemids[1];
    auto beltID = pCharComponent->itemids[2];
    auto pantsID = pCharComponent->itemids[3];
    auto bootsID = pCharComponent->itemids[4];
    // 5 wrist?
    auto glovesID = pCharComponent->itemids[6];
    auto tabardID = pCharComponent->itemids[7];
    auto cloakID = pCharComponent->itemids[8];
 
    // Gloves
    if (glovesID)
    {
        auto pGloves = GetItemDisplayInfoRec(glovesID);
        if (pGloves && pGloves->GeosetGroup[0])
        {
            auto glovesGeoset = 401 + pGloves->GeosetGroup[0];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 401, 499, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, glovesGeoset, glovesGeoset, 1);
        }
    }
    else
    {
        // Chest
        if (chestID)
        {
            auto pChest = GetItemDisplayInfoRec(chestID);
            if (pChest && pChest->GeosetGroup[0])
            {
                auto chesetGeoset = 801 + pChest->GeosetGroup[0];
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chesetGeoset, chesetGeoset, 1);
            }
        }
    }
 
    // unknown shirt pre-check
    // possibly !textureArmUpper && !textureArmLower && !textureTorsoUpper && !textureTorsoLower && !textureLegUpper && !textureLegLower ?
    if (!pCharComponent->shirtRelated[0] && !pCharComponent->shirtRelated[1] && !pCharComponent->shirtRelated[2] && !pCharComponent->shirtRelated[3] && !pCharComponent->shirtRelated[4] && !pCharComponent->shirtRelated[5])
    {
        // Shirt
        if (shirtID)
        {
            auto pShirt = GetItemDisplayInfoRec(shirtID);
            if (pShirt && pShirt->GeosetGroup[0])
            {
                auto shirtGeoset = 801 + pShirt->GeosetGroup[0];
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1);
            }
        }
    }
 
    // Tabard
    auto pTabard = GetItemDisplayInfoRec(tabardID);
    if (pTabard)
    {
        if (!(pTabard->Flags & 0x100000))
        {
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2202, 2202, 1);
        }
    }
    else
    {
        // Chest
        if (chestID)
        {
            auto pChest = GetItemDisplayInfoRec(chestID);
            if (pChest && pChest->GeosetGroup[3])
            {
                auto chestGeoset = 2201 + pChest->GeosetGroup[3];
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2200, 2299, 0);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
            }
        }
    }
 
    // Belt
    BOOL hasBulkyBeltFlag = 0;
    auto pBelt = GetItemDisplayInfoRec(beltID);
    if (pBelt)
        hasBulkyBeltFlag = pBelt->Flags & 0x200;
 
    BOOL dressPants, dressChestpiece;
 
    // Chest
    if (chestID)
    {
        auto pChest = GetItemDisplayInfoRec(chestID);
        if (pChest && pChest->GeosetGroup[2])
        {
            if (pChest->GeosetGroup[2])
            {
                dressPants = 0;
                dressChestpiece = 1;
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0);
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
                auto chestGeoset = 1301 + pChest->GeosetGroup[2];
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
            }
        }
    }
    else if (pantsID)// Pants
    {
        auto pPants = GetItemDisplayInfoRec(pantsID);
        if (pPants && pPants->GeosetGroup[2] && !HIWORD(pCharComponent->flags))
        {
            dressPants = 1;
            dressChestpiece = 0;
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 902, 999, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1100, 1199, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
            auto pantsGeoset = 1301 + pPants->GeosetGroup[2];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
        }
    }
    else
    {
        dressPants = 0;
        dressChestpiece = 0;
        // Boots
        auto pBoots = GetItemDisplayInfoRec(bootsID);
        if (pBoots && pBoots->GeosetGroup[0])
        {
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 501, 599, 0);
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 901, 901, 1);
            auto bootsGeoset = 501 + pBoots->GeosetGroup[0];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1);
        }
        else
        {
            // Pants
            auto pPants = GetItemDisplayInfoRec(pantsID);
            uint32_t pantsGeoset;
            if (pPants && pPants->GeosetGroup[1] && !HIWORD(pCharComponent->flags))
            {
                pantsGeoset = 901 + pPants->GeosetGroup[1];
            }
            else
            {
                pantsGeoset = 901;
            }
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
        }
    }
 
    // Boots
    BOOL bootsFlag = 0;
    auto pBoots = GetItemDisplayInfoRec(bootsID);
    if (pBoots)
        bootsFlag = (pBoots->Flags & 0x100000) == 0;
 
    uint32_t bootsGeoset;
    if (pBoots && pBoots->GeosetGroup[1])
    {
        bootsGeoset = 2000 + pBoots->GeosetGroup[1];
    }
    else
    {
        if (bootsFlag)
        {
            bootsGeoset = 2002;
        }
        else
        {
            bootsGeoset = 2001;
        }
    }
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, bootsGeoset, bootsGeoset, 1);
 
    // Tabard
    BOOL showsTabard = 0;
    BOOL hasDress = dressChestpiece | dressPants;
    if (!hasDress && tabardID != 0 && pTabard && pTabard->GeosetGroup[0])
    {
        showsTabard = 0;
        uint32_t tabardGeoset;
        if (hasBulkyBeltFlag)
        {
            showsTabard = 1;
            tabardGeoset = 1203;
        }
        else
        {
            tabardGeoset = 1201 + pTabard->GeosetGroup[0];
            showsTabard = 1;
        }
        CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1);
    }
    else if (!(pCharComponent->flags & 0x10))
    {
        // nop
    }
    else
    {
        CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1201, 1201, 1);
 
        if (!hasDress)
        {
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1202, 1202, 1);
            showsTabard = 1;
        }
    }
 
    if (!(dressChestpiece | showsTabard))
    {
        // Chest
        if (chestID)
        {
            auto pChest = GetItemDisplayInfoRec(chestID);
            if (pChest && pChest->GeosetGroup[1])
            {
                auto chestGeoset = 1001 + pChest->GeosetGroup[1];
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, chestGeoset, chestGeoset, 1);
            }
        }
        else if (shirtID)
        {
            auto pShirt = GetItemDisplayInfoRec(shirtID);
            if (pShirt && pShirt->GeosetGroup[1])
            {
                auto shirtGeoset = 1001 + pShirt->GeosetGroup[1];
                CM2Model::SetGeometryVisible(pCharComponent->modelPtr, shirtGeoset, shirtGeoset, 1);
            }
        }
    }
 
    if (!dressChestpiece && !HIWORD(pCharComponent->flags))
    {
        if (pantsID)
        {
            auto pPants = GetItemDisplayInfoRec(pantsID);
            if (pPants && pPants->GeosetGroup[0])
            {
                auto geosetGroup = pPants->GeosetGroup[0];
                auto pantsGeoset = 1101 + geosetGroup;
                if (geosetGroup > 2)
                {
                    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1300, 1399, 0);
                    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
                }
                else if (!showsTabard)
                    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, pantsGeoset, pantsGeoset, 1);
            }
        }
    }
 
    // Cloak
    if (cloakID)
    {
        auto pCloak = GetItemDisplayInfoRec(cloakID);
        if (pCloak && pCloak->GeosetGroup[0])
        {
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1500, 1599, 0);
            auto cloakGeoset = 1501 + pCloak->GeosetGroup[0];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, cloakGeoset, cloakGeoset, 1);
        }
    }
 
    // Belt
    if (beltID)
    {
        auto pBelt = GetItemDisplayInfoRec(beltID);
        if (pBelt && pBelt->GeosetGroup[0])
        {
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1800, 1899, 0);
            auto beltGeoset = 1801 + pBelt->GeosetGroup[0];
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, beltGeoset, beltGeoset, 1);
        }
    }
 
    BOOL unkBool;
 
    if (pCharComponent->flags & 8)
    {
        unkBool = !pantsID && !dressChestpiece && !dressPants && !showsTabard && !tailFlag && !hasBulkyBeltFlag;
        //unkBool = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1);
        if (unkBool)
        {
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1);
        }
        else
        {
            CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0);
        }
    }
    else
    {
        unkBool = 0;
    }
 
    // DH hands
    uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23);
    if (v86 <= 0)
        v86 = 1;
    CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 2300 + v86, 2300 + v86, 1);
 
    //sub_1401BCDC0(pCharComponent, unkBool);
    //auto v132 = sub_1401C53B0(pCharComponent->raceID, pCharComponent->genderID);
    //auto v133 = sub_14023D380(pCharComponent->raceID, pCharComponent->genderID, pCharComponent->faceIndex, v132 != 0);
    //uint32_t v2 = 0;
    //if (v133)
    //  v2 = *v133;
    //sub_1412EFA90(pCharComponent->modelPtr, v2);
    //sub_1412EE6B0(pCharComponent->modelPtr);
    //LOBYTE(pCharComponent->flags) &= 0xFDu;
}