Support multiple entities for the NPC base

This commit is contained in:
Chris Robinson 2012-07-17 11:38:20 -07:00
parent 0a4a141f2e
commit 89cfe778f0
2 changed files with 50 additions and 43 deletions

View file

@ -45,7 +45,8 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRendere
lAnkle(0), lAnkle(0),
groin(0), groin(0),
lfoot(0), lfoot(0),
rfoot(0) rfoot(0),
mSkelBase(0)
{ {
MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>(); MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>();
@ -82,33 +83,39 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRendere
std::string smodel = (!isBeast ? "meshes\\base_anim.nif" : "meshes\\base_animkna.nif"); std::string smodel = (!isBeast ? "meshes\\base_anim.nif" : "meshes\\base_animkna.nif");
// FIXME: There can be more than one!
NifOgre::MeshPairList meshes = NifOgre::NIFLoader::load(smodel); NifOgre::MeshPairList meshes = NifOgre::NIFLoader::load(smodel);
mBase = mRend.getScene()->createEntity(meshes[0].first->getName()); for(size_t i = 0;i < meshes.size();i++)
mBase->setVisibilityFlags(RV_Actors);
bool transparent = false;
for (unsigned int i=0; i<mBase->getNumSubEntities(); ++i)
{ {
Ogre::MaterialPtr mat = mBase->getSubEntity(i)->getMaterial(); mBase.push_back(mRend.getScene()->createEntity(meshes[i].first->getName()));
Ogre::Material::TechniqueIterator techIt = mat->getTechniqueIterator(); Ogre::Entity *base = mBase.back();
while (techIt.hasMoreElements())
if(!mSkelBase && base->hasSkeleton())
mSkelBase = base;
base->setVisibilityFlags(RV_Actors);
bool transparent = false;
for(unsigned int j=0;j < base->getNumSubEntities();++j)
{ {
Ogre::Technique* tech = techIt.getNext(); Ogre::MaterialPtr mat = base->getSubEntity(j)->getMaterial();
Ogre::Technique::PassIterator passIt = tech->getPassIterator(); Ogre::Material::TechniqueIterator techIt = mat->getTechniqueIterator();
while (passIt.hasMoreElements()) while (techIt.hasMoreElements())
{ {
Ogre::Pass* pass = passIt.getNext(); Ogre::Technique* tech = techIt.getNext();
if (pass->getDepthWriteEnabled() == false) Ogre::Technique::PassIterator passIt = tech->getPassIterator();
transparent = true; while (passIt.hasMoreElements())
{
Ogre::Pass* pass = passIt.getNext();
if (pass->getDepthWriteEnabled() == false)
transparent = true;
}
} }
} }
} base->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main);
mBase->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main); base->setSkipAnimationStateUpdate(true); //Magical line of code, this makes the bones
mBase->setSkipAnimationStateUpdate(true); //Magical line of code, this makes the bones //stay in the same place when we skipanim, or open a gui window
//stay in the same place when we skipanim, or open a gui window
mInsert->attachObject(mBase); mInsert->attachObject(base);
}
if(isFemale) if(isFemale)
mInsert->scale(race->data.height.female, race->data.height.female, race->data.height.female); mInsert->scale(race->data.height.female, race->data.height.female, race->data.height.female);
@ -388,7 +395,7 @@ Ogre::Entity* NpcAnimation::insertBoundedPart(const std::string &mesh, const std
Ogre::Entity* part = mRend.getScene()->createEntity(meshes[0].first->getName()); Ogre::Entity* part = mRend.getScene()->createEntity(meshes[0].first->getName());
part->setVisibilityFlags(RV_Actors); part->setVisibilityFlags(RV_Actors);
mBase->attachObjectToBone(bonename, part); mSkelBase->attachObjectToBone(bonename, part);
return part; return part;
} }
@ -430,32 +437,32 @@ void NpcAnimation::removeIndividualPart(int type)
if(type == ESM::PRT_Head && head) //0 if(type == ESM::PRT_Head && head) //0
{ {
mBase->detachObjectFromBone(head); mSkelBase->detachObjectFromBone(head);
head = 0; head = 0;
} }
else if(type == ESM::PRT_Hair && hair) //1 else if(type == ESM::PRT_Hair && hair) //1
{ {
mBase->detachObjectFromBone(hair); mSkelBase->detachObjectFromBone(hair);
hair = 0; hair = 0;
} }
else if(type == ESM::PRT_Neck && neck) //2 else if(type == ESM::PRT_Neck && neck) //2
{ {
mBase->detachObjectFromBone(neck); mSkelBase->detachObjectFromBone(neck);
neck = 0; neck = 0;
} }
else if(type == ESM::PRT_Groin && groin)//4 else if(type == ESM::PRT_Groin && groin)//4
{ {
mBase->detachObjectFromBone(groin); mSkelBase->detachObjectFromBone(groin);
groin = 0; groin = 0;
} }
else if(type == ESM::PRT_RWrist && rWrist)//8 else if(type == ESM::PRT_RWrist && rWrist)//8
{ {
mBase->detachObjectFromBone(rWrist); mSkelBase->detachObjectFromBone(rWrist);
rWrist = 0; rWrist = 0;
} }
else if(type == ESM::PRT_LWrist && lWrist) //9 else if(type == ESM::PRT_LWrist && lWrist) //9
{ {
mBase->detachObjectFromBone(lWrist); mSkelBase->detachObjectFromBone(lWrist);
lWrist = 0; lWrist = 0;
} }
else if(type == ESM::PRT_Shield) //10 else if(type == ESM::PRT_Shield) //10
@ -463,72 +470,72 @@ void NpcAnimation::removeIndividualPart(int type)
} }
else if(type == ESM::PRT_RForearm && rForearm) //11 else if(type == ESM::PRT_RForearm && rForearm) //11
{ {
mBase->detachObjectFromBone(rForearm); mSkelBase->detachObjectFromBone(rForearm);
rForearm = 0; rForearm = 0;
} }
else if(type == ESM::PRT_LForearm && lForearm) //12 else if(type == ESM::PRT_LForearm && lForearm) //12
{ {
mBase->detachObjectFromBone(lForearm); mSkelBase->detachObjectFromBone(lForearm);
lForearm = 0; lForearm = 0;
} }
else if(type == ESM::PRT_RUpperarm && rupperArm) //13 else if(type == ESM::PRT_RUpperarm && rupperArm) //13
{ {
mBase->detachObjectFromBone(rupperArm); mSkelBase->detachObjectFromBone(rupperArm);
rupperArm = 0; rupperArm = 0;
} }
else if(type == ESM::PRT_LUpperarm && lupperArm) //14 else if(type == ESM::PRT_LUpperarm && lupperArm) //14
{ {
mBase->detachObjectFromBone(lupperArm); mSkelBase->detachObjectFromBone(lupperArm);
lupperArm = 0; lupperArm = 0;
} }
else if(type == ESM::PRT_RFoot && rfoot) //15 else if(type == ESM::PRT_RFoot && rfoot) //15
{ {
mBase->detachObjectFromBone(rfoot); mSkelBase->detachObjectFromBone(rfoot);
rfoot = 0; rfoot = 0;
} }
else if(type == ESM::PRT_LFoot && lfoot) //16 else if(type == ESM::PRT_LFoot && lfoot) //16
{ {
mBase->detachObjectFromBone(lfoot); mSkelBase->detachObjectFromBone(lfoot);
lfoot = 0; lfoot = 0;
} }
else if(type == ESM::PRT_RAnkle && rAnkle) //17 else if(type == ESM::PRT_RAnkle && rAnkle) //17
{ {
mBase->detachObjectFromBone(rAnkle); mSkelBase->detachObjectFromBone(rAnkle);
rAnkle = 0; rAnkle = 0;
} }
else if(type == ESM::PRT_LAnkle && lAnkle) //18 else if(type == ESM::PRT_LAnkle && lAnkle) //18
{ {
mBase->detachObjectFromBone(lAnkle); mSkelBase->detachObjectFromBone(lAnkle);
lAnkle = 0; lAnkle = 0;
} }
else if(type == ESM::PRT_RKnee && rKnee) //19 else if(type == ESM::PRT_RKnee && rKnee) //19
{ {
mBase->detachObjectFromBone(rKnee); mSkelBase->detachObjectFromBone(rKnee);
rKnee = 0; rKnee = 0;
} }
else if(type == ESM::PRT_LKnee && lKnee) //20 else if(type == ESM::PRT_LKnee && lKnee) //20
{ {
mBase->detachObjectFromBone(lKnee); mSkelBase->detachObjectFromBone(lKnee);
lKnee = 0; lKnee = 0;
} }
else if(type == ESM::PRT_RLeg && rUpperLeg) //21 else if(type == ESM::PRT_RLeg && rUpperLeg) //21
{ {
mBase->detachObjectFromBone(rUpperLeg); mSkelBase->detachObjectFromBone(rUpperLeg);
rUpperLeg = 0; rUpperLeg = 0;
} }
else if(type == ESM::PRT_LLeg && lUpperLeg) //22 else if(type == ESM::PRT_LLeg && lUpperLeg) //22
{ {
mBase->detachObjectFromBone(lUpperLeg); mSkelBase->detachObjectFromBone(lUpperLeg);
lUpperLeg = 0; lUpperLeg = 0;
} }
else if(type == ESM::PRT_RPauldron && rclavicle) //23 else if(type == ESM::PRT_RPauldron && rclavicle) //23
{ {
mBase->detachObjectFromBone(rclavicle); mSkelBase->detachObjectFromBone(rclavicle);
rclavicle = 0; rclavicle = 0;
} }
else if(type == ESM::PRT_LPauldron && lclavicle) //24 else if(type == ESM::PRT_LPauldron && lclavicle) //24
{ {
mBase->detachObjectFromBone(lclavicle); mSkelBase->detachObjectFromBone(lclavicle);
lclavicle = 0; lclavicle = 0;
} }
else if(type == ESM::PRT_Weapon) //25 else if(type == ESM::PRT_Weapon) //25

View file

@ -41,7 +41,7 @@ private:
Ogre::Entity* head; Ogre::Entity* head;
Ogre::SceneNode* mInsert; Ogre::SceneNode* mInsert;
Ogre::Entity *mBase; // FIXME: Temporary! Ogre::Entity *mSkelBase; // Entity with the base skeleton (temporary)
bool isBeast; bool isBeast;
bool isFemale; bool isFemale;
std::string headModel; std::string headModel;