DB/ItemDisplayInfo/GeosRenderPrep
Jump to navigation
Jump to search
// 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; }