|
|
|
@ -263,7 +263,24 @@ void NpcAnimation::updateParts(bool forceupdate)
|
|
|
|
|
|
|
|
|
|
showWeapons(mShowWeapons);
|
|
|
|
|
|
|
|
|
|
std::map<int, int> bodypartMap;
|
|
|
|
|
const int Flag_Female = 0x01;
|
|
|
|
|
const int Flag_FirstPerson = 0x02;
|
|
|
|
|
|
|
|
|
|
int flags = 0;
|
|
|
|
|
if (!mNpc->isMale())
|
|
|
|
|
flags |= Flag_Female;
|
|
|
|
|
if (mViewMode == VM_FirstPerson)
|
|
|
|
|
flags |= Flag_FirstPerson;
|
|
|
|
|
|
|
|
|
|
// Remember body parts so we only have to search through the store once for each race/gender/viewmode combination
|
|
|
|
|
static std::map< std::pair<std::string, int> , std::vector<const ESM::BodyPart*> > sRaceMapping;
|
|
|
|
|
std::string race = Misc::StringUtils::lowerCase(mNpc->mRace);
|
|
|
|
|
std::pair<std::string, int> thisCombination = std::make_pair(race, flags);
|
|
|
|
|
if (sRaceMapping.find(thisCombination) == sRaceMapping.end())
|
|
|
|
|
{
|
|
|
|
|
static std::map<int, int> bodypartMap;
|
|
|
|
|
if(bodypartMap.size() == 0)
|
|
|
|
|
{
|
|
|
|
|
bodypartMap[ESM::PRT_Neck] = ESM::BodyPart::MP_Neck;
|
|
|
|
|
bodypartMap[ESM::PRT_Cuirass] = ESM::BodyPart::MP_Chest;
|
|
|
|
|
bodypartMap[ESM::PRT_Groin] = ESM::BodyPart::MP_Groin;
|
|
|
|
@ -284,39 +301,20 @@ void NpcAnimation::updateParts(bool forceupdate)
|
|
|
|
|
bodypartMap[ESM::PRT_RLeg] = ESM::BodyPart::MP_Upperleg;
|
|
|
|
|
bodypartMap[ESM::PRT_LLeg] = ESM::BodyPart::MP_Upperleg;
|
|
|
|
|
bodypartMap[ESM::PRT_Tail] = ESM::BodyPart::MP_Tail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
|
|
|
|
|
|
|
|
|
|
const int Flag_Female = 0x01;
|
|
|
|
|
const int Flag_FirstPerson = 0x02;
|
|
|
|
|
|
|
|
|
|
int flags = 0;
|
|
|
|
|
if (!mNpc->isMale())
|
|
|
|
|
flags |= Flag_Female;
|
|
|
|
|
if (mViewMode == VM_FirstPerson)
|
|
|
|
|
flags |= Flag_FirstPerson;
|
|
|
|
|
|
|
|
|
|
// Remember body parts so we only have to search through the store once for each race/gender/viewmode combination
|
|
|
|
|
static std::map< std::pair<std::string, int> , std::vector<const ESM::BodyPart*> > sRaceMapping;
|
|
|
|
|
std::string race = Misc::StringUtils::lowerCase(mNpc->mRace);
|
|
|
|
|
std::pair<std::string, int> thisCombination = std::make_pair(race, flags);
|
|
|
|
|
if (sRaceMapping.find(thisCombination) == sRaceMapping.end())
|
|
|
|
|
{
|
|
|
|
|
sRaceMapping[thisCombination].resize(ESM::PRT_Count);
|
|
|
|
|
for (int i=0; i<ESM::PRT_Count; ++i)
|
|
|
|
|
sRaceMapping[thisCombination][i] = NULL;
|
|
|
|
|
sRaceMapping[thisCombination].resize(ESM::PRT_Count, NULL);
|
|
|
|
|
|
|
|
|
|
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
|
|
|
|
|
const MWWorld::Store<ESM::BodyPart> &partStore = store.get<ESM::BodyPart>();
|
|
|
|
|
|
|
|
|
|
for (MWWorld::Store<ESM::BodyPart>::iterator it = partStore.begin(); it != partStore.end(); ++it)
|
|
|
|
|
for(MWWorld::Store<ESM::BodyPart>::iterator it = partStore.begin(); it != partStore.end(); ++it)
|
|
|
|
|
{
|
|
|
|
|
const ESM::BodyPart& bodypart = *it;
|
|
|
|
|
if (bodypart.mData.mFlags & ESM::BodyPart::BPF_NotPlayable)
|
|
|
|
|
continue;
|
|
|
|
|
if (bodypart.mData.mType != ESM::BodyPart::MT_Skin)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mNpc->isMale() != (bodypart.mData.mFlags & ESM::BodyPart::BPF_Female))
|
|
|
|
|
continue;
|
|
|
|
|
if (!Misc::StringUtils::ciEqual(bodypart.mRace, mNpc->mRace))
|
|
|
|
|