1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-01 02:45:32 +00:00

camera adjustment, fix view mode on start

This commit is contained in:
greye 2012-08-16 13:15:38 +04:00
parent 34f796c38e
commit a453a7f035
4 changed files with 80 additions and 28 deletions

View file

@ -242,7 +242,8 @@ private:
player(_player), player(_player),
windows(_windows), windows(_windows),
mEngine (engine), mEngine (engine),
mDragDrop(false) mDragDrop(false),
mPreviewPOVDelay(0.f)
{ {
using namespace OEngine::Input; using namespace OEngine::Input;
using namespace OEngine::Render; using namespace OEngine::Render;

View file

@ -22,7 +22,8 @@ namespace MWRender
mFirstPersonView(true), mFirstPersonView(true),
mPreviewMode(false), mPreviewMode(false),
mHeight(128.f), mHeight(128.f),
mCameraDistance(400.f) mCameraDistance(300.f),
mDistanceAdjusted(false)
{ {
mVanity.enabled = false; mVanity.enabled = false;
mVanity.allowed = true; mVanity.allowed = true;
@ -32,7 +33,7 @@ namespace MWRender
mCameraNode->setPosition(0.f, 0.f, mHeight); mCameraNode->setPosition(0.f, 0.f, mHeight);
mPreviewCam.yaw = 0.f; mPreviewCam.yaw = 0.f;
mPreviewCam.offset = 600.f; mPreviewCam.offset = 400.f;
} }
bool Player::rotate(const Ogre::Vector3 &rot, bool adjust) bool Player::rotate(const Ogre::Vector3 &rot, bool adjust)
@ -167,7 +168,7 @@ namespace MWRender
mVanity.enabled = enable; mVanity.enabled = enable;
mVanity.forced = force && enable; mVanity.forced = force && enable;
float offset = 300.f; float offset = mPreviewCam.offset;
Ogre::Vector3 rot(0.f, 0.f, 0.f); Ogre::Vector3 rot(0.f, 0.f, 0.f);
if (mVanity.enabled) { if (mVanity.enabled) {
mPlayerNode->setVisible(true, false); mPlayerNode->setVisible(true, false);
@ -267,32 +268,45 @@ namespace MWRender
node->addChild(mCameraNode); node->addChild(mCameraNode);
} }
void Player::setCameraDistance(float dist, bool adjust) void Player::setCameraDistance(float dist, bool adjust, bool override)
{ {
/// \note non-Morrowind feature: allow to change camera distance if (mFirstPersonView && !mPreviewMode && !mVanity.enabled) {
/// int 3d-person mode return;
/// \todo review and simplify condition if possible }
if (mPreviewMode || Ogre::Vector3 v(0.f, 0.f, dist);
mVanity.forced || if (adjust) {
(!mVanity.enabled && !mFirstPersonView)) v += mCamera->getPosition();
{ }
Ogre::Vector3 v(0.f, 0.f, dist); if (v.z > 800.f) {
if (adjust) { v.z = 800.f;
v += mCamera->getPosition(); } else if (v.z < 10.f) {
} v.z = 10.f;
if (v.z > 800.f) { }
v.z = 800.f; mCamera->setPosition(v);
} else if (v.z < 100.f) {
v.z = 100.f;
}
mCamera->setPosition(v);
if (!mVanity.enabled && !mFirstPersonView) { if (override) {
if (mVanity.enabled || mPreviewMode) {
mPreviewCam.offset = v.z;
} else if (!mFirstPersonView) {
mCameraDistance = v.z; mCameraDistance = v.z;
} }
} else {
mDistanceAdjusted = true;
} }
} }
void Player::setCameraDistance()
{
if (mDistanceAdjusted) {
if (mVanity.enabled || mPreviewMode) {
mCamera->setPosition(0, 0, mPreviewCam.offset);
} else if (!mFirstPersonView) {
mCamera->setPosition(0, 0, mCameraDistance);
}
}
mDistanceAdjusted = false;
}
void Player::setAnimation(NpcAnimation *anim) void Player::setAnimation(NpcAnimation *anim)
{ {
mAnimation = anim; mAnimation = anim;
@ -307,6 +321,16 @@ namespace MWRender
float Player::getHeight() float Player::getHeight()
{ {
return mHeight; return mHeight * mPlayerNode->getScale().z;
}
bool Player::getPosition(Ogre::Vector3 &player, Ogre::Vector3 &camera)
{
float xch;
camera = mCamera->getRealPosition();
xch = camera.z, camera.z = camera.y, camera.y = -xch;
player = mPlayerNode->getPosition();
return mFirstPersonView && !mVanity.enabled && !mPreviewMode;
} }
} }

View file

@ -43,6 +43,8 @@ namespace MWRender
float mHeight, mCameraDistance; float mHeight, mCameraDistance;
CamData mMainCam, mPreviewCam; CamData mMainCam, mPreviewCam;
bool mDistanceAdjusted;
float mTimeIdle; float mTimeIdle;
int mUpdates; int mUpdates;
@ -84,12 +86,23 @@ namespace MWRender
void update(float duration); void update(float duration);
void setCameraDistance(float dist, bool adjust = false); /// Set camera distance for current mode. Don't work on 1st person view.
/// \param adjust Indicates should distance be adjusted or set.
/// \param override If true new distance will be used as default.
/// If false, default distance can be restored with setCameraDistance().
void setCameraDistance(float dist, bool adjust = false, bool override = true);
/// Restore default camera distance for current mode.
void setCameraDistance();
void setAnimation(MWRender::NpcAnimation *anim); void setAnimation(MWRender::NpcAnimation *anim);
void setHeight(float height); void setHeight(float height);
float getHeight(); float getHeight();
/// Stores player and camera world positions in passed arguments
/// \return true if camera at the eye-place
bool getPosition(Ogre::Vector3 &player, Ogre::Vector3 &camera);
}; };
} }

View file

@ -41,7 +41,7 @@ using namespace Ogre;
namespace MWRender { namespace MWRender {
RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine) RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine)
:mRendering(_rend), mObjects(mRendering), mActors(mRendering), mAmbientMode(0), mSunEnabled(0) :mRendering(_rend), mObjects(mRendering), mActors(mRendering), mAmbientMode(0), mSunEnabled(0), mPhysicsEngine(engine)
{ {
// select best shader mode // select best shader mode
bool openGL = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL") != std::string::npos); bool openGL = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL") != std::string::npos);
@ -296,7 +296,22 @@ RenderingManager::moveObjectToCell(
child->setPosition(pos); child->setPosition(pos);
} }
void RenderingManager::update (float duration){ void RenderingManager::update (float duration)
{
Ogre::Vector3 orig, dest;
mPlayer->setCameraDistance();
if (!mPlayer->getPosition(orig, dest)) {
orig.z += mPlayer->getHeight() * mMwRoot->getScale().z;
btVector3 btOrig(orig.x, orig.y, orig.z);
btVector3 btDest(dest.x, dest.y, dest.z);
std::pair<std::string, float> test =
mPhysicsEngine->rayTest(btOrig, btDest);
if (!test.first.empty()) {
mPlayer->setCameraDistance(test.second * orig.distance(dest), false, false);
}
}
mPlayer->update(duration);
mActors.update (duration); mActors.update (duration);
mObjects.update (duration); mObjects.update (duration);
@ -339,7 +354,6 @@ void RenderingManager::update (float duration){
); );
mWater->update(duration); mWater->update(duration);
} }
mPlayer->update(duration);
} }
void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){ void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){