initial player rendering

This commit is contained in:
greye 2012-08-14 20:33:29 +04:00
parent 6f87c0c36d
commit 392e6efcb5
9 changed files with 55 additions and 1 deletions

View file

@ -352,6 +352,8 @@ void OMW::Engine::go()
pos.rot[0] = pos.rot[1] = pos.rot[2] = 0; pos.rot[0] = pos.rot[1] = pos.rot[2] = 0;
pos.pos[2] = 0; pos.pos[2] = 0;
mEnvironment.getWorld()->renderPlayer();
if (const ESM::Cell *exterior = MWBase::Environment::get().getWorld()->getExterior (mCellName)) if (const ESM::Cell *exterior = MWBase::Environment::get().getWorld()->getExterior (mCellName))
{ {
MWBase::Environment::get().getWorld()->indexToPosition (exterior->data.gridX, exterior->data.gridY, MWBase::Environment::get().getWorld()->indexToPosition (exterior->data.gridX, exterior->data.gridY,

View file

@ -253,6 +253,8 @@ namespace MWBase
virtual void togglePreviewMode(bool enable) = 0; virtual void togglePreviewMode(bool enable) = 0;
virtual bool toggleVanityMode(bool enable, bool force) = 0; virtual bool toggleVanityMode(bool enable, bool force) = 0;
virtual void allowVanityMode(bool allow) = 0; virtual void allowVanityMode(bool allow) = 0;
virtual void renderPlayer() = 0;
}; };
} }

View file

@ -411,6 +411,7 @@ private:
if (mPreviewPOVDelay <= 0.5 && if (mPreviewPOVDelay <= 0.5 &&
(mPreviewPOVDelay += duration) > 0.5) (mPreviewPOVDelay += duration) > 0.5)
{ {
mPreviewPOVDelay = 1.f;
MWBase::Environment::get().getWorld()->togglePreviewMode(true); MWBase::Environment::get().getWorld()->togglePreviewMode(true);
} }
} else { } else {

View file

@ -10,6 +10,8 @@
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/refdata.hpp" #include "../mwworld/refdata.hpp"
#include "npcanimation.hpp"
namespace MWRender namespace MWRender
{ {
Player::Player (Ogre::Camera *camera, Ogre::SceneNode* node) Player::Player (Ogre::Camera *camera, Ogre::SceneNode* node)
@ -19,7 +21,7 @@ namespace MWRender
mVanityNode(mPlayerNode->createChildSceneNode()), mVanityNode(mPlayerNode->createChildSceneNode()),
mFirstPersonView(true), mFirstPersonView(true),
mPreviewMode(false), mPreviewMode(false),
mHeight(40.f), mHeight(128.f),
mCameraDistance(400.f) mCameraDistance(400.f)
{ {
mVanity.enabled = false; mVanity.enabled = false;
@ -111,6 +113,7 @@ namespace MWRender
void Player::update(float duration) void Player::update(float duration)
{ {
Ogre::Vector3 pos = mPlayerNode->getPosition();
if (!mVanity.enabled) { if (!mVanity.enabled) {
++mUpdates; ++mUpdates;
mTimeIdle += duration; mTimeIdle += duration;
@ -118,6 +121,9 @@ namespace MWRender
toggleVanityMode(true); toggleVanityMode(true);
} }
} }
if (mAnimation) {
mAnimation->runAnimation(duration);
}
if (mFirstPersonView && !mVanity.enabled) { if (mFirstPersonView && !mVanity.enabled) {
return; return;
} }
@ -133,8 +139,10 @@ namespace MWRender
mFirstPersonView = !mFirstPersonView; mFirstPersonView = !mFirstPersonView;
if (mFirstPersonView) { if (mFirstPersonView) {
mCamera->setPosition(0.f, 0.f, 0.f); mCamera->setPosition(0.f, 0.f, 0.f);
mCameraNode->setPosition(0.f, 0.f, 128.f);
} else { } else {
mCamera->setPosition(0.f, 0.f, mCameraDistance); mCamera->setPosition(0.f, 0.f, mCameraDistance);
mCameraNode->setPosition(0.f, 0.f, 104.f);
} }
} }
@ -279,4 +287,15 @@ namespace MWRender
} }
} }
} }
void Player::setHeight(float height)
{
mHeight = height;
mCameraNode->setPosition(0.f, 0.f, mHeight);
}
float Player::getHeight()
{
return mHeight;
}
} }

View file

@ -17,6 +17,7 @@ namespace MWWorld
namespace MWRender namespace MWRender
{ {
class NpcAnimation;
/// \brief Player character rendering and camera control /// \brief Player character rendering and camera control
class Player class Player
{ {
@ -30,6 +31,8 @@ namespace MWRender
Ogre::SceneNode *mCameraNode; Ogre::SceneNode *mCameraNode;
Ogre::SceneNode *mVanityNode; Ogre::SceneNode *mVanityNode;
NpcAnimation *mAnimation;
bool mFirstPersonView; bool mFirstPersonView;
bool mPreviewMode; bool mPreviewMode;
@ -82,6 +85,13 @@ namespace MWRender
void update(float duration); void update(float duration);
void setCameraDistance(float dist, bool adjust = false); void setCameraDistance(float dist, bool adjust = false);
void setAnimation(MWRender::NpcAnimation *anim) {
mAnimation = anim;
}
void setHeight(float height);
float getHeight();
}; };
} }

View file

@ -33,6 +33,7 @@
#include "localmap.hpp" #include "localmap.hpp"
#include "water.hpp" #include "water.hpp"
#include "compositors.hpp" #include "compositors.hpp"
#include "npcanimation.hpp"
using namespace MWRender; using namespace MWRender;
using namespace Ogre; using namespace Ogre;
@ -830,4 +831,15 @@ void RenderingManager::attachCameraTo(const MWWorld::Ptr &ptr)
mPlayer->attachTo(ptr); mPlayer->attachTo(ptr);
} }
void RenderingManager::renderPlayer(const MWWorld::Ptr &ptr)
{
MWRender::NpcAnimation *anim =
new MWRender::NpcAnimation(
ptr,
mRendering,
MWWorld::Class::get(ptr).getInventoryStore(ptr)
);
mPlayer->setAnimation(anim);
}
} // namespace } // namespace

View file

@ -73,6 +73,7 @@ class RenderingManager: private RenderingInterface, public Ogre::WindowEventList
} }
void attachCameraTo(const MWWorld::Ptr &ptr); void attachCameraTo(const MWWorld::Ptr &ptr);
void renderPlayer(const MWWorld::Ptr &ptr);
SkyManager* getSkyManager(); SkyManager* getSkyManager();
Compositors* getCompositors(); Compositors* getCompositors();

View file

@ -1151,4 +1151,9 @@ namespace MWWorld
} }
return pos.z < cell.water; return pos.z < cell.water;
} }
void World::renderPlayer()
{
mRendering->renderPlayer(mPlayer->getPlayer());
}
} }

View file

@ -292,6 +292,8 @@ namespace MWWorld
virtual void allowVanityMode(bool allow) { virtual void allowVanityMode(bool allow) {
mRendering->allowVanityMode(allow); mRendering->allowVanityMode(allow);
} }
virtual void renderPlayer();
}; };
} }