Race selection preview: render only the head, and focus the camera on its node

actorid
scrawl 12 years ago
parent e7e8bd655f
commit 66d2d3522f

@ -60,7 +60,7 @@ namespace MWRender
mNode = renderRoot->createChildSceneNode();
mAnimation = new NpcAnimation(mCharacter, mNode,
MWWorld::Class::get(mCharacter).getInventoryStore (mCharacter), 0);
MWWorld::Class::get(mCharacter).getInventoryStore (mCharacter), 0, renderHeadOnly());
mNode->setVisible (false);
@ -102,7 +102,7 @@ namespace MWRender
delete mAnimation;
mAnimation = new NpcAnimation(mCharacter, mNode,
MWWorld::Class::get(mCharacter).getInventoryStore (mCharacter), 0);
MWWorld::Class::get(mCharacter).getInventoryStore (mCharacter), 0, renderHeadOnly());
mNode->setVisible (false);
@ -161,7 +161,7 @@ namespace MWRender
RaceSelectionPreview::RaceSelectionPreview()
: CharacterPreview(MWBase::Environment::get().getWorld()->getPlayer().getPlayer(),
512, 512, "CharacterHeadPreview", Ogre::Vector3(0, 120, -35), Ogre::Vector3(0,125,0))
512, 512, "CharacterHeadPreview", Ogre::Vector3(0, 6, -35), Ogre::Vector3(0,125,0))
, mRef(&mBase)
{
mBase = *mCharacter.get<ESM::NPC>()->mBase;
@ -173,6 +173,8 @@ namespace MWRender
mAnimation->runAnimation(0.0f);
mNode->roll(Ogre::Radian(angle), Ogre::SceneNode::TS_LOCAL);
updateCamera();
mNode->setVisible (true);
mRenderTarget->update();
mNode->setVisible (false);
@ -189,5 +191,17 @@ namespace MWRender
void RaceSelectionPreview::onSetup ()
{
mAnimation->play("idle", "start", "stop", false);
updateCamera();
}
void RaceSelectionPreview::updateCamera()
{
Ogre::Vector3 scale = mNode->getScale();
Ogre::Vector3 headOffset = mAnimation->getHeadNode()->_getDerivedPosition();
headOffset = mNode->convertLocalToWorldPosition(headOffset);
mCamera->setPosition(headOffset + mPosition * scale);
mCamera->lookAt(headOffset + mPosition*Ogre::Vector3(0,1,0) * scale);
}
}

@ -36,6 +36,8 @@ namespace MWRender
virtual void rebuild();
protected:
virtual bool renderHeadOnly() { return false; }
Ogre::TexturePtr mTexture;
Ogre::RenderTarget* mRenderTarget;
Ogre::Viewport* mViewport;
@ -82,6 +84,12 @@ namespace MWRender
ESM::NPC mBase;
MWWorld::LiveCellRef<ESM::NPC> mRef;
protected:
virtual bool renderHeadOnly() { return true; }
void updateCamera();
public:
RaceSelectionPreview();

@ -54,7 +54,7 @@ NpcAnimation::~NpcAnimation()
}
NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, MWWorld::InventoryStore& inv, int visibilityFlags)
NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, MWWorld::InventoryStore& inv, int visibilityFlags, bool headOnly)
: Animation(ptr),
mStateID(-1),
mTimeToChange(0),
@ -70,7 +70,8 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, MWWor
mPants(inv.end()),
mGloveL(inv.end()),
mGloveR(inv.end()),
mSkirtIter(inv.end())
mSkirtIter(inv.end()),
mHeadOnly(headOnly)
{
mNpc = mPtr.get<ESM::NPC>()->mBase;
@ -215,7 +216,7 @@ void NpcAnimation::updateParts(bool forceupdate)
if(!forceupdate)
return;
for(size_t i = 0;i < slotlistsize;i++)
for(size_t i = 0;i < slotlistsize && !mHeadOnly;i++)
{
MWWorld::ContainerStoreIterator iter = inv.getSlot(slotlist[i].slot);
@ -252,6 +253,9 @@ void NpcAnimation::updateParts(bool forceupdate)
if(mPartPriorities[ESM::PRT_Hair] < 1 && mPartPriorities[ESM::PRT_Head] <= 1)
addOrReplaceIndividualPart(ESM::PRT_Hair, -1,1, mHairModel);
if (mHeadOnly)
return;
static const struct {
ESM::PartReferenceType type;
const char name[2][12];
@ -449,4 +453,9 @@ void NpcAnimation::addPartGroup(int group, int priority, const std::vector<ESM::
}
}
Ogre::Node* NpcAnimation::getHeadNode()
{
return mEntityList.mSkelBase->getSkeleton()->getBone("Bip01 Head");
}
}

@ -39,6 +39,7 @@ private:
std::string mHeadModel;
std::string mHairModel;
std::string mBodyPrefix;
bool mHeadOnly;
float mTimeToChange;
MWWorld::ContainerStoreIterator mRobe;
@ -73,11 +74,13 @@ private:
public:
NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node,
MWWorld::InventoryStore& inv, int visibilityFlags);
MWWorld::InventoryStore& inv, int visibilityFlags, bool headOnly=false);
virtual ~NpcAnimation();
virtual Ogre::Vector3 runAnimation(float timepassed);
Ogre::Node* getHeadNode();
void forceUpdate()
{ updateParts(true); }
};

Loading…
Cancel
Save