Handle multiple entities per NPC part

This commit is contained in:
Chris Robinson 2012-07-17 12:19:50 -07:00
parent 89cfe778f0
commit c6cc82a51a
2 changed files with 79 additions and 145 deletions

View file

@ -28,24 +28,6 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRendere
boots(mInv.end()), boots(mInv.end()),
leftglove(mInv.end()), rightglove(mInv.end()), skirtiter(mInv.end()), leftglove(mInv.end()), rightglove(mInv.end()), skirtiter(mInv.end()),
pants(mInv.end()), pants(mInv.end()),
lclavicle(0),
rclavicle(0),
rupperArm(0),
lupperArm(0),
rUpperLeg(0),
lUpperLeg(0),
lForearm(0),
rForearm(0),
lWrist(0),
rWrist(0),
rKnee(0),
lKnee(0),
neck(0),
rAnkle(0),
lAnkle(0),
groin(0),
lfoot(0),
rfoot(0),
mSkelBase(0) mSkelBase(0)
{ {
MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>(); MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>();
@ -388,15 +370,19 @@ void NpcAnimation::updateParts()
} }
} }
Ogre::Entity* NpcAnimation::insertBoundedPart(const std::string &mesh, const std::string &bonename) std::vector<Ogre::Entity*> NpcAnimation::insertBoundedPart(const std::string &mesh, const std::string &bonename)
{ {
// FIXME: There can be more than one!
NifOgre::MeshPairList meshes = NIFLoader::load(mesh); NifOgre::MeshPairList meshes = NIFLoader::load(mesh);
Ogre::Entity* part = mRend.getScene()->createEntity(meshes[0].first->getName()); std::vector<Ogre::Entity*> parts;
part->setVisibilityFlags(RV_Actors); for(size_t i = 0;i < meshes.size();i++)
{
parts.push_back(mRend.getScene()->createEntity(meshes[i].first->getName()));
Ogre::Entity *part = parts.back();
part->setVisibilityFlags(RV_Actors);
mSkelBase->attachObjectToBone(bonename, part); mSkelBase->attachObjectToBone(bonename, part);
return part; }
return parts;
} }
void NpcAnimation::runAnimation(float timepassed) void NpcAnimation::runAnimation(float timepassed)
@ -430,114 +416,61 @@ void NpcAnimation::runAnimation(float timepassed)
} }
} }
void NpcAnimation::removeEntities(std::vector<Ogre::Entity*> &entities)
{
for(size_t i = 0;i < entities.size();i++)
mSkelBase->detachObjectFromBone(entities[i]);
entities.clear();
}
void NpcAnimation::removeIndividualPart(int type) void NpcAnimation::removeIndividualPart(int type)
{ {
mPartPriorities[type] = 0; mPartPriorities[type] = 0;
mPartslots[type] = -1; mPartslots[type] = -1;
if(type == ESM::PRT_Head && head) //0 if(type == ESM::PRT_Head) //0
{ removeEntities(head);
mSkelBase->detachObjectFromBone(head); else if(type == ESM::PRT_Hair) //1
head = 0; removeEntities(hair);
} else if(type == ESM::PRT_Neck) //2
else if(type == ESM::PRT_Hair && hair) //1 removeEntities(neck);
{ else if(type == ESM::PRT_Groin)//4
mSkelBase->detachObjectFromBone(hair); removeEntities(groin);
hair = 0; else if(type == ESM::PRT_RWrist)//8
} removeEntities(rWrist);
else if(type == ESM::PRT_Neck && neck) //2 else if(type == ESM::PRT_LWrist) //9
{ removeEntities(lWrist);
mSkelBase->detachObjectFromBone(neck);
neck = 0;
}
else if(type == ESM::PRT_Groin && groin)//4
{
mSkelBase->detachObjectFromBone(groin);
groin = 0;
}
else if(type == ESM::PRT_RWrist && rWrist)//8
{
mSkelBase->detachObjectFromBone(rWrist);
rWrist = 0;
}
else if(type == ESM::PRT_LWrist && lWrist) //9
{
mSkelBase->detachObjectFromBone(lWrist);
lWrist = 0;
}
else if(type == ESM::PRT_Shield) //10 else if(type == ESM::PRT_Shield) //10
{ {
} }
else if(type == ESM::PRT_RForearm && rForearm) //11 else if(type == ESM::PRT_RForearm) //11
{ removeEntities(rForearm);
mSkelBase->detachObjectFromBone(rForearm); else if(type == ESM::PRT_LForearm) //12
rForearm = 0; removeEntities(lForearm);
} else if(type == ESM::PRT_RUpperarm) //13
else if(type == ESM::PRT_LForearm && lForearm) //12 removeEntities(rupperArm);
{ else if(type == ESM::PRT_LUpperarm) //14
mSkelBase->detachObjectFromBone(lForearm); removeEntities(lupperArm);
lForearm = 0; else if(type == ESM::PRT_RFoot) //15
} removeEntities(rfoot);
else if(type == ESM::PRT_RUpperarm && rupperArm) //13 else if(type == ESM::PRT_LFoot) //16
{ removeEntities(lfoot);
mSkelBase->detachObjectFromBone(rupperArm); else if(type == ESM::PRT_RAnkle) //17
rupperArm = 0; removeEntities(rAnkle);
} else if(type == ESM::PRT_LAnkle) //18
else if(type == ESM::PRT_LUpperarm && lupperArm) //14 removeEntities(lAnkle);
{ else if(type == ESM::PRT_RKnee) //19
mSkelBase->detachObjectFromBone(lupperArm); removeEntities(rKnee);
lupperArm = 0; else if(type == ESM::PRT_LKnee) //20
} removeEntities(lKnee);
else if(type == ESM::PRT_RFoot && rfoot) //15 else if(type == ESM::PRT_RLeg) //21
{ removeEntities(rUpperLeg);
mSkelBase->detachObjectFromBone(rfoot); else if(type == ESM::PRT_LLeg) //22
rfoot = 0; removeEntities(lUpperLeg);
} else if(type == ESM::PRT_RPauldron) //23
else if(type == ESM::PRT_LFoot && lfoot) //16 removeEntities(rclavicle);
{ else if(type == ESM::PRT_LPauldron) //24
mSkelBase->detachObjectFromBone(lfoot); removeEntities(lclavicle);
lfoot = 0;
}
else if(type == ESM::PRT_RAnkle && rAnkle) //17
{
mSkelBase->detachObjectFromBone(rAnkle);
rAnkle = 0;
}
else if(type == ESM::PRT_LAnkle && lAnkle) //18
{
mSkelBase->detachObjectFromBone(lAnkle);
lAnkle = 0;
}
else if(type == ESM::PRT_RKnee && rKnee) //19
{
mSkelBase->detachObjectFromBone(rKnee);
rKnee = 0;
}
else if(type == ESM::PRT_LKnee && lKnee) //20
{
mSkelBase->detachObjectFromBone(lKnee);
lKnee = 0;
}
else if(type == ESM::PRT_RLeg && rUpperLeg) //21
{
mSkelBase->detachObjectFromBone(rUpperLeg);
rUpperLeg = 0;
}
else if(type == ESM::PRT_LLeg && lUpperLeg) //22
{
mSkelBase->detachObjectFromBone(lUpperLeg);
lUpperLeg = 0;
}
else if(type == ESM::PRT_RPauldron && rclavicle) //23
{
mSkelBase->detachObjectFromBone(rclavicle);
rclavicle = 0;
}
else if(type == ESM::PRT_LPauldron && lclavicle) //24
{
mSkelBase->detachObjectFromBone(lclavicle);
lclavicle = 0;
}
else if(type == ESM::PRT_Weapon) //25 else if(type == ESM::PRT_Weapon) //25
{ {
} }

View file

@ -19,26 +19,26 @@ private:
int mPartPriorities[27]; int mPartPriorities[27];
//Bounded Parts //Bounded Parts
Ogre::Entity* lclavicle; std::vector<Ogre::Entity*> lclavicle;
Ogre::Entity* rclavicle; std::vector<Ogre::Entity*> rclavicle;
Ogre::Entity* rupperArm; std::vector<Ogre::Entity*> rupperArm;
Ogre::Entity* lupperArm; std::vector<Ogre::Entity*> lupperArm;
Ogre::Entity* rUpperLeg; std::vector<Ogre::Entity*> rUpperLeg;
Ogre::Entity* lUpperLeg; std::vector<Ogre::Entity*> lUpperLeg;
Ogre::Entity* lForearm; std::vector<Ogre::Entity*> lForearm;
Ogre::Entity* rForearm; std::vector<Ogre::Entity*> rForearm;
Ogre::Entity* lWrist; std::vector<Ogre::Entity*> lWrist;
Ogre::Entity* rWrist; std::vector<Ogre::Entity*> rWrist;
Ogre::Entity* rKnee; std::vector<Ogre::Entity*> rKnee;
Ogre::Entity* lKnee; std::vector<Ogre::Entity*> lKnee;
Ogre::Entity* neck; std::vector<Ogre::Entity*> neck;
Ogre::Entity* rAnkle; std::vector<Ogre::Entity*> rAnkle;
Ogre::Entity* lAnkle; std::vector<Ogre::Entity*> lAnkle;
Ogre::Entity* groin; std::vector<Ogre::Entity*> groin;
Ogre::Entity* lfoot; std::vector<Ogre::Entity*> lfoot;
Ogre::Entity* rfoot; std::vector<Ogre::Entity*> rfoot;
Ogre::Entity* hair; std::vector<Ogre::Entity*> hair;
Ogre::Entity* head; std::vector<Ogre::Entity*> head;
Ogre::SceneNode* mInsert; Ogre::SceneNode* mInsert;
Ogre::Entity *mSkelBase; // Entity with the base skeleton (temporary) Ogre::Entity *mSkelBase; // Entity with the base skeleton (temporary)
@ -65,9 +65,10 @@ private:
public: public:
NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend, MWWorld::InventoryStore& _inv); NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend, MWWorld::InventoryStore& _inv);
virtual ~NpcAnimation(); virtual ~NpcAnimation();
Ogre::Entity* insertBoundedPart(const std::string &mesh, const std::string &bonename); std::vector<Ogre::Entity*> insertBoundedPart(const std::string &mesh, const std::string &bonename);
virtual void runAnimation(float timepassed); virtual void runAnimation(float timepassed);
void updateParts(); void updateParts();
void removeEntities(std::vector<Ogre::Entity*> &entities);
void removeIndividualPart(int type); void removeIndividualPart(int type);
void reserveIndividualPart(int type, int group, int priority); void reserveIndividualPart(int type, int group, int priority);