From 392e6efcb52e5de6f0acadcf9861f48f77c26590 Mon Sep 17 00:00:00 2001 From: greye Date: Tue, 14 Aug 2012 20:33:29 +0400 Subject: [PATCH] initial player rendering --- apps/openmw/engine.cpp | 2 ++ apps/openmw/mwbase/world.hpp | 2 ++ apps/openmw/mwinput/inputmanagerimp.cpp | 1 + apps/openmw/mwrender/player.cpp | 21 ++++++++++++++++++++- apps/openmw/mwrender/player.hpp | 10 ++++++++++ apps/openmw/mwrender/renderingmanager.cpp | 12 ++++++++++++ apps/openmw/mwrender/renderingmanager.hpp | 1 + apps/openmw/mwworld/worldimp.cpp | 5 +++++ apps/openmw/mwworld/worldimp.hpp | 2 ++ 9 files changed, 55 insertions(+), 1 deletion(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index b8421cc62..b818477e6 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -352,6 +352,8 @@ void OMW::Engine::go() pos.rot[0] = pos.rot[1] = pos.rot[2] = 0; pos.pos[2] = 0; + mEnvironment.getWorld()->renderPlayer(); + if (const ESM::Cell *exterior = MWBase::Environment::get().getWorld()->getExterior (mCellName)) { MWBase::Environment::get().getWorld()->indexToPosition (exterior->data.gridX, exterior->data.gridY, diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index 819a242ec..fbc57b487 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -253,6 +253,8 @@ namespace MWBase virtual void togglePreviewMode(bool enable) = 0; virtual bool toggleVanityMode(bool enable, bool force) = 0; virtual void allowVanityMode(bool allow) = 0; + + virtual void renderPlayer() = 0; }; } diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index f0ca510ea..9295233de 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -411,6 +411,7 @@ private: if (mPreviewPOVDelay <= 0.5 && (mPreviewPOVDelay += duration) > 0.5) { + mPreviewPOVDelay = 1.f; MWBase::Environment::get().getWorld()->togglePreviewMode(true); } } else { diff --git a/apps/openmw/mwrender/player.cpp b/apps/openmw/mwrender/player.cpp index 2a1feacad..c20ffad55 100644 --- a/apps/openmw/mwrender/player.cpp +++ b/apps/openmw/mwrender/player.cpp @@ -10,6 +10,8 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/refdata.hpp" +#include "npcanimation.hpp" + namespace MWRender { Player::Player (Ogre::Camera *camera, Ogre::SceneNode* node) @@ -19,7 +21,7 @@ namespace MWRender mVanityNode(mPlayerNode->createChildSceneNode()), mFirstPersonView(true), mPreviewMode(false), - mHeight(40.f), + mHeight(128.f), mCameraDistance(400.f) { mVanity.enabled = false; @@ -111,6 +113,7 @@ namespace MWRender void Player::update(float duration) { + Ogre::Vector3 pos = mPlayerNode->getPosition(); if (!mVanity.enabled) { ++mUpdates; mTimeIdle += duration; @@ -118,6 +121,9 @@ namespace MWRender toggleVanityMode(true); } } + if (mAnimation) { + mAnimation->runAnimation(duration); + } if (mFirstPersonView && !mVanity.enabled) { return; } @@ -133,8 +139,10 @@ namespace MWRender mFirstPersonView = !mFirstPersonView; if (mFirstPersonView) { mCamera->setPosition(0.f, 0.f, 0.f); + mCameraNode->setPosition(0.f, 0.f, 128.f); } else { 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; + } } diff --git a/apps/openmw/mwrender/player.hpp b/apps/openmw/mwrender/player.hpp index 1ca9bfc21..82af243bc 100644 --- a/apps/openmw/mwrender/player.hpp +++ b/apps/openmw/mwrender/player.hpp @@ -17,6 +17,7 @@ namespace MWWorld namespace MWRender { + class NpcAnimation; /// \brief Player character rendering and camera control class Player { @@ -30,6 +31,8 @@ namespace MWRender Ogre::SceneNode *mCameraNode; Ogre::SceneNode *mVanityNode; + NpcAnimation *mAnimation; + bool mFirstPersonView; bool mPreviewMode; @@ -82,6 +85,13 @@ namespace MWRender void update(float duration); void setCameraDistance(float dist, bool adjust = false); + + void setAnimation(MWRender::NpcAnimation *anim) { + mAnimation = anim; + } + + void setHeight(float height); + float getHeight(); }; } diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 05902d662..8b6f483ca 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -33,6 +33,7 @@ #include "localmap.hpp" #include "water.hpp" #include "compositors.hpp" +#include "npcanimation.hpp" using namespace MWRender; using namespace Ogre; @@ -830,4 +831,15 @@ void RenderingManager::attachCameraTo(const MWWorld::Ptr &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 diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 741ccc559..aa07bbc22 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -73,6 +73,7 @@ class RenderingManager: private RenderingInterface, public Ogre::WindowEventList } void attachCameraTo(const MWWorld::Ptr &ptr); + void renderPlayer(const MWWorld::Ptr &ptr); SkyManager* getSkyManager(); Compositors* getCompositors(); diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 20706438d..7a8f73034 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1151,4 +1151,9 @@ namespace MWWorld } return pos.z < cell.water; } + + void World::renderPlayer() + { + mRendering->renderPlayer(mPlayer->getPlayer()); + } } diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 26824e763..717c43cfa 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -292,6 +292,8 @@ namespace MWWorld virtual void allowVanityMode(bool allow) { mRendering->allowVanityMode(allow); } + + virtual void renderPlayer(); }; }