mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-28 21:06:41 +00:00
Don't store the player base node in MWRender::Player
This commit is contained in:
parent
4cedf0fbab
commit
ba3a67f84b
7 changed files with 44 additions and 35 deletions
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <OgreSceneNode.h>
|
#include <OgreSceneNode.h>
|
||||||
#include <OgreCamera.h>
|
#include <OgreCamera.h>
|
||||||
|
#include <OgreSceneManager.h>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
@ -16,8 +17,7 @@ namespace MWRender
|
||||||
{
|
{
|
||||||
Player::Player (Ogre::Camera *camera, Ogre::SceneNode* node)
|
Player::Player (Ogre::Camera *camera, Ogre::SceneNode* node)
|
||||||
: mCamera(camera),
|
: mCamera(camera),
|
||||||
mPlayerNode(node),
|
mCameraNode(NULL),
|
||||||
mCameraNode(mPlayerNode->createChildSceneNode()),
|
|
||||||
mFirstPersonView(true),
|
mFirstPersonView(true),
|
||||||
mPreviewMode(false),
|
mPreviewMode(false),
|
||||||
mFreeLook(true),
|
mFreeLook(true),
|
||||||
|
@ -29,9 +29,6 @@ namespace MWRender
|
||||||
mVanity.enabled = false;
|
mVanity.enabled = false;
|
||||||
mVanity.allowed = true;
|
mVanity.allowed = true;
|
||||||
|
|
||||||
mCameraNode->attachObject(mCamera);
|
|
||||||
mCameraNode->setPosition(0.f, 0.f, mHeight);
|
|
||||||
|
|
||||||
mPreviewCam.yaw = 0.f;
|
mPreviewCam.yaw = 0.f;
|
||||||
mPreviewCam.offset = 400.f;
|
mPreviewCam.offset = 400.f;
|
||||||
}
|
}
|
||||||
|
@ -62,12 +59,22 @@ namespace MWRender
|
||||||
|
|
||||||
const std::string &Player::getHandle() const
|
const std::string &Player::getHandle() const
|
||||||
{
|
{
|
||||||
return mPlayerNode->getName();
|
return mTrackingPtr.getRefData().getHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::attachTo(const MWWorld::Ptr &ptr)
|
void Player::attachTo(const MWWorld::Ptr &ptr)
|
||||||
{
|
{
|
||||||
ptr.getRefData().setBaseNode(mPlayerNode);
|
mTrackingPtr = ptr;
|
||||||
|
Ogre::SceneNode *node = mTrackingPtr.getRefData().getBaseNode()->createChildSceneNode(Ogre::Vector3(0.0f, 0.0f, mHeight));
|
||||||
|
if(mCameraNode)
|
||||||
|
{
|
||||||
|
node->setOrientation(mCameraNode->getOrientation());
|
||||||
|
node->setPosition(mCameraNode->getPosition());
|
||||||
|
node->setScale(mCameraNode->getScale());
|
||||||
|
mCameraNode->getCreator()->destroySceneNode(mCameraNode);
|
||||||
|
}
|
||||||
|
mCameraNode = node;
|
||||||
|
mCameraNode->attachObject(mCamera);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::updateListener()
|
void Player::updateListener()
|
||||||
|
@ -84,13 +91,11 @@ namespace MWRender
|
||||||
updateListener();
|
updateListener();
|
||||||
|
|
||||||
// only show the crosshair in game mode and in first person mode.
|
// only show the crosshair in game mode and in first person mode.
|
||||||
MWBase::Environment::get().getWindowManager ()->showCrosshair
|
MWBase::WindowManager *wm = MWBase::Environment::get().getWindowManager();
|
||||||
(!MWBase::Environment::get().getWindowManager ()->isGuiMode () && (mFirstPersonView && !mVanity.enabled && !mPreviewMode));
|
wm->showCrosshair(!wm->isGuiMode() && (mFirstPersonView && !mVanity.enabled && !mPreviewMode));
|
||||||
|
|
||||||
if (mFirstPersonView && !mVanity.enabled) {
|
if(mVanity.enabled)
|
||||||
return;
|
{
|
||||||
}
|
|
||||||
if (mVanity.enabled) {
|
|
||||||
Ogre::Vector3 rot(0.f, 0.f, 0.f);
|
Ogre::Vector3 rot(0.f, 0.f, 0.f);
|
||||||
rot.z = Ogre::Degree(3.f * duration).valueRadians();
|
rot.z = Ogre::Degree(3.f * duration).valueRadians();
|
||||||
rotateCamera(rot, true);
|
rotateCamera(rot, true);
|
||||||
|
@ -283,21 +288,21 @@ namespace MWRender
|
||||||
|
|
||||||
float Player::getHeight()
|
float Player::getHeight()
|
||||||
{
|
{
|
||||||
return mHeight * mPlayerNode->getScale().z;
|
return mHeight * mTrackingPtr.getRefData().getBaseNode()->getScale().z;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::getPosition(Ogre::Vector3 &player, Ogre::Vector3 &camera)
|
bool Player::getPosition(Ogre::Vector3 &player, Ogre::Vector3 &camera)
|
||||||
{
|
{
|
||||||
mCamera->getParentSceneNode ()->needUpdate(true);
|
mCamera->getParentSceneNode ()->needUpdate(true);
|
||||||
camera = mCamera->getRealPosition();
|
camera = mCamera->getRealPosition();
|
||||||
player = mPlayerNode->getPosition();
|
player = mTrackingPtr.getRefData().getBaseNode()->getPosition();
|
||||||
|
|
||||||
return mFirstPersonView && !mVanity.enabled && !mPreviewMode;
|
return mFirstPersonView && !mVanity.enabled && !mPreviewMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ogre::Vector3 Player::getPosition()
|
Ogre::Vector3 Player::getPosition()
|
||||||
{
|
{
|
||||||
return mPlayerNode->getPosition();
|
return mTrackingPtr.getRefData().getBaseNode()->getPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::getSightAngles(float &pitch, float &yaw)
|
void Player::getSightAngles(float &pitch, float &yaw)
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "../mwworld/ptr.hpp"
|
||||||
|
|
||||||
namespace Ogre
|
namespace Ogre
|
||||||
{
|
{
|
||||||
class Vector3;
|
class Vector3;
|
||||||
|
@ -10,14 +12,10 @@ namespace Ogre
|
||||||
class SceneNode;
|
class SceneNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWWorld
|
|
||||||
{
|
|
||||||
class Ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
{
|
{
|
||||||
class NpcAnimation;
|
class NpcAnimation;
|
||||||
|
|
||||||
/// \brief Player character rendering and camera control
|
/// \brief Player character rendering and camera control
|
||||||
class Player
|
class Player
|
||||||
{
|
{
|
||||||
|
@ -25,9 +23,9 @@ namespace MWRender
|
||||||
float pitch, yaw, offset;
|
float pitch, yaw, offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
Ogre::Camera *mCamera;
|
MWWorld::Ptr mTrackingPtr;
|
||||||
|
|
||||||
Ogre::SceneNode *mPlayerNode;
|
Ogre::Camera *mCamera;
|
||||||
Ogre::SceneNode *mCameraNode;
|
Ogre::SceneNode *mCameraNode;
|
||||||
|
|
||||||
NpcAnimation *mAnimation;
|
NpcAnimation *mAnimation;
|
||||||
|
|
|
@ -858,8 +858,9 @@ void RenderingManager::getTriangleBatchCount(unsigned int &triangles, unsigned i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::attachCameraTo(const MWWorld::Ptr &ptr)
|
void RenderingManager::setupPlayer(const MWWorld::Ptr &ptr)
|
||||||
{
|
{
|
||||||
|
ptr.getRefData().setBaseNode(mRendering.getScene()->getSceneNode("player"));
|
||||||
mPlayer->attachTo(ptr);
|
mPlayer->attachTo(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ class RenderingManager: private RenderingInterface, public Ogre::WindowEventList
|
||||||
|
|
||||||
void getPlayerData(Ogre::Vector3 &eyepos, float &pitch, float &yaw);
|
void getPlayerData(Ogre::Vector3 &eyepos, float &pitch, float &yaw);
|
||||||
|
|
||||||
void attachCameraTo(const MWWorld::Ptr &ptr);
|
void setupPlayer(const MWWorld::Ptr &ptr);
|
||||||
void renderPlayer(const MWWorld::Ptr &ptr);
|
void renderPlayer(const MWWorld::Ptr &ptr);
|
||||||
|
|
||||||
SkyManager* getSkyManager();
|
SkyManager* getSkyManager();
|
||||||
|
|
|
@ -81,10 +81,13 @@ namespace MWWorld
|
||||||
{}
|
{}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string RefData::getHandle()
|
const std::string &RefData::getHandle()
|
||||||
{
|
{
|
||||||
if (!mBaseNode)
|
if(!mBaseNode)
|
||||||
return "";
|
{
|
||||||
|
static const std::string empty;
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
|
||||||
return mBaseNode->getName();
|
return mBaseNode->getName();
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ namespace MWWorld
|
||||||
RefData& operator= (const RefData& refData);
|
RefData& operator= (const RefData& refData);
|
||||||
|
|
||||||
/// Return OGRE handle (may be empty).
|
/// Return OGRE handle (may be empty).
|
||||||
std::string getHandle();
|
const std::string &getHandle();
|
||||||
|
|
||||||
/// Return OGRE base node (can be a null pointer).
|
/// Return OGRE base node (can be a null pointer).
|
||||||
Ogre::SceneNode* getBaseNode();
|
Ogre::SceneNode* getBaseNode();
|
||||||
|
|
|
@ -1493,13 +1493,15 @@ namespace MWWorld
|
||||||
|
|
||||||
void World::setupPlayer(bool newGame)
|
void World::setupPlayer(bool newGame)
|
||||||
{
|
{
|
||||||
const ESM::NPC* player = mStore.get<ESM::NPC>().find ("player");
|
const ESM::NPC *player = mStore.get<ESM::NPC>().find("player");
|
||||||
mPlayer = new MWWorld::Player (player, *this);
|
mPlayer = new MWWorld::Player(player, *this);
|
||||||
mRendering->attachCameraTo(mPlayer->getPlayer());
|
|
||||||
if (newGame)
|
Ptr ptr = mPlayer->getPlayer();
|
||||||
|
mRendering->setupPlayer(ptr);
|
||||||
|
if(newGame)
|
||||||
{
|
{
|
||||||
MWWorld::Class::get(mPlayer->getPlayer()).getContainerStore(mPlayer->getPlayer()).fill(player->mInventory, "", mStore);
|
MWWorld::Class::get(ptr).getContainerStore(ptr).fill(player->mInventory, "", mStore);
|
||||||
MWWorld::Class::get(mPlayer->getPlayer()).getInventoryStore(mPlayer->getPlayer()).autoEquip (mPlayer->getPlayer());
|
MWWorld::Class::get(ptr).getInventoryStore(ptr).autoEquip(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue