DB/ItemDisplayInfo/GeosRenderPrep

From wowdev
Revision as of 19:40, 30 March 2018 by Simca (talk | contribs) (Updated code for 8.0.1. It's also more clear.)
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;

	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?
	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
	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 = pChest->GeosetGroup[2] + 1301;
				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 = pPants->GeosetGroup[2] + 1301;
			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 = pPants->GeosetGroup[1] + 901;
			}
			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 = pBoots->GeosetGroup[1] + 2000;
	}
	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 = pTabard->GeosetGroup[0] + 1201;
			showsTabard = 1;
		}
		CM2Model::SetGeometryVisible(pCharComponent->modelPtr, tabardGeoset, tabardGeoset, 1);
	}
	else if (!(pCharComponent->flags & 0x10))
	{

	}
	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 v76;

	if (pCharComponent->flags & 8)
	{
		v76 = ((pantsID | showsTabard | hasDress) == 0) & ((hasBulkyBeltFlag | tailFlag) ^ 1);
		if (v76)
		{
			CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1401, 1401, 1);
		}
		else
		{
			CM2Model::SetGeometryVisible(pCharComponent->modelPtr, 1400, 1400, 0);
		}
	}
	else
	{
		v76 = 0;
	}

	// DH hands
	uint32_t v86 = GetConditionalGeoset(pCharComponent->raceID, 23);
	if (v86 <= 0)
		v86 = 1;
	CM2Model::SetGeometryVisible(pCharComponent->modelPtr, (v86 + 2300), (v86 + 2300), 1);

	//sub_1000990E0(pCharComponent, v76 != 0);
	//v87 = pCharComponent->raceID;
	//v88 = *genderID;
	//if (!byte_101E3C7D0)
	//{
	//	byte_101E3C7D0 = 1;
	//	v89 = qword_101E3C7C8;
	//	if (qword_101E3C7C8 || (v89 = sub_1000E0760("hdPlayerModels"), (qword_101E3C7C8 = v89) != 0))
	//		v90 = *(v89 + 92) != 0;
	//	else
	//		v90 = 0;
	//	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;
}